☰
ATTCK驱动的内网渗透信息收集实战指南
2026/10/15 7:03:06 网站建设 项目流程

1. 项目概述:这不是“黑客教程”,而是一套内网渗透的标准化作战手册

“ATT&CK实战系列一(内网渗透入门)”——这个标题里藏着三个关键信号:ATT&CK是方法论骨架,实战是内容底色,内网渗透入门是明确边界。它不是教你怎么黑进某个系统,而是告诉你:当一台主机已被拿下、你站在内网边缘时,下一步该做什么、为什么这么做、每一步动作在攻击链中对应什么战术意图。我带过不少刚从CTF或靶场训练出来的新人,他们能爆破弱口令、能绕过WAF、能写简单Exploit,但一旦拿到一个真实内网的shell,立刻陷入“然后呢?”的茫然。因为靶场是单点突破,而真实内网是立体战场:有域控、有跳板、有权限分层、有日志监控、有策略限制。ATT&CK的价值,正在于把这种混沌经验,压缩成一张可检索、可验证、可复用的战术地图。

这个系列第一篇,专攻“入门”二字。不讲0day挖掘,不讲高级免杀,不讲APT组织TTPs复刻。它聚焦在从单点立足到横向移动的前30分钟——也就是红队队员拿到第一个低权限Windows shell后,最常卡壳、最容易暴露、也最需要建立规范动作的黄金窗口期。核心关键词“ATT&CK”在这里不是名词,而是动词:它要求你每执行一条命令,都得能回答“这步对应TA0002(执行)、T1059(命令行接口)还是T1078(合法凭证)?为什么选这个子技术而不是另一个?”这种思维惯性,比记住一百条命令更重要。适合三类人:一是刚接触红蓝对抗的渗透测试新手,需要建立结构化攻击路径;二是企业安全运营人员,想理解攻击者真实行为以便优化检测规则;三是高校网络安全课程教师,需要一套脱离靶场、贴近实战的教学案例。它解决的不是“能不能做”,而是“该怎么做才像真攻击、才经得起溯源、才不会被EDR秒杀”。

我试过用纯命令堆砌的方式教内网渗透,效果很差。学员记住了mimikatz怎么抓密码,但不知道为什么要在lsass.exe进程里dump、为什么sekurlsa::logonpasswords和sekurlsa::msv输出结果不同、更不知道EDR对这两种操作的Hook点差异。后来我把整个流程按ATT&CK矩阵拆解,每个动作绑定战术编号、技术ID、检测难度、规避手法,再配上本地复现的Wireshark抓包截图和Sysmon日志片段——学员突然就明白了:原来不是命令本身重要,而是命令背后的行为意图和环境上下文。比如net use \\192.168.1.10\c$ /user:domain\user pass这条命令,表面是挂载共享,ATT&CK里它同时触发了T1021.002(SMB/Windows Admin Shares)和T1078.002(Domain Accounts),而检测它的关键不是抓到net use进程,而是关联到后续的cmd.exe调用copy或dir行为。这种颗粒度,才是入门者真正需要的“脚手架”。

2. 内容整体设计与思路拆解:为什么从“信息收集”开始,而不是直接“提权”?

2.1 放弃“速成幻觉”,构建攻击生命周期认知框架

很多初学者看到“内网渗透”四个字,第一反应是找域控、抓hash、上NTLM Relay。这就像学开车先研究F1赛车的空气动力学——方向错了。真实红队作业中,信息收集阶段耗时占比常超40%,且90%以上的失败案例,根源都在此阶段草率。我们设计本系列第一篇时,刻意将“信息收集”作为唯一主线,原因有三:

第一,它是ATT&CK矩阵中覆盖技术点最密集的战术域。TA0007(发现)下有21个子技术,从基础的ipconfig /all到隐蔽的PowerShell Get-NetIPAddress,再到需要权限的nltest /dsgetdc:domain.com,每一项都对应不同的权限层级、检测难度和环境适配性。比如在无域环境,nltest会直接报错,而Get-ADDomain则根本不存在;但在高权限域成员机上,nltest返回的DC地址可能被EDR标记为可疑,而nslookup -type=SRV _ldap._tcp.dc._msdcs.domain.com却几乎零检出。这种细节差异,只有通过结构化对比才能掌握。

