freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

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

利用Java快速搭建一个DNSLog平台
训牛高手 2023-03-22 22:07:35 130180
所属地 广东省

我们在渗透测试过程中常利用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

完整配置如下图,子域名如何命名无限制,主要看解析指向和记录类型。

image-20230313220116980

三、部署应用

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

image-20230313221540120

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

image.png

登录http://abc.com查看结果
如果查询到数据说明DNSLog已经成功部署

image-20230313224923493

关闭服务

查询正在运行的java进程

ps -ef|grep java

杀死进程,***代指进程ID

kill -9 ***

image-20230313222051449

第二部分 代码解析

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;
}

完整代码

gitee:https://gitee.com/gui_collar/fidnslog-fast

github:https://github.com/fiblue/FiDNSLog

# 渗透测试 # 黑客 # web安全 # 内网渗透 # 网络安全技术
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 训牛高手 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
训牛高手 LV.3
练习时长两年半的代码审计砖家。
  • 5 文章数
  • 14 关注者
Gitee 榜首 | 某热门开源工作流引擎RCE漏洞分析
2024-01-17
渗透测试 | 对Austin系统进行代码审计并利用文件读写漏洞实现Getshell
2024-01-10
关于LinkWeChat的一次代码审计记录
2023-12-04
文章目录