wallbreaker easy
这道题在比赛的时候专注在imagick上面,但是由于是最新版本,以前的bypass漏洞已经修补。。。之后由于复试的原因没有仔细研究,现在开始复现。
这道题给了一个webshell,密码是backdoor,可以直接用菜刀连接,然而用phpinfo查看禁用函数,发现已经把所有执行命令的函数都ban了,并且知道操作系统是ubuntu18.04.
所以这是一个受限制的webshell绕过disable_function
的问题
bypass disable_function的方法
绕过disable_function
也是一个老生常谈的问题了。总结一下大概有一下四种:
- 攻击后端组件,寻找存在命令注入的、web 应用常用的后端组件,如,ImageMagick 的魔图漏洞、bash 的破壳漏洞
- 寻找未禁用的漏网函数,常见的执行命令的函数有
system()
、exec()
、shell_exec()
、passthru()
,偏僻的popen()
、proc_open()
、pcntl_exec()
,逐一尝试,或许有漏网之鱼 - mod_cgi 模式,尝试修改 .htaccess,调整请求访问路由,绕过 php.ini 中的任何限制
- 利用环境变量
LD_PRELOAD
劫持系统函数,让外部程序加载恶意 *.so,达到执行系统命令的效果
这里由于题目的提示,我们知道php没有多余的组件。也没有漏网之鱼,同时也没有mod_cgi。那么剩下的就是LD_PRELOAD
劫持函数的方法了。
这个一个动态链接的环境变量,在我们执行程序的时候会优先加载这个变量中的动态函数库,如果这个里面有程序用到的库函数就会调用,这样的话我们就可以劫持库函数执行恶意操作。
劫持库函数
这里由于要先设置环境变量,那么触发的函数必须要能启用外部程序才行,这样才会有调用动态库的情况。比如php中的mail()
可以看到调用了外部程序sendmail
,这里的经典方法是劫持getuid()
,因为sendmail
会调用这个函数,但是这里会出现一些问题,如果没有sendmail
或者禁用了,这就不会有外部程序运行,当然我们劫持的函数也无法执行。
这里有一种更进一步的利用方法,就是使用__attribute__ ((__constructor__))
1 |
|
这个东西会在共享库装载的时候触发执行,这样一来只要有额外的外部程序执行就可以利用。我们就得到一种更通用的劫持执行的方法。
解决外部程序调用
可惜的是题目禁用了mail
,看来只能另辟蹊径了。结合题目给的hint,看来是要使用imagick
作为突破了。查看php-imagick源码
https://github.com/ImageMagick/ImageMagick
从这个网站 https://imagemagick.org/script/formats.php 中可以看到各种格式的文件会调用不同的程序,所以构造一个能够调用额外程序的相应的文件即可。同时可以使用strace -f php xxx.php 2>&1 | grep execve
来验证程序有外部调用。
这里选择了调用ghostscript
的eps文件。注意:必须要有相关文件的文件头才行。这里打算通过反弹shell来执行readflag的操作。
1 |
|
将其编译成共享库 gcc -shared -fPIC evil.c -o evil.so
,如果是要编译成32位的加上-m32
1 | import requests |
在vps上监听,随后执行脚本,可以看到上传成功的话里面会有上传文件的大小混在网页html中。
最后在根目录下拿到flag。
题目之外
其实我们可以走的更远,这里只是劫持了库函数执行我们的恶意代码,但是也可以在执行完恶意代码后再执行正常的库函数,这样以假乱真,效果更棒:)
Ghost Pepper
打开题目看到有一个basic认证,其实这里是可以爆破的,得到密码karaf:karaf
,当然我是事后才知道的,看writeup有的人是根据 https://karaf.apache.org/manual/latest/webconsole ,也有的人是根据jetty的默认凭证。
成功认证之后是得到一个404的页面,这里根据Ghost Pepper
猜到jolokia
路径,这里有点脑洞了,这种路径爆破也出不来。。。在拿到路径之后发现是一个OSGI的api接口。
对于java不是很熟悉,照着writeup一路走,这里用到了jolokia/list
来列举能用的类,返回的json数据美化一下看着更加方便。里面比较有用的就是org.apache.karaf
,能够安装和执行一些jar包,这对我们来说用处很大,只要构造恶意的jar包反弹shell,就能拿到flag了。然而,我垃圾的java功底完全构造不出来。。。
这里采用的另外一个思路,Karaf有一个webconsole,我们可以通过installFeature来安装一个webconsole。
http://111.186.63.207:31337/jolokia/exec/org.apache.karaf:name=root,type=feature/installFeature(java.lang.String)/webconsole
安装之后,访问http://111.186.63.207:31337/system/console/gogo
直接可以执行命令,拿到flag
Reference
https://www.freebuf.com/articles/web/192052.html
https://www.linuxidc.com/Linux/2017-12/149841.htm
https://www.anquanke.com/post/id/175403
https://balsn.tw/ctf_writeup/20190323-0ctf_tctf2019quals/#ghost-pepper
https://github.com/p4-team/ctf/tree/master/2019-03-23-0ctf-quals/web_osgi
https://fireshellsecurity.team/0ctf-ghost-pepper/
https://github.com/p4-team/ctf/tree/master/2019-03-23-0ctf-quals/web_osgi
http://momomoxiaoxi.com/2019/03/26/tctf2019/#wallbreaker-easy