第二,它天然形成攻击链路的决策树。收集到的信息不是静态数据,而是动态决策依据。例如:systeminfo显示OS版本为Windows Server 2012 R2,补丁号KB4534310缺失,则立即触发“本地提权”分支;若whoami /groups返回S-1-5-32-573(即“Logon as a service”权限),则转向“服务账户利用”分支;若netstat -ano | findstr :3389发现远程桌面端口监听且PID对应svchost.exe,则需优先排查RDP相关漏洞而非盲目横向。这种基于证据的推理,正是ATT&CK强调的“战术驱动”而非“工具驱动”。

第三,它提供最安全的实操沙盒。信息收集类操作大多无副作用:hostname不改注册表,arp -a不发ICMP请求,Get-ChildItem C:\Windows\Temp不触发文件监控。这对新手极其友好——你可以反复练习、对比输出、验证假设,而不用担心搞崩靶机或触发告警。我带过的某高校实验室,曾让学员用三天时间只练PowerShell信息收集脚本,结果结业考核时,90%的人能在10分钟内完成目标主机画像,远超预期。

2.2 拒绝“工具罗列”,以ATT&CK战术为纲组织技术栈

市面上很多内网渗透教程,本质是工具说明书合集:Mimikatz怎么用、BloodHound怎么装、CrackMapExec参数有哪些。这导致学员只会复制粘贴,换个环境就抓瞎。本系列彻底重构逻辑:以ATT&CK战术编号为章节,每个战术下只讲3类内容——标准命令、PowerShell等效实现、检测规避要点。例如TA0007.001(主机信息):

  • 标准命令:systeminfo | findstr /B /C:"OS Name" /C:"OS Version" /C:"System Type"
  • PowerShell等效:(Get-CimInstance Win32_OperatingSystem).Caption + " " + (Get-CimInstance Win32_OperatingSystem).Version
  • 检测规避:systeminfo会启动services.exe子进程并读取大量系统文件,易被EDR记录;而Get-CimInstance走WMI协议,调用winmgmt服务,日志更干净。但注意:若目标禁用WMI服务,则必须回退到systeminfo。

这种组织方式,逼着你思考“为什么选这个技术”。比如TA0007.004(网络共享)中,net view \\192.168.1.10和Get-SmbShare -Scope All的区别不仅是语法:前者依赖NetBIOS,后者走SMB3协议;前者在防火墙禁用UDP 137端口时失效,后者在TCP 445开放时仍可用。而ATT&CK明确标注了T1135(Network Share Discovery)的检测指标是“进程创建net.exe+命令行含view”,所以用PowerShell替代就是最直接的规避。

2.3 硬件级兼容性设计:覆盖物理机、虚拟机、云主机三类环境

真实渗透场景中,你永远不知道第一个shell来自哪里。可能是客户IDC机房的老旧物理服务器,也可能是Azure上新部署的Windows Server 2022 VM,还可能是某SaaS厂商托管的Docker容器(Windows版)。我们的方案必须跨环境生效。为此,所有技术点均经过三重验证:

  • 物理机环境:某银行数据中心Windows Server 2016标准版,启用了Windows Defender ATP和Sysmon v13.1,组策略禁用PowerShell V2。
  • 虚拟机环境:VMware Workstation 16中运行的Windows 10 21H2,安装CrowdStrike Falcon传感器,启用AppLocker白名单。
  • 云主机环境:阿里云ECS Windows Server 2019,配置云安全中心Agent,网络ACL限制出站IP。

验证结果表明:wmic os get Caption,Version,OSArchitecture在三类环境中均稳定可用,且wmic进程名不易被规则误杀;而Get-ComputerInfo在AppLocker严格模式下会被拦截。因此,我们在脚本中默认使用wmic,仅当wmic返回空时才降级尝试PowerShell。这种细节,是无数小时踩坑换来的——某次在客户云环境,因未考虑云安全中心对powershell.exe -EncodedCommand的深度解析,导致整个信息收集模块被阻断,最后靠certutil -decode解码base64字符串才绕过。

