linux kdb内核调试器,linux系统通过内核调试器kdb获取root权限

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信息

1109ed2810c25039cae01dcff46b4c56.png

图5-1

??执行命令ps

??kdb中ps命令列出包括shell进程在内的所有进程的struct task_struct结构的虚拟起始地址,下图是shell task_struct的相关信息:

7ed94ee3ebd96b5003249f4159eaf218.png

图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

119ead82552dcb92ed291a697aef9a78.png

图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

e86bdf9d7fa6066b3b49660428602251.png

图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

bd67c49802576a15fd427216c0e88b96.png

图5-5

??执行命令go

??这时候shell提示符已经由’$’变成’#’

??执行id命令查看登录shell的uid与gid都是500

c1858f18474bb759861cacdd7759fc02.png

图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权限相关教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值