利用DNS欺骗绕过抓包检测

查看 78|回复 11
作者:k452b   
利用DNS欺骗绕过抓包检测
昨天帖子被管理删了,现在重发
情况说明
IOS某软件的代-理检测,无论使用WiFi的代-理还是威屁~恩都会显示如下图,并且点击后自动退出软件。
我们通过某种方式知道了软件的API服务器为v3-api.china-****.cn,我们需要抓包的就是这个网址。


1.png (115.98 KB, 下载次数: 0)
下载附件
2023-10-10 11:02 上传

DNS欺骗示例图


2.png (149.64 KB, 下载次数: 0)
下载附件
2023-10-10 11:02 上传

客户端使用自建的DNS服务器,DNS服务器返回我们反向代-理后的虚假的网站。
目录
需要python环境
1.自建DNS服务器
2.自建反向代-理网站
3.反向代-理网站自签名SSL证书
4.手机上的设置
1.自建DNS服务器
获取本机IP
我们先用cmd的ipconfig命令获取本机的内网地址


3.png (75.39 KB, 下载次数: 0)
下载附件
2023-10-10 11:02 上传

搭建DNS服务器
简单写了个python的代码,复制以下代码然后保存成.py文件,并修改需要代-理的网站和内网IP。
import logging
import socket
from dns.resolver import Resolver
from dnslib import DNSRecord, QTYPE, RD, SOA, DNSHeader, RR, A
class DNSServe(object):
    mydns = {}
    def __init__(self,dns1="119.29.29.29",dns2="114.114.114.114"):
        self.dns_resolver = Resolver()
        self.dns_resolver.nameservers = [dns1, dns2]
        self.udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.udp_sock.bind(('', 53))
        LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"
        logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT)
        logging.info('dns server is started')
    def start(self):
        while True:
            message, address = self.udp_sock.recvfrom(8192)
            self.dns_handler(self.udp_sock, message, address)
    def add_dns(self,domain, ip):
        self.mydns.update({domain: ip})
        logging.info(f'添加记录成功\t"{domain}":"{ip}"')
    def get_ip_from_domain(self,domain):
        domain = domain.lower().strip()
        try:
            if domain in self.mydns:
                dns = self.mydns.get(domain)
            else:
                dns = self.dns_resolver.resolve(domain, 'A')[0].to_text()
            return dns
        except:
            return None
    def reply_for_not_found(self,income_record):
        header = DNSHeader(id=income_record.header.id, bitmap=income_record.header.bitmap, qr=1)
        header.set_rcode(0)  # 3 DNS_R_NXDOMAIN, 2 DNS_R_SERVFAIL, 0 DNS_R_NOERROR
        record = DNSRecord(header, q=income_record.q)
        return record
    def reply_for_A(self,income_record, ip, ttl=None):
        r_data = A(ip)
        header = DNSHeader(id=income_record.header.id, bitmap=income_record.header.bitmap, qr=1)
        domain = income_record.q.qname
        query_type_int = QTYPE.reverse.get('A') or income_record.q.qtype
        record = DNSRecord(header, q=income_record.q, a=RR(domain, query_type_int, rdata=r_data, ttl=ttl))
        return record
    def dns_handler(self,s, message, address):
        try:
            income_record = DNSRecord.parse(message)
        except:
            logging.error('from %s, parse error' % address)
            return
        try:
            qtype = QTYPE.get(income_record.q.qtype)
        except:
            qtype = 'unknown'
        domain = str(income_record.q.qname).strip('.')
        info = '%s -- %s, from %s' % (qtype, domain, address)
        if qtype == 'A':
            ip = self.get_ip_from_domain(domain)
            if ip:
                response = self.reply_for_A(income_record, ip=ip, ttl=60)
                s.sendto(response.pack(), address)
                return logging.info(info)
        # at last
        response = self.reply_for_not_found(income_record)
        s.sendto(response.pack(), address)
        logging.info(info)