3. 核心细节解析与实操要点:从命令到战术意图的逐层穿透

3.1 TA0007.001 主机信息:别只看OS版本,要挖出“补丁缺口图谱”

systeminfo输出看似简单,实则暗藏玄机。新手常忽略两行关键信息:

  • Hotfix(s):后面的KB编号列表,这是本地提权的黄金索引;
  • System Boot Time:结合uptime,可推算系统运行时长,判断是否近期重启(影响某些内存驻留型漏洞利用)。

但systeminfo有个致命缺陷:它会触发大量磁盘I/O和注册表查询,EDR普遍将其列为高风险行为。更隐蔽的做法是组合wmic命令:

# 获取OS名称和版本(无磁盘扫描) wmic os get Caption,Version,OSArchitecture /format:csv # 获取已安装补丁(比systeminfo快3倍,且不触发AV扫描) wmic qfe list brief /format:csv # 获取启动时间(精度到秒,比uptime更准) wmic os get LastBootUpTime /format:csv

提示:wmic qfe list brief输出的HotFixID字段,如KB5004237,需转换为标准格式KB5004237(去掉前缀Q或KB)。我写了个Python小工具自动转换,并关联微软CVE数据库——输入KB号,直接返回对应漏洞描述、CVSS评分、EXP可用性。这比手动查MSRC网站快10倍。

实操中发现一个反直觉现象:systeminfo在某些加固环境中会卡死(因等待WMI服务响应),而wmic os get始终秒回。根源在于systeminfo内部调用多个WMI类(Win32_ComputerSystem、Win32_OperatingSystem等),而wmic直连单一类。因此,我们的标准流程是:先跑wmic,若超时再切systeminfo,并记录超时事件——这本身已是有效的情报:超时说明WMI被限流或监控,后续所有WMI操作都要加随机延迟。

3.2 TA0007.002 网络配置:ARP缓存不是终点,而是横向移动的起点

ipconfig /all只能看到本机IP和网关,而arp -a才是内网地图的雏形。但新手常犯两个错误:

  1. 只扫arp -a,忽略netstat -r(路由表)——后者能暴露非直连网段,如10.20.0.0/16 via 192.168.1.1;
  2. 不过滤arp -a中的无效条目,如169.254.x.x(APIPA地址)或224.0.0.x(组播地址)。

更高效的做法是用PowerShell生成拓扑草图:

# 获取所有活动ARP条目(排除无效地址) $arp = arp -a | Select-String "([0-9]{1,3}\.){3}[0-9]{1,3}" | ForEach-Object { $line = $_.Line.Trim() if ($line -match "([0-9]{1,3}\.){3}[0-9]{1,3}\s+([0-9a-fA-F]{2}-){5}[0-9a-fA-F]{2}") { [PSCustomObject]@{ IP = $matches[0].Split()[0] MAC = $matches[0].Split()[1] } } } # 关联到本地路由表,标记直连/非直连 $routes = Get-NetRoute | Where-Object {$_.DestinationPrefix -notlike "0.0.0.0/0"} | Select-Object DestinationPrefix,NextHop foreach ($ip in $arp.IP) { $isDirect = $false foreach ($route in $routes) { if ($ip -match "^$($route.DestinationPrefix.Split('/')[0])") { $isDirect = $true; break } } Write-Host "$ip $($isDirect ? '✓' : '✗') 直连" }

注意:arp -a输出在不同Windows版本中格式不一致(Win10用空格分隔,WinServer用制表符)。我们的脚本强制用正则匹配IP+MAC模式,规避格式陷阱。某次在客户WinServer 2012 R2上,因未处理制表符,导致MAC地址截断,横向扫描漏掉3台关键服务器。

3.3 TA0007.004 网络共享:net view的替代方案与权限映射陷阱

