freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

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

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

FreeBuf+小程序

FreeBuf+小程序

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

我们在渗透测试过程中常利用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安全 # 内网渗透 # 网络安全技术
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录