if __name__ == '__main__':
    server = DNSServe()
    # 添加DNS记录
    server.add_dns('baidu.com', '2.2.2.2')
    server.add_dns('v3-api.china-****.cn', '192.168.8.102')
    # 开始启动
    server.start()
只要在server.add_dns('baidu.com', '2.2.2.2')下面增加代码就行。
v3-api.china-****.cn就是需要代-理软件的API服务器,192.168.8.102是上面获取的内网地址。
启动DNS服务器后,本机电脑使用cmd的nslookup命令测试一下DNS服务器是否正常运行。
启动DNS服务器


4.png (26.7 KB, 下载次数: 0)
下载附件
2023-10-10 11:02 上传

使用cmd的nslookup命令指定自建dns服务器获取的记录


5.png (21.76 KB, 下载次数: 0)
下载附件
2023-10-10 11:02 上传

2.自建反向代-理网站
安装依赖
直接下载我提供的包,解压后在目录下打开cmd使用pip install -r requirements.txt安装依赖包
直接打开app.py运行成功后打开 http://127.0.0.1,如果成功打开,那就代表反向代-理成功了。
下载地址
运行app.py


6.png (130.59 KB, 下载次数: 0)
下载附件
2023-10-10 11:02 上传

修改配置
我们需要修改项目中的app.py文件,让项目代-理到我们想要抓包的网站。
修改反向代-理的网站后,因为我们需要抓包,所以服务器还得经过我们的Fiddler代-理,修改后的代码如下。


7.png (47.83 KB, 下载次数: 0)
下载附件
2023-10-10 11:02 上传

打开Fiddler需要把捕获通信关闭,否则无法正常使用。


7-1.png (46.74 KB, 下载次数: 0)
下载附件
2023-10-10 11:02 上传

重新运行app.py,再次访问http://127.0.0.1,Fiddler出现抓包的数据


8.png (12.91 KB, 下载次数: 0)
下载附件
2023-10-10 11:02 上传



9.png (26.89 KB, 下载次数: 0)
下载附件
2023-10-10 11:02 上传

3.反向代-理网站自签名SSL证书
虽然成功反向代-理了api服务器的网站,但是在软件客户端使用了HTTPS协议加密,我们需要自签名证书然后设备信任后才可以访问。
这里我们先自签名反向代-理网站的证书。
我们需要使用另外一个工具mkcert 下载地址
生成自签证书
解压mkcert.exe文件到文件夹后,用cmd打开当前目录,输入命令生成证书。
在控制台中命令行输入: mkcert.exe v3-api.china-****.cn


10.png (165.88 KB, 下载次数: 0)
下载附件
2023-10-10 11:02 上传

服务器配置证书
生成了./v3-api.china-****.cn.pem证书文件和./v3-api.china-****.cn-key.pem私钥文件
把这两个文件更名成server.pem和server-key.pem并移动到反向代-理服务器的目录下。


11.png (21.81 KB, 下载次数: 0)
下载附件
2023-10-10 11:02 上传

修改文件app.py,把代码替换成app.run(host='0.0.0.0', port=443, ssl_context=('server.pem', 'server-key.pem'))


12.png (166.49 KB, 下载次数: 0)
下载附件
2023-10-10 11:02 上传

发放证书
现在局域网访问测试地址会出现警告页面,我们把CA证书给手机客户端安装就可以了。
命令行查看mkcert的CA证书所在位置
命令行输入:mkcert -CAROOT


13.png (20.12 KB, 下载次数: 0)
下载附件
2023-10-10 11:02 上传

打开这个目录我们就可以看到CA证书了。


14.png (20.31 KB, 下载次数: 1)
下载附件
2023-10-10 11:02 上传

4.手机客户端上的设置
信任证书
我们上面的rootCA.pem发送到手机,安装并信任,安卓的话另外百度搜索。


15.png (44.04 KB, 下载次数: 0)
下载附件
2023-10-10 11:04 上传