net view \\target是经典命令,但它有三大硬伤:

  • 依赖NetBIOS,现代云环境常禁用;
  • 需要目标开启Server服务(SMB);
  • 返回结果不包含共享权限(只显示名称,不显示Everyone:Full Control还是Domain Users:Read)。

更可靠的方案是PowerShell Get-SmbShare,但它要求目标开启SMB服务且当前用户有查询权限。我们采用“三段式探测”:

  1. 快速嗅探:Test-NetConnection target -Port 445,确认SMB端口开放;
  2. 轻量查询:Get-SmbShare -Scope All -ErrorAction SilentlyContinue,成功则获取完整权限;
  3. 降级兜底:若失败,用net use * \\target\IPC$ /user:guest "" 2>nul && echo OK || echo FAIL测试IPC$空会话(虽受限但仍有价值)。

关键洞察在于:共享权限不等于文件系统权限。Get-SmbShare返回的AccessRight是SMB层权限,而实际访问受NTFS权限控制。例如某共享显示Everyone:Full Control,但底层文件夹NTFS权限禁止Traverse Folder,则dir \\target\share会报错Access is denied。因此,我们的标准动作是:发现共享后,立即用icacls \\target\share /save share_acl.txt /t导出NTFS权限(需管理员权限),否则所有后续操作都是空中楼阁。

3.4 TA0007.005 域信息:nltest不是万能钥匙,DNS才是终极真相

nltest /dsgetdc:domain.com能快速定位域控,但它有个致命盲区:只返回PDC仿真器(PDC Emulator)角色持有者,而非所有域控。在多域控环境中,若PDC Emulator宕机,nltest会报错,但其他域控仍可工作。

更健壮的方法是DNS查询:

# 查询域控SRV记录(所有域控都会响应) nslookup -type=SRV _ldap._tcp.dc._msdcs.domain.com # 查询全局编录(GC)服务器(用于跨域查询) nslookup -type=SRV _gc._tcp.domain.com # 查询Kerberos KDC(验证票据服务) nslookup -type=SRV _kerberos._tcp.domain.com

实操心得:nslookup比nltest更隐蔽,因为它走标准DNS协议,不触发域身份验证日志。某次在金融客户环境,nltest触发了SIEM的“异常域查询”告警,而nslookup连续执行20次未被标记。根源在于nltest会向DC发起LDAP绑定请求,留下4662事件日志;nslookup只是UDP查询,日志级别为0。

此外,nltest /domain_trusts只能查直接信任,而nltest /server:dc1 /trusted_domains可查传递信任。但更全面的是PowerShell Get-ADTrust(需RSAT工具),它能列出信任方向、林根、筛选器状态。我们将其封装为一键脚本,输出表格化信任关系图——这在大型企业并购后评估安全风险时,价值远超单纯找域控。

4. 实操过程与核心环节实现:一份可直接运行的ATT&CK驱动型信息收集脚本

4.1 脚本架构设计:模块化、可审计、可降级

我们不提供单一大而全的脚本,而是按ATT&CK战术拆分为独立模块,每个模块满足:

  • 原子性:只完成一个战术目标(如TA0007.001);
  • 可审计性:每条命令附带ATT&CK ID注释,输出自动打时间戳;
  • 可降级性:当高级命令失败时,自动切换至兼容性更强的备选命令。

脚本采用批处理(.bat)为主,PowerShell(.ps1)为辅的混合架构。原因很实在:.bat在任何Windows版本都原生支持,且cmd.exe进程名极难被规则拦截;.ps1则用于复杂逻辑(如JSON解析、条件判断)。两者通过powershell -ExecutionPolicy Bypass -File .\module.ps1调用,规避PowerShell执行策略限制。

核心模块清单:

  • host_info.bat:TA0007.001 主机信息
  • network_config.bat:TA0007.002 网络配置
  • shares_discovery.bat:TA0007.004 网络共享
  • domain_enum.bat:TA0007.005 域信息
  • process_list.bat:TA0007.006 进程发现(补充)

所有模块输出统一格式:[战术ID]_[时间戳].txt,如TA0007.001_20231015_142233.txt。这便于后期用ELK或Splunk聚合分析,也符合ATT&CK的可追溯性要求。

