Hack The Box-Oopsie

Introduction

在寻找 WEB 漏洞时,始终要检查cookie、session,并尝试弄清楚访问控制是如何工作的。在许多情况下,远程代码执行和系统的控制权限可能无法单独实现,而是需要将不同类型的漏洞和利用方法结合起来。在本篇博客中,你将学习到,信息泄露和访问控制漏洞这类看似不太重要的漏洞。即使是小漏洞在攻击时也可能会产生巨大影响。

Write-up

User flag

nmap 扫描端口:

访问 http://10.129.180.28:

打开 BurpSuite 的 Target 模块,Site Map功能可以看到目标网站的结构:

发现了一个登录界面:

以访客身份登录:

唯一可操作的就是 uploads 界面,但是需要超级管理员权限:

一种思路就是查看 cookie 或 seesion,是否有操作空间转换为管理员身份:

可以看到,cookie 中有个值就是 Access ID。那么只需获取到 admin 的 Access ID,就可以伪造管理员身份。而 URL 中有个 id 变量,就可以切换账户。凭此漏洞,我们发现,将 id 改为1,显示出了 admin 的 Access ID:

更改cooike,即可访问 uploads 页面:

这里尝试上传后门失败了,查看题解发现可以上传执行反弹 shell 的文件,插件分析出的语言类型是php。

首先要知道文件上传到哪了。用 gobuster 进行目录爆破:

gobuster dir -u http://10.129.180.28 -w wordlists/dirbuster/directory-list-2.3-small.txt

果然是 uploads 文件夹:

然后上传 PHP 反弹shell。Kali Linux自带此类文件,在 /usr/share/webshells/ 目录下。也可以从BlackArch/webshells: Various webshells. We accept pull requests for additions to this collection.下载。

本机开启一个监听端口:

php-reverse-shell.php 更改主机 ip 和端口:

上传这个文件,然后在浏览器访问我们上传的shell:

http://10.129.180.28/uploads/php-reverse-shell.php

成功执行反弹 shell。

输入 whoami 命令,发现当前用户是 www-data:

在 Linux 系统中,/etc/passwd 是一个非常重要的系统文件,它存储了系统中的所有用户账户信息。每一行代表一个用户的信息,每个字段用冒号分隔:

用户名:密码:用户ID:组ID:注释:主目录:登录Shell

# 用户名(Username):这是用户的登录名,例如 `root` 或 `user1`。

# 密码(Password):通常是加密的用户密码。但在大多数现代系统中,实际的密码通常存储在 `/etc/shadow` 文件中,而不是 `/etc/passwd`。在旧的系统中,这里可能直接保存加密后的密码(如 `x` 或 `*`)。

# 用户ID(UID):用户的唯一数字标识符。每个用户都有一个唯一的 UID,`root` 用户通常是 UID 0

# 组ID(GID):该用户的主组的 GID。每个用户属于一个默认的主组(通常与用户名相同),并且可能属于其他附加组。

# 注释(GECOS):这通常用于存储关于用户的额外信息,如全名、电话号码等。很多系统中,这个字段也可以为空。

# 主目录(Home Directory):用户登录后默认进入的目录。例如,`/home/user1` 是用户 `user1` 的主目录。如果该字段为空,通常表示该用户没有指定的主目录。

# 登录Shell(Login Shell):用户登录后使用的 shell。常见的 shell 如 `/bin/bash`、`/bin/sh` 等。对于不需要登录的用户,可能会设置为 `/sbin/nologin` 或 `/bin/false`。

执行 cat /etc/passwd,发现了两个需要登录的用户:

切换到 /home/robert,发现 user flag:

Root flag

接下来尝试能否切换为 robert 用户。首先要找到登录密码。网站服务器是 Apache,其文件通常托管在 /var/www/html/ 下,在此目录找到了数据库文件 db.php:

su robert切换为 robert 用户,出现错误:

因为我们使用的是一个 php shell,不能算作终端。使用以下命令升级 shell:

SHELL=/bin/bash script -q /dev/null
stty raw -echo
reset
xterm

登录成功:

使用 id 命令用于显示当前用户 ID(UID)、组 ID(GID)以及所属的附加组(group):

观察到用户 robert 属于组 bugtracker 。group(组) 是 Linux 系统中用于管理用户权限的一种机制,可以让一组用户共享相同的访问权限。

查看属于该组的所有文件:

find / -group bugtracker 2>/dev/null

只有一个 bugtracker 文件:

执行以下命令查看文件的详细信息及类型:

ls -la /usr/bin/bugtracker && file /usr/bin/bugtracker

这里需要了解有关 SUID(Set owner User ID)的知识。

在 Unix/Linux 系统中,SUID 是一种文件权限设置。当一个二进制程序(可执行文件)具有 SUID 权限时,它在执行时将继承文件所有者的权限,而不是执行该程序的用户的权限。它的设置通常用来允许普通用户以其他用户的权限(比如 root)来执行某些特定程序,而不需要更高的权限。

执行这个文件:

发现该工具接受用户输入作为 cat 命令读取的文件的名称。但是这个 cat 不是一个绝对路径,所以我们可以插入我们自己构造的 cat 并将其添加到路径中,这样那个 cat 就会以 root 身份执行。

要获取 shell,我们需要打开 /bin/sh,由于 bugtracker 文件以 root 身份执行,因此这将创建一个 root shell。但是不能直接写入 /usr/bin,因为 robert 没有权限。可以把它写在 /tmp下:

# Filename: cat
# Location: /tmp
/bin/sh

这里用 vi 和 vim 都没写成功,最后用 echo 成功了。

echo '/bin/sh' > cat

给 cat 添加执行权限:

chmod +x cat

为了执行这个 cat命令,需要将 /tmp 目录添加到 PATH 环境变量中:

export PATH=/tmp:$PATH

检查环境变量:

再次运行 bugtracker, 此时以获取了 root 权限。

找到 root flag:

Conclusion

本以为这个靶场会做得比较快,大大高估自己了。不过了解到了一些以前从未涉及过的思路,对 Linux 命令和文件系统也更加熟悉了。但是有些知识还是记不住,博客写完了不能就放那不看了,还是得经常回顾。