通过DCERPC和ntlmssp获取Windows远程主机信息
最初首发于:https://www.freebuf.com/articles/system/334948.html
1|0前言
本文通过利用DCERPC协议的ping,并附加NTLMSSP认证信息来获取获取windows远程主机的版本号,主机名,所在域的域名,DNS等信息。
因为通过rpc进行探测的工具,大部分都是依托impacket来实现,而实战中通过挂代理进行内网探测速率和准确度都比较低,所以最好的方法是将脚本放到目标主机上,来进行内网探测信息收集,所以本文关注的点是想办法脱离impacket,在Socket RAW上的实现,这样能够减小工具的体积,并且其他语言也能够轻松复刻整个过程,便于应用到实战中。
2|0成果
首先看一下成果,通过DCERPC协议的ping附带NTLMSSP来获取到目标的版本号,主机名,域名,DNS等信息。
3|0协议介绍-RPC
RPC(Remote Procedure Call)远程过程调用协议,一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。RPC它假定某些协议的存在,例如TCP/UDP等,为通信程序之间携带信息数据。在OSI网络七层模型中,RPC跨越了传输层和应用层,RPC使得开发,包括网络分布式多程序在内的应用程序更加容易。
4|0过程
4|1原理
通过看了一篇网络空间测绘核心技术之:协议识别(DCERPC篇)的文章之后,发现可以通过dcerpc的ping包+ntlmssp,epmapper接口,OXIDResolver接口,无需认证的情况下获取目标主机的版本号、主机名、多块网卡、注册到rpc的程序服务等信息。于是想自己实现一下。
对于通过OXIDResolver接口获取多块网卡的信息,已经有大佬实现了,再次不在赘述,重点是借鉴思路。
如下图所示当带上ntlmssp的时候,响应包,就会附带完整的系统版本号,主机名,域名等信息。
请求包:
响应包:
4|2交互过程分析
正常的方式有两种,第一种看官方文档,下载idl接口文件,从头开始写码,另外一种是分析包的结构,寻找规律,尝试构包。
本文是选择后者。
接下来我们尝试抓流量分析包的情况,通过尝试对两台主机进行发包,看下一下是否有规律。
192.168.80.134-> 192.168.31.130
可以发现一共有4个数据包,前面是TCP握手不用管,通过分析对比后,可以发现两个请求包是一样,响应包也有一定规律。
分析包结构:
请求包长度内容固定
第二个数据包:
这个包中如果包含\x33\x05\x71\x71\xBA\xBE\x37\x49\x83\x19\xB5\xDB\xEF\x9C\xCC\x36
则是x64,否则则为x86
第三个数据包:
第四个数据包:
可以看到附带操作系统版本信息,主机名,域名,DNS域名,DNS主机名等信息。
4|3数据包结构解析
第四个数据包是不定长的,包括目标操作系统版本信息,主机名,域名,DNS域名,DNS主机名等信息。
规律:
我们需要的内容在Auth Info:NTLMSSP,Connect AuthContextID(0)
或者说NTLM Secure Service Provider
下面。
即整体包的偏移122(0x70+0x0a)开始获取所需内容。
NTLM Secure Service Provider
的结构
8 bytes:NTLMSSP identifier: NTLMSSP
8 bytes:NTLM Message Type: NTLMSSP_CHALLENGE (0x00000002)
2 bytes:Target Name的Length
2 bytes:Target Name的Maxlen
4 bytes:Target Name的Offset
4 bytes:Negotiate Flags: 0xa2898205, Negotiate 56, Negotiate 128, Negotiate Version, Negotiate Target Info, Negotiate Extended Security, Target Type Domain, Negotiate Always Sign, Negotiate NTLM key, Request Target, Negotiate UNICODE
8 bytes:NTLM Server Challenge: 15711e72121a143d
8 bytes:Reserved: 0000000000000000
2 bytes:Target Info 的Length
2 bytes:Target Info 的Maxlen
4 bytes:Target Info 的Offset
24 bytes:操作系统版本信息
剩下的全是Target Info的数据,属性有:
NetBIOS domain name
NetBIOS computer name
DNS domain name
DNS computer name
DNS tree name
Timestamp
End of list(0x00000000)每个属性的结构为:
类型2bytes、长度2bytes、值(根据前面的长度)
根据上面的分析,通过socket构包,对回包进行偏移解析,获取所需字段内容,代码如下:
发送第二个包解析代码
上面也说了要通过第一个包判断目标操作系统的架构,代码如下:
注意:经过测试发送两个数据包不能在一个socket会话里面,否则第二个包的响应会不正常,要建立两个会话进行发送。
4|4写成脚本
根据上面的分析,写成了多线程的脚本, 多线程实现扫描效果如下:
域内主机的话会显示域名,主机名,操作系统版本架构等信息,工作组主机则信息都是自己的主机名。
最后脚本放在了github:https://github.com/komomon/Dcerpc_Find_OSInfo
5|0一起交流
关注公众号回复“加群”,添加Z2OBot 小K自动拉你加入Z2O安全攻防交流群分享更多好东西。
知识星球
团队建立了知识星球,不定时更新最新漏洞复现,手把手教你,同时不定时更新POC、内外网渗透测试骚操作。感兴趣的可以加一下。
参考文章:
Remote Enumeration of Network Interfaces without any Authentication: The OXID Resolver
https://payloads.online/archivers/2020-07-16/1/
__EOF__

本文链接:https://www.cnblogs.com/forforever/p/16369339.html
关于博主:喜欢读书、旅行、爬山。评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
2020-03-15 shodan 新手介绍
2020-03-15 解决"easy_install command not found"问题记录