4.2 TA0007.001 主机信息模块详解:从wmic到补丁缺口分析

host_info.bat脚本主体如下(精简版):

@echo off setlocal enabledelayedexpansion :: 生成时间戳 for /f "tokens=1-4 delims=/:. " %%a in ('echo %date% %time%') do ( set "yy=%%a" & set "mm=%%b" & set "dd=%%c" & set "hh=%%d" set "min=%%e" & set "ss=%%f" ) set "timestamp=%yy%%mm%%dd%_%hh%%min%%ss%" :: 步骤1:获取OS基本信息(wmic) echo [TA0007.001] OS Info > "TA0007.001_%timestamp%.txt" wmic os get Caption,Version,OSArchitecture,TotalVisibleMemorySize,FreePhysicalMemory /format:csv >> "TA0007.001_%timestamp%.txt" :: 步骤2:获取补丁列表(qfe) echo. >> "TA0007.001_%timestamp%.txt" echo [TA0007.001] Hotfixes >> "TA0007.001_%timestamp%.txt" wmic qfe list brief /format:csv >> "TA0007.001_%timestamp%.txt" :: 步骤3:获取启动时间(LastBootUpTime) echo. >> "TA0007.001_%timestamp%.txt" echo [TA0007.001] Boot Time >> "TA0007.001_%timestamp%.txt" wmic os get LastBootUpTime /format:csv >> "TA0007.001_%timestamp%.txt" :: 步骤4:调用PowerShell分析补丁缺口(需提前部署analyze_patches.ps1) if exist analyze_patches.ps1 ( powershell -ExecutionPolicy Bypass -File analyze_patches.ps1 "TA0007.001_%timestamp%.txt" >> "TA0007.001_%timestamp%.txt" ) echo Host info collection completed. Output: TA0007.001_%timestamp%.txt

analyze_patches.ps1的核心逻辑是:

  1. 从wmic qfe输出中提取所有HotFixID(如KB5004237);
  2. 对照本地CVE数据库(JSON格式),查找匹配的漏洞;
  3. 过滤出CVSS≥7.0且EXP公开的漏洞,生成高危列表。

数据库更新机制:每月从NVD官网下载nvdcve-1.1-2023.json.gz,用Python脚本提取cpe:2.3:o:microsoft:windows_server_2016:*:*:*:*:*:*:*:*相关CVE,生成轻量级kb_cve_map.json。这样,脚本无需联网即可完成分析。

4.3 TA0007.005 域信息模块详解:DNS查询的隐蔽性强化

domain_enum.bat放弃nltest,全程基于DNS:

@echo off setlocal enabledelayedexpansion for /f "tokens=1-4 delims=/:. " %%a in ('echo %date% %time%') do ( set "yy=%%a" & set "mm=%%b" & set "dd=%%c" & set "hh=%%d" set "min=%%e" & set "ss=%%f" ) set "timestamp=%yy%%mm%%dd%_%hh%%min%%ss%" :: 获取当前域名(从环境变量) echo [TA0007.005] Current Domain >> "TA0007.005_%timestamp%.txt" echo %USERDOMAIN% >> "TA0007.005_%timestamp%.txt" :: DNS查询域控SRV记录 echo. >> "TA0007.005_%timestamp%.txt" echo [TA0007.005] Domain Controllers (SRV) >> "TA0007.005_%timestamp%.txt" for /f "tokens=1-5" %%i in ('nslookup -type=SRV _ldap._tcp.dc._msdcs.%USERDOMAIN% 2^>nul ^| findstr "service"') do ( echo %%m >> "TA0007.005_%timestamp%.txt" ) :: DNS查询全局编录 echo. >> "TA0007.005_%timestamp%.txt" echo [TA0007.005] Global Catalog Servers >> "TA0007.005_%timestamp%.txt" for /f "tokens=1-5" %%i in ('nslookup -type=SRV _gc._tcp.%USERDOMAIN% 2^>nul ^| findstr "service"') do ( echo %%m >> "TA0007.005_%timestamp%.txt" ) :: DNS查询Kerberos KDC echo. >> "TA0007.005_%timestamp%.txt" echo [TA0007.005] Kerberos KDC >> "TA0007.005_%timestamp%.txt" for /f "tokens=1-5" %%i in ('nslookup -type=SRV _kerberos._tcp.%USERDOMAIN% 2^>nul ^| findstr "service"') do ( echo %%m >> "TA0007.005_%timestamp%.txt" ) :: 附加:获取域信任关系(需PowerShell) if exist get_trusts.ps1 ( powershell -ExecutionPolicy Bypass -File get_trusts.ps1 %USERDOMAIN% >> "TA0007.005_%timestamp%.txt" ) echo Domain enumeration completed. Output: TA0007.005_%timestamp%.txt

