油炸小可爱|黑客大神谈一谈Linux与suid提权( 三 )


那么我们可以来看看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 (!onsetgid(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:


推荐阅读