Hackthebox - Backend
Backend
10.10.11.161
nmap
gobuster 扫描结果
还是第一次在 API 上用这种工具,如果真的需要这样测试 API 的话,应该需要一层一层地扫吧。
但是这里就给出了一些提示信息,不需要那么繁琐了。
曾经开发过 API 的经验告诉我,这里后面还可以接 URL 的 param,放进扫描器扫一下。
/api/user/FUZZ 扫描结果
POST
扫到了两个 API,登录和注册。response 中有这个 API 的参数,或许我可以尝试注册一个用户试试。
GET
GET 扫到了一个用户
对 /api/v1/user/signup 的测试
一开始并没有告诉我们应该传哪些参数,那么我们随便构造一个试试。
可以看到有 jsondecode 的错误,我们构造一个 json格式的试试。
这次总算告诉我们应该传哪些参数了,构造一个。
201 Created,我们去登录 API 登录一下试试。
对 /api/v1/user/login 的测试
成功登录,返回了 jwt 的 bearer token,带上这个 token 我们去试试看 /docs。
/docs
在 burp 中拦截了 /docs 的请求,在其中加上 Token 后,我们来到了这个页面。
这样我们就可以看到 API 文档了,对后面的渗透非常有帮助。
非常方便的登录
/api/v1/admin 接口测试
这个接口注册的用户不可以访问
我发现更新密码的接口似乎并不在 admin 的路由下,难道说所有的用户都可以更新密码?那么这里就存在越权漏洞了。
我更新一下 admin 用户的密码是不是就可以用 /admin 的接口了?我来试试。
首先这个接口需要用户的 guid,我来看看 admin 的 guid 是多少。
可以看到 admin 用户的 guid,更新一下密码。
成功更新了 admin 用户的密码,我来登录一下试试。
成功登录了,那么。
读取文件的接口可以用了,我有了一个任意文件读取的漏洞。
看来这个接口的权限还不够高,我需要进一步的提权。
下面还有一个命令执行的接口,我来调用一下试试。
看来还需要我改一改这个 JWT,那么应该从何入手呢?或许可以在上面那个读文件的点找找源码看看。
任意文件读取
读到了这个应用的运行目录,再找找源码文件。
app.main,那么入口文件名就是 main.py,组合起来就是 /home/htb/uhc/app/main.py,我读一下试试。
拿到了 main.py 的源码,这里看起来很乱,我的诀窍就是,既然文件是 python 读出来的,那么就用 python 写回去。
完美。
读源码,根据引入的包一路跟进到 /home/htb/uhc/app/api/v1/endpoints/admin.py,可以看到这个 debug key 的校验逻辑:
只要有 debug 这个键就可以了,那么我生成一个有这个键的 token 就可以了,生成 token 需要用到 jwt 的 key,我来找一下。
于是在 /home/htb/uhc/app/core/config.py 中,我找到了 jwt_secret:SuperSecretSigningKey-HTB,接下来去 jwt.io 改一下 token。
成功 RCE。
RCE 反弹 shell
我在任意文件读取漏洞中获取到了 JWT SECRET,成功调用了可以 RCE 的 API,接下来反弹一个 shell。
因为参数是在 url 中传递的,这里需要进行一个 base64 编码减少不能使用的特殊字符。
提权
反弹 shell 后,看一下目录结构。
在 auth.log 中可以找到一次登录失败的记录。
这里要想到的是,登录失败可能是错将用户名填为了密码。
成功用 Tr0ub4dor&3 登录 root 账户,这台机器到这里就结束了。
一点感受
这台机器不同于以往做过的所有 web 相关的机器,这台机器是直接对 API 做测试。
不像有前端页面的程序,没有了前端代码写好的请求操作,API 具体怎么用还是要看 API 在调用错误的时候有没有提示。
这个 API 如果没有提示信息,就需要我一层一层地扫进去,应该会非常的耗时间。
对这类 API 的渗透测试,一旦找到了调用文档,那么后面就会事半功倍。
这个 API 还好,是用 Python 写的,而且有读文件的点可以直接读到源码,如果是其他编译型的语言比如 Golang,
就算是有读文件的点,也需要进行逆向的工作,应该会比这个有难度的多。
还有就是可以在 /proc/self 下面读到很多信息,之前在做一个 ctfshow 的题的时候用到过这个点,就没有很陌生了。
除了最后提权部分这个密码不太好想到,还是第一次做这种 web 程序渗透,以后面对这种也有了一个大体的思路。