文章目录
- 1. 理解SMB
- 2. 域内密码猜解
- 3. Pass The Hash
- 3. 恢复NTLM密码
SMB协议常用于windows后渗透,该协议通常用于网络共享资源,如文件、打印机和串行端口,并允许通过命名管道在分布式网络节点之间进行进程间通信。使用SysInternals的PsExec(注意带微软签名)工具可以做到远程命令执行。
另外,SMB还可以处理NTLM验证,如远程密码猜解、基于散列的身份验证(pass the hash)、SMB中继,和NBNS/LLMNR欺骗。
NL LAN Manager(NTLM) 是windows上使用的质询-响应安全协议,
GO的SMB包:
- github.com/stacktitan/smb/smb
- github.com/blackhat-go/bhg/ch-6/smb/smb
以上两个库非官方、非标准可靠,相比之下,python倒是有pysmb库。
SMB协议比较复杂,这里至少要了解的是,运用
反射
在运行时检查接口数据类型,定义结构体将数据序列化、反序列化。
1. 理解SMB
- 类似于HTTP的应用层协议;
- 二进制协议,而HTTP是ASCII可读文本协议;
- 版本(又叫方言,dialect)有2.0,2.1,3.0,3.0.2,3.1.1等,C/S两边要事先约定好版本,windows会选择两边均支持的最新版本(win7开始是2.1);
Token
SMB消息会包含与身份验证相关的安全令牌。身份验证机制有两种:
- NtlmSSP,即lsass.exe, Local Security Authority Service,本地安全授权服务;
- Kerberos
难以实现的原因:
- 身份验证机制和SMB规范是分开的
- 混合编码:身份验证令牌还使用了ASN.1(Abstract Syntax Notation One,抽象语法标记)编码,
相关规范:
-
MS-SMB2
, 关注最多:
-
MS-SPNG
,
RFC 4178
-
MS-NLMP
, 与NtlmSSP令牌结构以及质询-响应格式相关;
- ASN.1
混合编码
本部分依赖的库:
- https://golang.google.cn/pkg/encoding/asn1/
- https://golang.google.cn/pkg/encoding/binary/
先看一个结构体:
其中,B需要ASN.1编码,A和C则是二进制编码,这就是混合编码。像是json和xml,则编码所有字段,简单直接。
元数据和引用字段
关注:
- encoder.go, parseTags()
- encoder.go, unmarshal,switch typev.Kind()各种case,包括struct, uint, slice及array
2. 域内密码猜解
如果测试机器是32位,记着设置一下GOARCH:
powershell则是这样设置:
源码:
普通机器:
域内:
3. Pass The Hash
PTH攻击比一般AD域入侵更便捷,可以提权、横移等。
利用漏洞进行AD域入侵路线:
- 利用漏洞exp获得网络立足点;
- 提权;
- 从lsass提取hash或明文凭证;
- 尝试离线破解hash获取管理员密码;
- 尝试使用管理员凭证对其他主机进行身份验证,查找可能的密码重用;
- 反复尝试,直到拿下域管理员。
但如果使用NtlmSSP身份验证机制,即使在3、4步没能破解,也能在第5步直接使用NTLM散列进行SMB身份验证,即PTH,本质是因为PTH能使hash计算独立于质询-响应令牌计算。
现在基本都使用kerberos身份验证机制
NtlmSSP规范定义了两个函数:
-
NTOWFv2,相关链接:
NTLM v2 Authentication | Microsoft Docs
- CompeteResponse,它使用NTLM hash, 质询、时间戳、目标服务器名称等,生成GSS-API 令牌,相关链接:
- GSS-API GSSAPI 介绍 通用的安全机制_whatday的专栏-CSDN博客_gssapi
源码:github.com/blackhat-go/bhg/ch-6/smb/ntlmssp
pth源码:
与猜解不同的是,option填充的字段为hash。
不过测试使用mimikatz获取ntlm后,没有成功建立会话。。。
3. 恢复NTLM密码
有些服务,比如RDP, Outlook等,不支持hash验证,必须用明文密码。这时还是需要破解hash。
源码:github.com/blackhat-go/bhg/ch-6/smb/ntlmssp, NewAuthenticatePass(), NewAuthenticateHash()
下面是根据明文字典暴力破解hash源码:
测试还是失败了,经过调试(或print大法),Ntowfv2计算出来的字符串和mimikatz提取出来的ntlm不一样…
—_—|
本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/19188.html。