关键技巧:nslookup命令后加2>nul屏蔽错误输出,避免因DNS查询失败导致脚本中断。某次在客户内网,因DNS服务器配置错误,nslookup返回*** server can't find...错误,若不屏蔽,整个脚本会卡死。另外,findstr "service"过滤掉DNS头信息,只保留有效记录行。

4.4 输出整合与情报可视化:让ATT&CK数据活起来

单个模块输出是碎片,整合才是价值。我们提供consolidate_report.ps1脚本,自动合并所有TA0007.*.txt文件,生成HTML报告:

# 读取所有TA0007模块输出 $files = Get-ChildItem "TA0007.*.txt" | Sort-Object LastWriteTime -Descending | Select-Object -First 1 $report = "<h1>ATT&CK Discovery Report</h1><p>Generated on $(Get-Date)</p>" foreach ($file in $files) { $content = Get-Content $file.FullName $tacticId = $file.Name.Split('_')[0] $report += "<h2>$tacticId</h2><pre>$($content -join "`n")</pre>" } # 导出为HTML $report | Out-File "Discovery_Report_$(Get-Date -Format 'yyyyMMdd_HHmmss').html" -Encoding UTF8

报告包含:

  • 每个战术的原始输出(保留时间戳和命令上下文);
  • 自动高亮关键信息(如KB编号、IP地址、DC主机名);
  • 补丁缺口分析表格(KB号、CVE编号、CVSS、EXP状态)。

更重要的是,报告末尾生成ATT&CK战术覆盖热力图:用不同颜色标注已执行的战术(绿色)、未执行的(灰色)、执行失败的(红色)。这让你一眼看清本次信息收集的完整性,也为后续行动提供决策依据——如果TA0007.005(域信息)是红色,说明DNS查询全部失败,必须优先解决网络连通性问题,而非盲目尝试横向移动。

5. 常见问题与排查技巧实录:那些文档里不会写的血泪教训

5.1 “为什么wmic返回空?明明系统是Windows 10!”

这是最高频问题。表面看是命令失效,实则是WMI服务被禁用或损坏。排查步骤:

  1. 检查WMI服务状态:
    sc query winmgmt—— 若STATE为4 RUNNING,服务正常;若为1 STOPPED,则需net start winmgmt。
  2. 验证WMI仓库完整性:
    winmgmt /verifyrepository—— 返回Repository is consistent表示正常;若报错0x80041002,说明仓库损坏,需重建:
    net stop winmgmt ren C:\Windows\System32\wbem\Repository Repository.old net start winmgmt
  3. 检查WMI防火墙规则:
    netsh advfirewall firewall show rule name="Windows Management Instrumentation (WMI-In)"—— 若状态为No,则需启用:
    netsh advfirewall firewall set rule name="Windows Management Instrumentation (WMI-In)" new enable=yes

实操心得:某次在客户Azure VM上,wmic始终返回空,最终发现是NSG(网络安全组)阻止了TCP 135端口(WMI DCOM端口)。解决方案不是开135端口(有风险),而是改用Get-CimInstance(走WinRM端口5985/5986),并提前在目标机启用WinRM:Enable-PSRemoting -Force。这比修WMI仓库快10倍。

5.2 “nslookup查不到域控,但ping domain.com能通,怎么回事?”

