【问题标题】:Encoding/Decoding AD dnsRecord values with Python使用 Python 编码/解码 AD dnsRecord 值
【发布时间】:2017-04-12 18:28:13
【问题描述】:

我正在尝试通过 Python 编辑 Active Directory dnsRecord 值。属性值是一个二进制结构 - 我在各个地方都找到了该结构的文档,例如 http://www.indented.co.uk/2009/06/18/mapping-the-dnsrecord-attribute/ 我还找到了一些用于解释值的 Perl 代码示例,例如 https://wiki.samba.org/index.php/Working_with_Active_Directory_encoded_LDAP_values

但是我在用 Python 解码一个值时没有成功

示例值:'\x04\x00\x01\x00\x05\xf0\x00\x00R\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|i7\x00\ xc0\xa8\x016' - 我知道这是一条 A 记录,将名称“barbel”指向 192.168.1.54

有人在 Python 中使用过 dnsRecord 值吗?

【问题讨论】:

    标签: python data-structures dns active-directory ldap


    【解决方案1】:

    dnsRecord 的结构似乎在 Microsoft 的 DNS 开放规范文档 (MS-DNSP) 中有所描述。特别是对于 dnsRecord,它在第 2.3.2.2 节中进行了描述:

    https://msdn.microsoft.com/en-us/library/ee898781.aspx

    从上面的链接:

    DataLength (2 bytes):一个无符号二进制整数,包含 数据字段的长度,以字节为单位。

    类型(2 字节):资源记录的类型。请参阅 DNS_RECORD_TYPE (第 2.2.2.1.1 节)。

    版本(1 字节):与资源关联的版本号 记录属性。该值必须为 0x05。

    Rank(1 字节):RANK* 标志之一的最低有效字节 价值观。请参阅 dwFlags(第 2.2.2.2.5 节)。

    标志(2 个字节):未使用。该值必须为 0x0000。

    序列号(4字节):区域的SOA记录的序列号 包含此资源记录。请参阅 DNS_RPC_RECORD_SOA(部分 2.2.2.2.4.3)。

    TtlSeconds(4 字节):参见 dwTtlSeconds(第 2.2.2.2.5 节)。这个领域 使用大端字节序。

    保留(4 字节):此字段保留供将来使用。价值 必须是 0x00000000。

    TimeStamp(4 字节):参见 dwTimeStamp(第 2.2.2.2.5 节)。

    数据(变量):资源记录的数据。请参阅 DNS_RPC_RECORD_DATA (第 2.2.2.2.4 节)。

    挑战当然是根据上述从 AD 解码二进制 dnsRecord 值。因为几个部分也有自己的部分来描述它们的值。我还没有解码这些值,但希望这些信息至少能让你走上正确的道路。

    【讨论】:

      【解决方案2】:

      利用@ChadSikorra 的答案中链接的文档,我创建了以下代码:

      import socket
      import struct
      for b in dnsRecords:
          # https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-dnsp/6912b338-5472-4f59-b912-0edb536b6ed8?redirectedfrom=MSDN
          dataLength, dnsRecordType, version, rank, flags, serial = \
              struct.unpack('H H B B H L', b[:12])
          ttl = struct.unpack('!L', b[12:16])
          reserved, ts = struct.unpack('L L', b[16:24])
          data = b[24:].tolist()
          print(data)
          if hex(dnsRecordType) == "0x1":
              print(socket.inet_ntop(socket.AF_INET, b[24:]))
          elif hex(dnsRecordType) == "0x1c":
              print(socket.inet_ntop(socket.AF_INET6, b[24:]))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-24
        • 2020-08-02
        • 2011-04-03
        • 1970-01-01
        • 2023-03-08
        • 2019-03-09
        • 2019-12-19
        • 2012-04-10
        相关资源
        最近更新 更多