吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9069|回复: 99
收起左侧

[Android 原创] 利用DNS欺骗绕过抓包检测

    [复制链接]
k452b 发表于 2023-10-8 22:39
本帖最后由 k452b 于 2023-10-10 11:05 编辑

利用DNS欺骗绕过抓包检测

昨天帖子被管理删了,现在重发

情况说明

IOS某软件的代-理检测,无论使用WiFi的代-理还是威屁~恩都会显示如下图,并且点击后自动退出软件。

我们通过某种方式知道了软件的API服务器为v3-api.china-****.cn,我们需要抓包的就是这个网址。

1.png

DNS欺骗示例图

2.png

客户端使用自建的DNS服务器,DNS服务器返回我们反向代-理后的虚假的网站。

目录

需要python环境

1.自建DNS服务器

2.自建反向代-理网站

3.反向代-理网站自签名SSL证书

4.手机上的设置

1.自建DNS服务器

获取本机IP

我们先用cmd的ipconfig命令获取本机的内网地址

3.png

搭建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

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

5.png

2.自建反向代-理网站

安装依赖

直接下载我提供的包,解压后在目录下打开cmd使用pip install -r requirements.txt安装依赖包

直接打开app.py运行成功后打开 http://127.0.0.1,如果成功打开,那就代表反向代-理成功了。

下载地址

运行app.py

6.png

修改配置

我们需要修改项目中的app.py文件,让项目代-理到我们想要抓包的网站。

修改反向代-理的网站后,因为我们需要抓包,所以服务器还得经过我们的Fiddler代-理,修改后的代码如下。

7.png

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

7-1.png

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

8.png

9.png

3.反向代-理网站自签名SSL证书

虽然成功反向代-理了api服务器的网站,但是在软件客户端使用了HTTPS协议加密,我们需要自签名证书然后设备信任后才可以访问。

这里我们先自签名反向代-理网站的证书。

我们需要使用另外一个工具mkcert 下载地址

生成自签证书

解压mkcert.exe文件到文件夹后,用cmd打开当前目录,输入命令生成证书。

在控制台中命令行输入: mkcert.exe v3-api.china-****.cn

10.png

服务器配置证书

生成了./v3-api.china-****.cn.pem证书文件和./v3-api.china-****.cn-key.pem私钥文件

把这两个文件更名成server.pemserver-key.pem并移动到反向代-理服务器的目录下。

11.png

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

12.png

发放证书

现在局域网访问测试地址会出现警告页面,我们把CA证书给手机客户端安装就可以了。

命令行查看mkcert的CA证书所在位置

命令行输入:mkcert -CAROOT

13.png

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

14.png

4.手机客户端上的设置

信任证书

我们上面的rootCA.pem发送到手机,安装并信任,安卓的话另外百度搜索。

15.png

16.png

设置DNS服务器

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

18.png

完成

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

DNS服务器

19.png

反向代-理服务器

19-1.png

Fiddler

20.png

数据修改

21.png

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

18.png

免费评分

参与人数 28威望 +1 吾爱币 +46 热心值 +24 收起 理由
junjia215 + 1 + 1 谢谢@Thanks!
junjunjs + 1 + 1 谢谢@Thanks! 虽然不懂,但谢谢楼主,学习原理了。
qingguang + 1 + 1 谢谢@Thanks!
心睡 + 1 我很赞同!
BrightMrW + 1 我很赞同!
supercilious + 1 + 1 鼓励转贴优秀软件安全工具和文档!
zhixiangwangluo + 1 + 1 谢谢@Thanks!
YI0IX + 1 + 1 谢谢@Thanks!
601541027 + 1 + 1 现在抓个包好累啊
lingyun011 + 1 + 1 热心回复!
allspark + 1 + 1 用心讨论,共获提升!
JokerX + 1 + 1 谢谢@Thanks!
www0313 + 1 + 1 谢谢@Thanks!
抱歉、 + 1 谢谢@Thanks!
tianyu925 + 1 我很赞同!
99910369 + 1 + 1 热心回复!
正己 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
唐小样儿 + 1 + 1 热心回复!
杨辣子 + 1 + 1 用心讨论,共获提升!
mumarc + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
tomhex + 1 + 1 我很赞同!
江男 + 1 + 1 谢谢@Thanks!
klxx1314520 + 1 + 1 我很赞同!
i8o2eu + 1 趣智校园用小黄鸟就可以检测不到,电脑端就不清楚了
52pojie666z + 1 + 1 热心回复!
shuaiqi + 1 + 1 我很赞同!
debug_cat + 1 + 1 谢谢@Thanks!
蜀黍说不能太长 + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

bdzwater 发表于 2023-10-9 15:29
其实核心部分可以使用charles实现,但对于https类网站都需要安装根证书才行,像安卓装根证书就必须ROOT,装不上根证书,基本就是抓不到数据的(非安全网络),服务端可以使用passwall类软路由,不需要做任何DNS劫持,只要添加一个charles的透明代{过}{滤}理节点就行了,至于拦到数据包了,想怎么使用就是charles的事情了,这个还是很强大的,我经常使用其中的Map Remote功能,可以将感兴趣的请求URL,直接转发到自己的http服务器,好处就是这里面就不需要再用https了,自由度更大,这样做的好处就是对于手机来说,只要装一个根证书,其它的全部服务端搞定,根本不需要DNS劫持
Hmily 发表于 2023-10-9 12:22
首先你这不是软件,不应该发原创区,我给你移动了,其次你图片粘贴有问题,MD可以用论坛附件上传插入,不能这么引用临时地址,很快会失效,看这个编辑一下:https://www.52pojie.cn/misc.php? ... 29&messageid=36

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
1yttoni + 1 + 1 我很赞同!

查看全部评分

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

现成的完整的教程应该是没有的,但你可以先熟悉一下charles的使用,等这个会用了,后面就是如何打通环节的问题,软路由方面使用passwall新建一个分流策略,然后将默认节点设置为这个charles节点(开启socket透明代{过}{滤}理),然后在访问控制里面将自己手机的MAC加入即可,这样所有的流量访问都会经过这个charles节点,只需要手机端安装charles根证书即可
z7311873 发表于 2023-10-10 05:46
本质相当于把要抓的 `手机和原服务器的包`  替换为 `手机和代{过}{滤}理服务器(自己pc端)` 之间的包了 对么?

我看你截图中 手机中已经信任了抓包软件的证书,即使这样 ,网站也会检测到你使用了代{过}{滤}理么?
二师兄。 发表于 2023-10-9 13:34
选择干掉检测
蜀黍说不能太长 发表于 2023-10-9 12:39
大佬啊,之前只看到过有越狱后的插件,这个方法虽然看着繁琐,但是对小白还是很实用
 楼主| k452b 发表于 2023-10-9 12:56
Hmily 发表于 2023-10-9 12:22
首先你这不是软件,不应该发原创区,我给你移动了,其次你图片粘贴有问题,MD可以用论坛附件上传插入,不能 ...

好的谢谢

点评

现在就把图片改一下,不然很快会失效。  详情 回复 发表于 2023-10-9 14:15
Hmily 发表于 2023-10-9 14:15

现在就把图片改一下,不然很快会失效。
BLUE7777777 发表于 2023-10-9 15:20
这个只能一个个域名添加,有些繁琐,期待能有支持全域名的方法。
wzyl 发表于 2023-10-9 15:51
小白跟着一起学习一下 争取早日跟大佬一样厉害
cgzrjl 发表于 2023-10-9 16:21
适用范围不大  不过思路不错
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-26 01:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表