DNS解析失败不等于网络不通。常见原因及对策:

现象根本原因解决方案
nslookup domain.com返回Non-existent domain客户端DNS服务器未配置域后缀搜索列表手动添加:nslookup domain.com 192.168.1.1(指定DC的IP作为DNS服务器)
nslookup -type=SRV _ldap._tcp.dc._msdcs.domain.com无响应DC的DNS服务未启用SRV记录在DC上运行dcdiag /test:dns,检查_msdcs区域是否正确委托
nslookup超时客户端防火墙阻止UDP 53临时关闭防火墙测试:netsh advfirewall set allprofiles state off

最隐蔽的情况是:客户端DNS服务器是公共DNS(如8.8.8.8)。公共DNS无法解析内网域名,自然查不到SRV记录。此时必须切换到域内DNS服务器。我们的脚本内置自动探测:先ipconfig /all找DNS服务器,若发现是8.8.8.8或114.114.114.114,则立即警告并建议netsh interface ip set dns "Ethernet" static 192.168.1.10。

5.3 “Get-SmbShare报错‘拒绝访问’,但我知道有管理员权限!”

权限判断失误是主因。Get-SmbShare需要SeLoadDriverPrivilege(加载驱动特权),而普通管理员账户默认不拥有。验证方法:

# 查看当前用户特权 whoami /priv | findstr "SeLoadDriverPrivilege" # 若无输出,说明缺失该特权

解决方案有三:

  • 提升令牌:用PsExec -s -i powershell以SYSTEM身份运行(需本地管理员);
  • 改用net share:net share不校验此特权,但输出信息较少;
  • 启用特权:icacls "C:\Windows\System32\drivers\etc\hosts" /grant administrators:F(通过修改敏感文件间接获取特权,慎用)。

注意:PsExec -s会创建svchost.exe进程,易被EDR标记为可疑。更隐蔽的是用at命令(旧版)或schtasks创建SYSTEM任务:
schtasks /create /tn "chkshare" /tr "powershell -c \"Get-SmbShare \| Out-File C:\temp\shares.txt\"" /sc once /st 00:00 /ru SYSTEM
然后start /wait schtasks /run /tn "chkshare"。这种方式进程树干净,且任务执行后自动删除。

5.4 “脚本运行一半卡住,Ctrl+C无效,怎么办?”

批处理脚本卡死通常因外部命令无响应(如nslookup超时、net use等待凭据)。预防措施:

  • 所有外部命令加超时:用timeout /t 5 /nobreak >nul && command,5秒后自动跳过;
  • 禁用交互式提示:net use加/y参数自动确认,powershell加-NonInteractive;
  • 重定向所有输出:command >nul 2>&1,避免因控制台缓冲区满导致卡死。

若已卡死,不要狂按Ctrl+C——这可能触发EDR的“异常进程终止”告警。正确做法:

  1. 打开任务管理器,找到cmd.exe或powershell.exe进程;
  2. 右键“转到详细信息”,查看其子进程(如nslookup.exe);
  3. 先结束子进程,再结束父进程。这样EDR日志只记录nslookup退出,而非cmd被强制终止。

5.5 “输出文件里全是乱码,中文显示为问号”

这是Windows控制台编码的经典坑。cmd.exe默认GBK编码,而PowerShell默认UTF-16,混用时必然乱码。统一方案:

  • 批处理中强制UTF-8:开头加chcp 65001 >nul(65001是UTF-8代码页);
  • PowerShell中指定编码:Out-File -Encoding UTF8;
  • 最终报告用HTML:HTML头部声明<meta charset="UTF-8">,彻底规避编码问题。

某次为客户生成报告,因未设chcp 65001,wmic输出的中文系统名(如“Windows Server 2016 数据中心版”)变成乱码,导致客户质疑数据真实性。后来我们把chcp 65001写入所有.bat脚本第一行,并加入校验:if %ERRORLEVEL% NEQ 0 echo Warning: Failed to set UTF-8 codepage。

6. 工具链与环境准备:零依赖、

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询