训牛高手
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9

我们在渗透测试过程中常利用DNSLog来进行盲打回显,但公有的DNSLog平台通常都已经被封杀殆尽,此时构建一个属于自己的DNSLog平台就显得尤为必要。虽然网上也有一些现成的源码,但多数是使用GO和Python写的,或者构建起来较为复杂,为了满足强迫症,本人决定用Java写一个不需要对接MySQL和Redis的DNSLog平台,以下将对构建过程进行详细的介绍。
第一部分 搭建
为了满足部分同学不想看代码的需求,我把搭建部分放在前边。
一、准备环境:
1.一个云服务器(88.88.88.88)
2.一个域名(abc.com)
3.Java 8环境
4.Xshell(可选)
5.Xftp(可选)
二、域名绑定
1.将主域名解析到云服务器IP
记录类型:A
abc.com>88.88.88.88
2.将DNS域名绑定到云服务器IP
新增:dns.abc.com
记录类型:A
dns.abc.com>88.88.88.88
3.将你要ping的地址指向DNS域名
新增:p5.abc.com
记录类型:NS
p5.abc.com>dns.abc.com
完整配置如下图,子域名如何命名无限制,主要看解析指向和记录类型。
三、部署应用
1.连接服务器,本人用Xshell
2.安装JDK 1.8
先查看java版本,如果已经安装则不需要再安装
java -version
更新软件包:
yum update
查看yum库中的java安装包 :
yum -y list java*
安装需要的jdk版本的所有java程序:
yum -y install java-1.8.0-openjdk*
等待安装完成即可。
3.使用Xftp连接服务器
新建一个web目录
将jar包上传到目录中
jar下载地址:https://web-1259107904.cos.ap-guangzhou.myqcloud.com/web-0.0.1-SNAPSHOT.jar
4.运行程序
关闭53端口占用
sudo systemctl stop systemd-resolved
后台运行jar包
nohup java -jar web-0.0.1-SNAPSHOT.jar > root.log 2>&1 &
打开命令操作面板
ping p5.abc.com
登录http://abc.com查看结果
如果查询到数据说明DNSLog已经成功部署
关闭服务
查询正在运行的java进程
ps -ef|grep java
杀死进程,***代指进程ID
kill -9 ***
第二部分 代码解析
1.原理解释
DNSLog平台的原理主要为监听53端口,解析数据包,记录数据并作出响应,其实也可以不响应。所以我们利用SpringBoot搭建一个监听53端口的服务即可。
2.监听53端口
private void Listener(int port) throws SocketException {
log.info("===========UDPListener Start> port:"+port+ "===========");
while (true) {
byte[] buffer = new byte[maxUdpDataSize];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
try {
socket.receive(packet);
buffer = packet.getData();
Message message=new Message(buffer);
Record record=message.getQuestion();
String name=record.getName().toString();
InetAddress address = packet.getAddress();
String ip = address.getHostAddress();
int targetPort = packet.getPort();
//String content=DatatypeConverter.printHexBinary(buffer);
if(!ip.equals("127.0.0.1")&&!ip.isEmpty()&&ip!=null){
DNSLogRecorder.setDNSLog(ip,name.substring(0,name.length()-1).toLowerCase());
}
answer(message,address,targetPort);
log.info("receive new UDPMessage>"+ " ip:"+ip+" port:"+targetPort+" name:"+name);
} catch (IOException e) {
log.error(e.getMessage());
}
}
}
3.记录数据
public static void setDNSLog(String ip,String domain) {
UDPInfo udpInfo=new UDPInfo();
Long time = System.currentTimeMillis();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = formatter.format(time);
udpInfo.setIp(ip);
udpInfo.setDomain(domain);
udpInfo.setDate(date);
if(list.size()>=10){
list.remove(9);
}
list.add(0,udpInfo);
}
4.响应DNS解析请求
private static void answer(Message message,InetAddress sourceAddress,int sourcePort) throws IOException {
Record record=message.getQuestion();
String addressIP="127.0.0.1";
InetAddress answerIpAddr = Address.getByAddress(addressIP);//域名
answerIpAddr.getCanonicalHostName();
Message answerMessage =message.clone();
Record answer = new ARecord(record.getName(), record.getDClass(), 64, answerIpAddr);
answerMessage.addRecord(answer, Section.ANSWER);
byte[] buff = answerMessage.toWire();
DatagramPacket response = new DatagramPacket(buff, buff.length, sourceAddress, sourcePort);
socket.send(response);
log.info("answer>"+"Address:"+sourceAddress.getAddress().toString()+","+"HostAddress:"+answerIpAddr.getHostAddress()+","+"HostName:"+answerIpAddr.getHostName());
}
5.读取数据
接口
@ResponseBody
@RequestMapping("/queryDNSLog")
public String queryDNSLog(){
// List<UDPInfo> udpInfos=udpService.selectUDPInfo();
List<UDPInfo> udpInfos= DNSLogRecorder.getDNSLog();
String json=null;
if (!udpInfos.isEmpty()){
resultMessage.setCode("200");
resultMessage.setMessage("success!");
resultMessage.setData(udpInfos);
}
else {
resultMessage.setCode("400");
resultMessage.setMessage("data is null!");
log.info("data is null");
}
json= JSON.toJSONString(resultMessage);
return json;
}
getDNSLog()
public static List<UDPInfo> getDNSLog() {
list = list.stream().collect(Collectors.toList());
return list;
}
完整代码
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)