危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2306 浏览20580840

FAST-CGI解析漏洞拿下网站并提权windows系统服务器

作为一个懒散的人,我比较喜欢关注网上发布的漏洞。利用最新的漏洞可以比较简单的得到webshell,然后利用webshell提权拿下服务器,这个是我最喜欢的。有一个很有意思的娱乐网站,我经常登陆浏览,以前就有拿下这个网站的想法,但是用了很多手段都不行。经过前期调查发现,管理员使用的是织梦也就是dede的cms。虽然织梦号称漏洞之王,但是网站的织梦版本比较低,而且管理员已经把cms的代码改动了很多,漏洞没有一个成功的。

一、出现转机

最近听说网站很可能转移了服务器,一次偶尔的404让我发现了它报错的样子很像是IIS7.0,这个就给我带来了曙光。

大家可能都知道,几个月前80sec公布了nginx的一个解析漏洞,就是在非服务器解析的文件(例如图片文件)后面加上/1.php就可以把它解析成php。就可以把log.jpg里面的代码解析成php。后来我在网上看到有大牛的博文说,有漏洞并不是nginx,而是php的FAST-CGI。这样一来IIS也同样可能出现这种漏洞,如果网站是运行在FAS T-CGI模式下的话。

二、付诸实践

于是就拿这个网站的robots文件测试了一下,发现可能存在这个漏洞。当然,这个只是测试而已,得去实际拿webshell。如果管理员设置了上传的文件夹内的文件不允许执行脚本的话,也是无法拿到webshell的。

现在制作有php一句话木马的图片,这里可以利用cmd的copy命令来完成。输入copy/b xxx.jpg+xxx.txt xxx.jpg就可以把txt里面的一句话用二进制的方式插进图片中,而且不影响图片的完整性。我在txt里面多加了一行<?是为了让一句话在第二行,有时候解析不能的话可以尝试回车一下换行。

然后是注册一个账号,把带有php一句话木马的图片上传上去。上传比较简单,点击发表文章里面就自带了一个FCKeditor编辑器,我们可以利用它来上传图片。

上传好后,把这个链接加上/1.php,放到一句话木马客户端去执行就可以了。由于解析的是图片,回显也是包含在图片里的,所以我们看不到文字的回显。我上传这个一句话也只是为了上传我的webshell,所以有没有回显无所谓。使用一句话木马客户端,选择上传文件来上传我的webshell。我还遇到过上传的图片可以显示,而且在图片的下方一样有正常的回显内容,这样的情况。

拿到webshell后就可以输入密码,登陆进去了。但是我的webshell不知怎么出现里奇怪的乱码,很多功能都无法使用。经过反复尝试,只有一个没有加密的英文的webshell可以完整的解析。

三、尝试提权

到这里我就顺利的拿到网站webshell,但是这只是开始,真正有趣的是提权的部分了。提权的方式有很多种,我喜欢先收集信息再确认用哪种方法提权。很多菜鸟提权就喜欢随便的乱运行漏洞exp,其实有目的的提权才是最明智的。有时候有的exp可能导致杀毒软件报警,从而让管理员发现你,这样你的提权之路就完结了。

首先,我可以确认可能利用mysql的root账号来提权(织梦的漏洞使我弄到webshell很多,其中提权成功率最高的就是利用mysql来进行提权)。然后,来看看服务器是否支持asp、aspx(aspx的webshell的权限是user,提权成功率更高),随便传个asp、aspx的webshell来检测是不是能运行就可以了。不过可惜的是都不支持,再来运行cmd命令收集信息。点击webshell的Execute Command功能进去就可以执行cmd命令,我用了一个whoami来测试是否可以运行cmd命令。

给大家一些常用的提权使用到的cmd命令。使用systeminfo可以查看服务器的一些信息,net start可以查看全部的服务,tasklist可以看全部的进程,netstat -an可以查看端口。通过收集信息,发现服务器还安装了Serv-U,而且还查看到端口43958打开着。  

虽然确认可能用Serv-U提权,但是我这个webshell里面没自带Serv-U提权的功能,而有提权功能的webshell无法完整解析。这时候就可以利用php代码执行,这个平时很少用到的webshell的功能。点击Eval PHP Code来运行这个功能。Webshell的作者给我们提供了些代码,我选择Serv-U-Exp.txt这个提权代码来运行。

