通过OXID解析器获取Windows远程主机上网卡地址
本文主要参考通过OXID解析器获取Windows远程主机上网卡地址的拓展...
0x00 背景
Nicolas Delhaye在AIRBUS上分享了一篇The OXID Resolver [Part 1] – Remote enumeration of network interfaces without any authentication,通过这篇文章我们可以掌握通过Windows的一些DCOM接口进行网卡进行信息枚举,它最大的魅力在于无需认证,只要目标的135端口开放即可获得信息。
0x01 OXID Resolver - 交互过程分析
OXID Resolver是在支持COM +的每台计算机上运行的服务。
它执行两项重要职责:
它存储与远程对象连接所需的RPC字符串绑定,并将其提供给本地客户端。它将ping消息发送到本地计算机具有客户端的远程对象,并接收在本地计算机上运行的对象的ping消息。OXID解析器的此方面支持COM +垃圾回收机制。Nicolas Delhaye在原文提供的脚本是需要依赖imapcket的,而我只关注在Socket RAW上的实现,这样能够减小工具的体积,并且其他语言也能够轻松复刻整个过程。
这个协议Wireshark已经内置了,我们可以直接进行抓包分析。
前三个不需要关注,主要是TCP的三次握手,后面的四次交互才是我们需要重点关注的。
第一个数据包 72 Bytes (主要用于协商版本等等):
x05x00x0bx03x10x00x00x00x48x00x00x00x01x00x00x00xb8x10xb8x10x00x00x00x00x01x00x00x00x00x00x01x00xc4xfexfcx99x60x52x1bx10xbbxcbx00xaax00x21x34x7ax00x00x00x00x04x5dx88x8axebx1cxc9x11x9fxe8x08x00x2bx10x48x60x02x00x00x00
第二个数据包:
这个包无需关注,因为我们最终要获得的是第四个数据包
"x05x00x0cx03x10x00x00x00x3cx00x00x00x01x00x00x00"
"xb8x10xb8x10x0ax13x00x00x04x00x31x33x35x00x00x00"
"x01x00x00x00x00x00x00x00x04x5dx88x8axebx1cxc9x11"
"x9fxe8x08x00x2bx10x48x60x02x00x00x00"
可以选中对应的节点,直接复制... as Escaped String,这样就能够拿到十六进制Code。
第三个数据包:
"x05x00x00x03x10x00x00x00x18x00x00x00x01x00x00x00"
"x00x00x00x00x00x00x05x00"
第四个数据包:
"x05x00x02x03x10x00x00x00xecx00x00x00x01x00x00x00"
"xd4x00x00x00x00x00x00x00x05x00x07x00x00x00x02x00"
"x5dx00x00x00x5dx00x47x00x07x00x44x00x45x00x53x00"
"x4bx00x54x00x4fx00x50x00x2dx00x41x00x44x00x47x00"
"x33x00x33x00x31x00x32x00x00x00x07x00x31x00x39x00"
"x32x00x2ex00x31x00x36x00x38x00x2ex00x38x00x30x00"
"x2ex00x31x00x00x00x07x00x31x00x39x00x32x00x2ex00"
"x31x00x36x00x38x00x2ex00x32x00x30x00x31x00x2ex00"
"x31x00x00x00x07x00x31x00x30x00x2ex00x32x00x30x00"
"x2ex00x35x00x36x00x2ex00x38x00x33x00x00x00x07x00"
"x31x00x3ax00x3ax00x32x00x35x00x36x00x3ax00x66x00"
"x64x00x00x00x00x00x09x00xffxffx00x00x1ex00xffxff"
"x00x00x10x00xffxffx00x00x0ax00xffxffx00x00x16x00"
"xffxffx00x00x1fx00xffxffx00x00x0ex00xffxffx00x00"
"x00x00x00x00x00x00x00x00x00x00x00x00"
第四个数据包返回的永远是不定长的数据,所以需要参考文档进行解析,我下载了一份包含了OXID的文档,看起来非常的吃力,虽然有结构体,但是并没有给出一个通用的解决方案。
0x02 数据解析过程
规律:
每一个String Binding都以x07x00开头。每一个StringBinding都以x00x00分割,一直到第一个Security Binding是x09x00开头。因此,当recv的数据直到x09x00结束,开头就比较好办了,第四个数据包起始位置往后偏移42个字节就可以到达第一个String Binding。
代码如下:
packet_v2 = packet[42:]
packet_v2_end = packet_v2.find("x09x00xffxffx00x00")
packet_v2 = packet_v2[:packet_v2_end]
hostname_list = packet_v2.split("x00x00")
result = {ip:[]}
print("[*] " + ip)
for h in hostname_list:
h = h.replace('x07x00','')
h = h.replace('x00','')
if h == '':
continue
print("t[->]" + h)
result[ip].append(h)
print result
0x03 多线程实现效果
优点:
不依赖impacket 通过本文的分析,可以有效提高内网渗透的效率,定位多网卡主机,同时可以复刻这个方法来实现其他语言的版本。
Github 源代码地址:https://github.com/Rvn0xsy/OXID-Find/
欢迎关注
免责声明
由于传播、利用本公众号威胁猎人所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号威胁猎人及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
文章来源
作者:倾旋
原文链接:https://payloads.online/archivers/2020-07-16/1/
原文始发于微信公众号(威胁猎人):通过OXID解析器获取Windows远程主机上网卡地址
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论