利用DNS欺骗绕过抓包检测
本帖最后由 k452b 于 2023-10-10 11:05 编辑# 利用DNS欺骗绕过抓包检测
# 昨天帖子被管理删了,现在重发
# 情况说明
IOS某软件的代-理检测,无论使用WiFi的代-理还是威屁~恩都会显示如下图,并且点击后自动退出软件。
我们通过某种方式知道了软件的API服务器为`v3-api.china-****.cn`,我们需要抓包的就是这个网址。
#### DNS欺骗示例图
客户端使用自建的DNS服务器,DNS服务器返回我们反向代-理后的虚假的网站。
# 目录
`需要python环境`
1.自建DNS服务器
2.自建反向代-理网站
3.反向代-理网站自签名SSL证书
4.手机上的设置
# 1.自建DNS服务器
## 获取本机IP
我们先用cmd的`ipconfig`命令获取本机的内网地址
## 搭建DNS服务器
简单写了个python的代码,复制以下代码然后保存成`.py`文件,并修改需要代-理的网站和内网IP。
```python
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 =
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').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服务器
##### 使用cmd的nslookup命令指定自建dns服务器获取的记录
# 2.自建反向代-理网站
## 安装依赖
直接下载我提供的包,解压后在目录下打开cmd使用`pip install -r requirements.txt `安装依赖包
直接打开`app.py`运行成功后打开 (http://127.0.0.1),如果成功打开,那就代表反向代-理成功了。
[下载地址](https://ldz2020.lanzoue.com/i1F3N1b6erej)
##### 运行app.py
## 修改配置
我们需要修改项目中的`app.py`文件,让项目代-理到我们想要抓包的网站。
修改反向代-理的网站后,因为我们需要抓包,所以服务器还得经过我们的Fiddler代-理,修改后的代码如下。
打开Fiddler需要把捕获通信关闭,否则无法正常使用。
重新运行`app.py`,再次访问(http://127.0.0.1),Fiddler出现抓包的数据
# 3.反向代-理网站自签名SSL证书
虽然成功反向代-理了api服务器的网站,但是在软件客户端使用了HTTPS协议加密,我们需要自签名证书然后设备信任后才可以访问。
这里我们先自签名反向代-理网站的证书。
我们需要使用另外一个工具` mkcert` [下载地址](https://ldz2020.lanzoue.com/iPg171b38suh)
## 生成自签证书
解压`mkcert.exe`文件到文件夹后,用cmd打开当前目录,输入命令生成证书。
在控制台中命令行输入: `mkcert.exe v3-api.china-****.cn`
## 服务器配置证书
生成了`./v3-api.china-****.cn.pem`证书文件和`./v3-api.china-****.cn-key.pem`私钥文件
把这两个文件更名成`server.pem`和`server-key.pem`并移动到反向代-理服务器的目录下。
修改文件`app.py`,把代码替换成`app.run(host='0.0.0.0', port=443, ssl_context=('server.pem', 'server-key.pem'))`
## 发放证书
现在局域网访问测试地址会出现警告页面,我们把CA证书给手机客户端安装就可以了。
命令行查看mkcert的CA证书所在位置
命令行输入:`mkcert -CAROOT`
打开这个目录我们就可以看到CA证书了。
# 4.手机客户端上的设置
## 信任证书
我们上面的`rootCA.pem`发送到手机,安装并信任,安卓的话另外百度搜索。
## 设置DNS服务器
保持iPhone和电脑主机在同一局域网里,并且DNS服务器和反向代-理服务器和Fiddler都打开,打开无线局域网-WiFi名感叹号-配置DNS-手动,多余的DNS删掉,把我们内网的IP填入进去,点击存储。
## 完成
最后我们打开之前不能使用抓包的网站,可以看到成功打开了,同时DNS服务器,反向代-理服务器,还有Fiddler都有数据产生,接下来大家就可以自由发挥了
##### DNS服务器
##### 反向代-理服务器
##### Fiddler
##### 数据修改
# 此方法只是提供一种思路,实际上这种方式繁琐且无法过双向证书认证的app,如果有更好的方法,麻烦与我分享 其实核心部分可以使用charles实现,但对于https类网站都需要安装根证书才行,像安卓装根证书就必须ROOT,装不上根证书,基本就是抓不到数据的(非安全网络),服务端可以使用passwall类软路由,不需要做任何DNS劫持,只要添加一个charles的透明代{过}{滤}理节点就行了,至于拦到数据包了,想怎么使用就是charles的事情了,这个还是很强大的,我经常使用其中的Map Remote功能,可以将感兴趣的请求URL,直接转发到自己的http服务器,好处就是这里面就不需要再用https了,自由度更大,这样做的好处就是对于手机来说,只要装一个根证书,其它的全部服务端搞定,根本不需要DNS劫持 首先你这不是软件,不应该发原创区,我给你移动了,其次你图片粘贴有问题,MD可以用论坛附件上传插入,不能这么引用临时地址,很快会失效,看这个编辑一下:https://www.52pojie.cn/misc.php?mod=faq&action=faq&id=29&messageid=36 岁月bm123 发表于 2023-10-9 21:25
有没有类似的帖子学习一下,我好几年前遇到过类似的问题一直无解,看完你讲的感觉很靠谱
现成的完整的教程应该是没有的,但你可以先熟悉一下charles的使用,等这个会用了,后面就是如何打通环节的问题,软路由方面使用passwall新建一个分流策略,然后将默认节点设置为这个charles节点(开启socket透明代{过}{滤}理),然后在访问控制里面将自己手机的MAC加入即可,这样所有的流量访问都会经过这个charles节点,只需要手机端安装charles根证书即可 本质相当于把要抓的 `手机和原服务器的包`替换为 `手机和代{过}{滤}理服务器(自己pc端)` 之间的包了 对么?
我看你截图中 手机中已经信任了抓包软件的证书,即使这样 ,网站也会检测到你使用了代{过}{滤}理么? 选择干掉检测{:1_918:} 大佬啊,之前只看到过有越狱后的插件,这个方法虽然看着繁琐,但是对小白还是很实用 Hmily 发表于 2023-10-9 12:22
首先你这不是软件,不应该发原创区,我给你移动了,其次你图片粘贴有问题,MD可以用论坛附件上传插入,不能 ...
好的谢谢 k452b 发表于 2023-10-9 12:56
好的谢谢
现在就把图片改一下,不然很快会失效。 这个只能一个个域名添加,有些繁琐,期待能有支持全域名的方法。 小白跟着一起学习一下 争取早日跟大佬一样厉害{:1_893:} 适用范围不大不过思路不错