16.png (56.92 KB, 下载次数: 1)
下载附件
2023-10-10 11:02 上传

设置DNS服务器
保持iPhone和电脑主机在同一局域网里,并且DNS服务器和反向代-理服务器和Fiddler都打开,打开无线局域网-WiFi名感叹号-配置DNS-手动,多余的DNS删掉,把我们内网的IP填入进去,点击存储。


18.png (34.76 KB, 下载次数: 0)
下载附件
2023-10-10 11:02 上传

完成
最后我们打开之前不能使用抓包的网站,可以看到成功打开了,同时DNS服务器,反向代-理服务器,还有Fiddler都有数据产生,接下来大家就可以自由发挥了
DNS服务器


19.png (100.54 KB, 下载次数: 0)
下载附件
2023-10-10 11:02 上传

反向代-理服务器


19-1.png (112.6 KB, 下载次数: 0)
下载附件
2023-10-10 11:05 上传

Fiddler


20.png (88.72 KB, 下载次数: 0)
下载附件
2023-10-10 11:03 上传

数据修改


21.png (114.19 KB, 下载次数: 0)
下载附件
2023-10-10 11:03 上传

此方法只是提供一种思路,实际上这种方式繁琐且无法过双向证书认证的app,如果有更好的方法,麻烦与我分享

下载次数, 服务器

bdzwater   

其实核心部分可以使用charles实现,但对于https类网站都需要安装根证书才行,像安卓装根证书就必须ROOT,装不上根证书,基本就是抓不到数据的(非安全网络),服务端可以使用passwall类软路由,不需要做任何DNS劫持,只要添加一个charles的透明代{过}{滤}理节点就行了,至于拦到数据包了,想怎么使用就是charles的事情了,这个还是很强大的,我经常使用其中的Map Remote功能,可以将感兴趣的请求URL,直接转发到自己的http服务器,好处就是这里面就不需要再用https了,自由度更大,这样做的好处就是对于手机来说,只要装一个根证书,其它的全部服务端搞定,根本不需要DNS劫持
bdzwater   

首先你这不是软件,不应该发原创区,我给你移动了,其次你图片粘贴有问题,MD可以用论坛附件上传插入,不能这么引用临时地址,很快会失效,看这个编辑一下:https://www.52pojie.cn/misc.php? ... 29&messageid=36
z7311873   


岁月bm123 发表于 2023-10-9 21:25
有没有类似的帖子学习一下,我好几年前遇到过类似的问题一直无解,看完你讲的感觉很靠谱

现成的完整的教程应该是没有的,但你可以先熟悉一下charles的使用,等这个会用了,后面就是如何打通环节的问题,软路由方面使用passwall新建一个分流策略,然后将默认节点设置为这个charles节点(开启socket透明代{过}{滤}理),然后在访问控制里面将自己手机的MAC加入即可,这样所有的流量访问都会经过这个charles节点,只需要手机端安装charles根证书即可
二师兄。   

本质相当于把要抓的 `手机和原服务器的包`  替换为 `手机和代{过}{滤}理服务器(自己pc端)` 之间的包了 对么?
我看你截图中 手机中已经信任了抓包软件的证书,即使这样 ,网站也会检测到你使用了代{过}{滤}理么?
蜀黍说不能太长   

选择干掉检测
k452b
OP
  

大佬啊,之前只看到过有越狱后的插件,这个方法虽然看着繁琐,但是对小白还是很实用
BLUE7777777   


Hmily 发表于 2023-10-9 12:22
首先你这不是软件,不应该发原创区,我给你移动了,其次你图片粘贴有问题,MD可以用论坛附件上传插入,不能 ...

好的谢谢
wzyl   


k452b 发表于 2023-10-9 12:56
好的谢谢

现在就把图片改一下,不然很快会失效。
cgzrjl   

这个只能一个个域名添加,有些繁琐,期待能有支持全域名的方法。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部