Scapy DNS 答案重写增加了额外的字节

问题描述 投票:0回答:1

我正在拦截 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)
python dns scapy
1个回答
0
投票

事实证明,scapy 以压缩形式保存 dns 记录的缓存版本,但当它被修改时,它会以未压缩形式保存。

dns.compress() 可用于获取未压缩的数据包并生成压缩形式。

© www.soinside.com 2019 - 2024. All rights reserved.