This just came up on Bugtraq. 


> Date:     Sat, 13 Nov 1999 10:46:51 -0800
> From:     Blue Boar <[EMAIL PROTECTED]>
> Subject:  ssh-1.2.27 remote buffer overflow - exploitable (VD#7)
> To:       [EMAIL PROTECTED]
> 
> 
> There appears to be a serious vulnerability in ssh 1.2.27.  I will let the
> folks who worked on this issue describe.  There was brief discussion on
> vuln-dev on the politics of ssh 1 vs. ssh 2, etc...  you may or may not
> want to play that out on Bugtraq.  One of the key points of the SSH 1 vs.
> SSH 2 debate is regarding licensing.  Basically, because of a less strict
> license on SSH 1, more folks are likely to be running that version.  (This
> is all referring to the Datafellows implementation that everyone uses,
> rather than standards and protocols, I presume.)
> 
> As usually, check the vuln-dev archives if you want the full story.  This
> isn't necessarily a dead topic there yet, but this issue should get out
> there sooner rather than later.
> 
>                                       BB
> 
> -------------------------------------------------------------------
> 
> To:         Exploit-Dev
> Subject:    ssh-1.2.27 remote buffer overflow - exploitable
> Date:       Mon Nov 08 1999 16:48:53
> Author:     Frank
> Message-ID: <[EMAIL PROTECTED]>
> 
> This is submitted to the Freebsd bug tracking system, although there are
> doubtless other vendors who leave this package, despite the existence of
> the ssh-2.X.   While Debian appears to be immune, I was able to crash my
> ssh daemon (much to my dismay), and there appears the potential to execute
> arbitrary code, as long as you encrypt it first...
> 
> Here is the freebsd report.. it describes the method to crash a remote Ssh
> daemon (lets hope you ran sshd from your xinetd, etc).
> 
> http://www.freebsd.org/cgi/query-pr.cgi?pr=14749
> 
> -------------------------------------------------------------------
> 
> To:           Exploit-Dev
> Subject:      Re: ssh-1.2.27 remote buffer overflow - exploitable
> Date:         Mon Nov 08 1999 21:04:19
> Author:       Daniel Jacobowitz
> Message-ID:   <[EMAIL PROTECTED]>
> 
> <SNIP>
> Debian is immune for the (somewhat messy) reasons that they do not link
> ssh to rsaref, last time that I checked.
> <SNIP>
> 
> -------------------------------------------------------------------
> 
> To:           Exploit-Dev
> Subject:      Re: ssh-1.2.27 remote buffer overflow - exploitable
> Date:         Mon Nov 08 1999 21:24:17
> Author:       Daniel Jacobowitz
> Message-ID:   <[EMAIL PROTECTED]>
> 
> <SNIP>
> And here's a patch.  Not tested, as I don't use the rsaref glue on any
> machine here.
> <SNIP>
> 
> Ed: Patch can be found at:
> 
> 
>http://www.securityfocus.com/templates/archive.pike?list=82&date=1999-11-08&[EMAIL PROTECTED]
> 
> -------------------------------------------------------------------
> 
> To:          Exploit-Dev
> Subject:     Re: ssh-1.2.27 remote buffer overflow - exploitable
> Date:        Tue Nov 09 1999 04:42:16
> Author:      Jochen Bauer
> Message-ID:  <[EMAIL PROTECTED]>
> 
> I've taken a closer look at the problem. Here's my analysis:
> 
> In sshd.c, around line 1513 the client-generated session key,
> that has been encrypted with the server and host public keys,
> is received from the client as a multiple precision integer.
> 
> /* Get the encrypted integer. */
>   mpz_init(&session_key_int);
>   packet_get_mp_int(&session_key_int);
> 
> The encrypted session key is then (around line 1525) passed
> to rsa_private_decrypt to do the first part of the decryption,
> which is either decryption using the server private key or
> decryption using the host private key, depending on which key
> has the larger modulus.
> 
> rsa_private_decrypt(&session_key_int, &session_key_int,
>                           &sensitive_data.private_key);
> 
> If RSAREF is used (i.e. RSAREF is defined in the code), the
> rsa_private_decrypt function in rsaglue.c (around line 162)
> looks like:
> 
> void rsa_private_decrypt(MP_INT *output, MP_INT *input, RSAPrivateKey *key)
> {
>   unsigned char input_data[MAX_RSA_MODULUS_LEN];
>   unsigned char output_data[MAX_RSA_MODULUS_LEN]
>   unsigned int input_len, output_len, input_bits;
>   [...]
>   input_bits = mpz_sizeinbase(input, 2);
>   input_len = (input_bits + 7) / 8;
>   gmp_to_rsaref(input_data, input_len, input);
>   [...]
> }
> 
> The trouble spot is the fixed length buffer
> input_data[MAX_RSA_MODULUS_LEN]. A pointer to this buffer is
> passed to the conversion function gmp_to_rsaref along with a
> pointer to the encrypted session key and the length (input_len)
> of the encrypted session key, which may be greater than
> [MAX_RSA_MODULUS_LEN]. gmp_to_rsaref (located around line 79 of
> rsaglue.c) simply calls mp_linearize_msb_first(buf, len, value).
> 
> void gmp_to_rsaref(unsigned char *buf, unsigned int len, MP_INT *value)
> {
>   mp_linearize_msb_first(buf, len, value);
> }
> 
> mp_linearize_msb_first is contained in mpaux.c around line 41.
> The function looks like:
> 
> void mp_linearize_msb_first(unsigned char *buf, unsigned int len,
>                             MP_INT *value)
> {
>   unsigned int i;
>   MP_INT aux;
>   mpz_init_set(&aux, value);
>   for (i = len; i >= 4; i -= 4)   <-------
>     {
>       unsigned long limb = mpz_get_ui(&aux);
>       PUT_32BIT(buf + i - 4, limb);   <-------
>       mpz_div_2exp(&aux, &aux, 32);
>     }
>   [...]
> }
> 
> There's the overflow! len is the length of the encrypted session
> key, while buf is a pointer to the fixed length buffer
> input_data[MAX_RSA_MODULUS_LEN] and no check wether len is
> greater than MAX_RSA_MODULUS_LEN is performed. The fix should be
> obvious!
> 
> About the possible exploit:
> 
> In this particular overflow, the encrypted, client generated session
> key has to be taken as the exploit buffer. I.e. the shellcode, NOPs
> and jump address has to sent to the server instead of the encrypted
> session key. To make that clear: The shellcode, NOPs and jump address
> don't have to be encrypted as they are taken as the ENCRYPTED session
> key.
> 
> However, the data that is finally written into the buffer are the
> limbs of the multiple precision integer that session_key_int is
> assumed to be. The exploit buffer code therefore must be converted
> into a multiple precision integer, which upon extraction of the limbs
> into the buffer yields the correct exploit buffer code. The best way
> would probably be to start from the exploit buffer as it should finally
> be to overflow the target buffer and use the functions of the GNU
> multiple precision integer library to reverse the procedure happening
> to the encrypted session key in the sshd code step be step, leading to
> the exploit buffer that has to be sent instead of the encrypted session
> key.
> 
> That may be difficult, be it think it's possible.

-- 
-- v --

[EMAIL PROTECTED]

Reply via email to