我正在拦截 DNS 响应,并希望将答案字段重写为不同的 IP 地址以插入代理。
我基本上是在 DNS 数据结构的深处将一个 IP 地址更改为另一个 IP 地址。 底部的程序实际上演示了该行为。
但是操作前的dns包长度是401,操作后是921。
问题似乎开始于与 mqtt 相对应的字节计数 (0x04) 被 0xc0 替换(在下面的字节分割 [20:40] 处)
我是否以某种方式滥用了 scapy?欢迎提出建议。
mismatch old: 401 new: 921
dns1[0]: b'ac81818000010006000d0000046d7174740b7765'
dns2[0]: b'ac81818000010006000d0000046d7174740b7765'
dns1[20]: b'6174686572666c6f7703636f6d0000010001 c00c'
dns2[20]: b'6174686572666c6f7703636f6d0000010001 046d'
dns1[40]: b'00050001000000e4003c2177656174686572666c'
dns2[40]: b'7174740b77656174686572666c6f7703636f6d00'
import sys
import binascii
import scapy.all as scapy
base_dns = """
ac81818000010006000d0000046d7174740b77656174686572666c6f7703636f
6d0000010001c00c00050001000000e4003c2177656174686572666c6f772d6d
7174742d3930343536396236613839613961643503656c620975732d65617374
2d3109616d617a6f6e617773c01dc032000100010000003c0004369cffb3c032
000100010000003c0004365127ddc032000100010000003c00042cd9c48ec032
000100010000003c0004035c8c32c032000100010000003c000422ee66660000
02000100045d29001401620c726f6f742d73657276657273036e657400000002
000100045d290004016bc0cb000002000100045d2900040166c0cb0000020001
00045d2900040163c0cb000002000100045d2900040164c0cb00000200010004
5d290004016cc0cb000002000100045d2900040165c0cb000002000100045d29
0004016ac0cb000002000100045d2900040169c0cb000002000100045d290004
016dc0cb000002000100045d2900040161c0cb000002000100045d2900040168
c0cb000002000100045d2900040167c0cb
"""
if __name__ == "__main__":
dns_l = base_dns.split('\n')
new_dns = ''.join(dns_l)
dns_b = binascii.a2b_hex(new_dns)
dns = scapy.DNS(dns_b)
b_dns_1 = bytes(dns)
dns_len_1 = len(b_dns_1)
#print(dns.show(dump=True))
dns.an[1].rdata = '10.135.0.1'
b_dns_2 = bytes(dns)
dns_len_2 = len(b_dns_2)
#print(dns.show(dump=True))
if dns_len_1 != dns_len_2:
print('mismatch old: ' + str(dns_len_1) + ' new: ' + str(dns_len_2))
for i in range(0, min(dns_len_1, dns_len_2), 20):
print('dns1[' + str(i) + ']:', binascii.b2a_hex(b_dns_1[i:i+20]))
print('dns2[' + str(i) + ']:', binascii.b2a_hex(b_dns_2[i:i+20]))
sys.exit(1)
sys.exit(0)
事实证明,scapy 以压缩形式保存 dns 记录的缓存版本,但当它被修改时,它会以未压缩形式保存。
dns.compress() 可用于获取未压缩的数据包并生成压缩形式。