垃圾桶

EL PSY CONGROO.

Lz1y's avatar Lz1y

0CTF/TCTF 2019 Qualifier WEB WriteUp 0day x 2

Ghost Pepper

打开题目地址
index
发现有一个基础认证,认证失败后会发现服务容器是Jetty,之前出题人RR大佬在推特透露过这次的web题都是0day,一想到难道是Jetty的无需权限的RCE之类的狠洞…不由的吓得腿抖。平复心情后,熟练的打开burp进行爆破。

然后…Header中可以看到WWW-Authenticate: BASIC realm="karaf"。于是发现基础认证的用户名/密码:karaf/karaf。心中落石,karaf很明显是一个hint,搜索后发现是apache旗下的一款管理工具,可以理解为一个应用的控制面板。一直到目前为止,其实还都是一头雾水,不知道路在何方。而后在karaf Document中发现了一些有意思的东西。

了解一个工具或者项目的时候,最快的方法就是阅读文档了(废话)。文档中介绍了其基本的命令,以及feature的控制。feature是一个重点,其功能类似管理包,可以安装一些第三方的工具,十分方便。
其中最引人注目的,就是webconsole这个feature了。
webconsole

其作用就是启用了一个web界面以用来管理整个容器环境。但是访问该路径,是不存在的,题目并未安装其环境。

我觉得feature这里有搞头,便继续找了一下,突然发现
Jolokia
这特么不是Jolokia吗,早已经把rr师傅博客文章倒背如流的我,瞬间想到了是怎么回事。访问后,该路径确实存在。
路径存在

为了节省时间,我就不背了,直接放出rr师傅的文章:Exploiting Jolokia Agent with Java EE Servers

文章脉络十分简练,其思路之清晰令人胆寒。

文章原方法已经被patch,只能找一条新路

http://111.186.63.207:31337/jolokia/list 这个路径找到可以直接调用的mBean
list

没有排版的JSON杂乱不直观,整理一下

一开始的思路全放在JNDI注入,一直在尝试connector.toJMXConnector这里

但是其实这个方法的属性是没办法修改的,rw为false

"attr":{  
    "Active":{  
        "rw":false,  
        "type":"boolean",  
        "desc":"Attribute exposed for management"  
    },  
    "Address":{  
        "rw":false,  
        "type":"javax.management.remote.JMXServiceURL",  
        "desc":"Attribute exposed for management"  
    },  
    "Attributes":{  
        "rw":false,  
        "type":"java.util.Map",  
        "desc":"Attribute exposed for management"  
    },  
    "ConnectionIds":{  
        "rw":false,  
        "type":"[Ljava.lang.String;",  
        "desc":"Attribute exposed for management"  
    },  
    "MBeanServerForwarder":{  
        "rw":false,  
        "type":"javax.management.remote.MBeanServerForwarder",  
        "desc":"Attribute exposed for management"  
    }  
}  

于是准备继续能够利用的mBean,这时候Muuu Nya师傅突然丢了flag出来…之前看过的webconsole,可以通过installFeature进行安装…恍然大悟,大梦初醒!不得不说太骚了。