根据代码的提示,$sucon\='net user s4t s4t /add';运行的就是cmd的命令:可以根据具体的需要进行修改。我运行了一个命令来建立账户并把它添加到管理员中,可以看到回显是成功的。一般来说基本到这里就已经提权成功了,但是我用net user命令查看了一下用户,发现并没有出现anteer这个管理员用户。原因有很多,可能密码作了安全组策略长度不够,或者net user命令被禁用,无法添加账号。

Serv-U提权最大的问题就是无法回显cmd命令的内容,所以盲目的去试不如去用mysql提权。因为很有经验,我直接去找了数据库的配置文件,并且在里面发现root的密码。这里给大家介绍一下找mysql数据库root账号的技巧。含有mysql的数据库账号和密码的文件一般保存在网站的数据库配置文件,可以到网上直接百度搜索,例如“织梦cms数据库配置文件”。用webshell浏览网站的文件,多注意含有inc,config,include,data等字样的文件和文件夹。看到可疑的文件,就利用webshell的编辑功能查看里面的内容。特别指出的是,管理员可能把root用户名改成其他的了,如果找到不是root的用户名和密码也可以尝试去提权。

但是上传mysql提权用的exp和我自己加密的中文webshell一样,发现都不能完整的解析。换了大概6个左右的exp,我放弃直接用工具来提权的方法。

记得以前在网上看到用手工来提权mysql的方法,现在终于派上用场了。这个方法不是原创的,但是我写的更详细。使用这种方法要先连接上mysql数据库。点击webshell的MySQL Manager功能,输入root的密码,点击连接就可以了,然后选择mysql这个数据库。而且我们还发现有一个information_schema库,可以判断mysql版本在5及以上。这样我们提权导出的udf.dll就必须导出到mysql的安装目录下。

第一步是建立一个表CREATE TABLE Temp_Tab(udf BLOB);可以看出有回显。

第二步是把udf.dll的数据写进表里INSERT INTO Temp_Tab VALUES(CONVERT(udf的代码,CHAR);这一步是比较重要的,第二步的代码是我提供给大家的。可以看到回显的结果。

第三步就是导出udf了,注意要导到mysql安装目录,lib目录下的plugin目录里。

SELECT udf FROM Temp_Tab INTO DUMPFILE ‘X:\\MySQL Server 5.1\\lib\\plugin\\udf.dll’;

这个具体的要看管理员把mysq程序安装在什么地方了,回显结果。

第四步注册函数,如果有杀软的话可能注册失败CREATE FUNCTION cmdshell RETURNS string SONAME 'udf.d' 

第五步就可以运行cmd命令了SELECT cmdshell("cmd命令这里")使用whoami来判断一下权限,直接就是system最高权限了。

提权结束后可以运行命令删除这些内容。

现在再来运行一下建立账户的命令,发现没有命令执行成功的回显。

先尝试下复杂的密码,但是这时候出现一个奇怪的现象。出现了一个提示:输入的密码超过了14个字符,无论运行什么都是这个提示。

这时候显然是由于cmd不是反弹本地执行的原因,输入Y也没用。一般的就只能等管理员重启了,但是我想到一个方法。我使用Serv-U提权来结束全部的cmd进程,这样就可以继续运行cmd命令了。使用的cmd命令为:taskkill /f /im cmd.exe。

这样的话就只有启用guest,然后再给它加个复杂的密码,再把它加入到管理员组中去。

终于提权成功,最后我们就可以远程桌面登陆上去了。

肯定有人奇怪既然能Serv-U提权,为什么还很麻烦的用mysql来提权。最简单的原因是这种方法提权比较麻烦需要复制代码,而且Serv-U提权没有cmd的回显。最重要的原因是有时候使用Serv-U提权提权即使显示成功其实还是失败的,用mysql提权可靠性更高。在遇到我这样无法建立账户的尴尬情况(密码组策略限制加14位密码提示),也可以直接运行一个远控上去开控制服务器,不过在有杀软的情况下比较冒险。或者利用copy命令替换掉粘滞键,当然必须是管理员没有禁用粘滞键。

四、小结

这次的提权总的来说还是比较顺利的,最重要的原因是前期信息的搜集能让你有效的去提权。在无法解析一下提权脚本的情况下,利用webshell本身的一些平时不用的功能也可以达到提权的目的,这就是我文章的目的。