"name=root,type=feature":{  
    "op":{  
        "addRepository":Array[2],  
        "installFeature":[  
            {  
                "args":[  
                    {  
                        "name":"p1",  
                        "type":"java.lang.String",  
                        "desc":""  
                    },  
                    {  
                        "name":"p2",  
                        "type":"boolean",  
                        "desc":""  
                    }  
                ],  
                "ret":"void",  
                "desc":"Operation exposed for management"  
            },  
            {  
                "args":[  
                    {  
                        "name":"p1",  
                        "type":"java.lang.String",  
                        "desc":""  
                    },  
                    {  
                        "name":"p2",  
                        "type":"boolean",  
                        "desc":""  
                    },  
                    {  
                        "name":"p3",  
                        "type":"boolean",  
                        "desc":""  
                    }  
                ],  
                "ret":"void",  
                "desc":"Operation exposed for management"  
            },  
            {  
                "args":[  
                    {  
                        "name":"p1",  
                        "type":"java.lang.String",  
                        "desc":""  
                    },  
                    {  
                        "name":"p2",  
                        "type":"java.lang.String",  
                        "desc":""  
                    },  
                    {  
                        "name":"p3",  
                        "type":"boolean",  
                        "desc":""  
                    }  
                ],  
                "ret":"void",  
                "desc":"Operation exposed for management"  
            },  
            {  
                "args":[  
                    {  
                        "name":"p1",  
                        "type":"java.lang.String",  
                        "desc":""  
                    },  
                    {  
                        "name":"p2",  
                        "type":"java.lang.String",  
                        "desc":""  
                    },  
                    {  
                        "name":"p3",  
                        "type":"boolean",  
                        "desc":""  
                    },  
                    {  
                        "name":"p4",  
                        "type":"boolean",  
                        "desc":""  
                    }  
                ],  
                "ret":"void",  
                "desc":"Operation exposed for management"  
            },  
            {  
                "args":[  
                    {  
                        "name":"p1",  
                        "type":"java.lang.String",  
                        "desc":""  
                    },  
                    {  
                        "name":"p2",  
                        "type":"java.lang.String",  
                        "desc":""  
                    }  
                ],  
                "ret":"void",  
                "desc":"Operation exposed for management"  
            },  
            {  
                "args":[  
                    {  
                        "name":"p1",  
                        "type":"java.lang.String",  
                        "desc":""  
                    }  
                ],  
                "ret":"void",  
                "desc":"Operation exposed for management"  
            }  
        ],  

安装了webconsole之后,就可以执行任意命令了,写文章的时候比赛还没有结束,防止别人抄作业,我就不进行演示,只需要知道很牛啤就行了。
niupi

Wallbreaker Easy

这是一道PHP bypass disable_function的题目。

题目明示是关于imagick的,先查看disable_function。
disable_function

限制的比较死,一开始以为是使用ghostscript的1day来作为其上游应用imagick的0day使用。后来尝试了很久发现不对。于是转换思路,发现其并没有禁用putenv()函数,并且系统也为Linux,完全支持bypass_disablefunc_via_LD_PRELOAD这一思路。
现在问题就是需要找到一处能够新开子进程的调用。原文中的mail()已经被禁止,围绕imagick展开研究。

scanf师傅发现在UBUNTU1604中可以使用如下脚本启动一个子程序(下面的代码和图大部分都是scanf师傅的!)

<?php  
$im = new imagick('test.pdf[0]' );  

$im->setImageColorspace(255);  
$im->setCompression(Imagick::COMPRESSION_JPEG);  
$im->setCompressionQuality(100);  
$im->setImageFormat('pdf');  
$im->writeImage('thumb.jpg');  
?>  


(另外还可以直接劫持path)

然而到了UBUNTU1804(题目环境)中,就不行了

经过搜索后,发现这个是因为在UBUNTU1804中,IM添加了一些策略,其存放在/etc/ImageMagick-6/policy.xml中的最后几行

明文禁止了PS、EPI、PDF、XPS这几种格式的转换,也就是无法使用gs转换。
但是后来发现除了这几种格式,还有很多可利用的delegates

https://github.com/ImageMagick/ImageMagick/blob/06e45a6745f6bed140e46d0dadedf796e5dcd9e6/www/source/delegates.xml

这里列出了所有的delegates,可以看到这些转换其实全都是通过command进行的,也就自然而然的存在调用了子程序的行径。

于是只用选出其中一种类型使用Imagick进行转换

scanf师傅太强了

成功调用子程序,这样就可以对子程序进行劫持了。

将恶意的so传上去,并且注册LD_PRELOAD等信息就行了,最后拿到flag。

感言

我还是太菜了,感谢Nu1L的各位师傅带我飞。Orz…