EXPLOTANDO VULNSERVER

Hola, en mi entrada anterior PREPARANDO EL ENTORNO DE EXPLOITING habíamos hablado de cual era la finalidad del blog y adicionalmente recomendaba las herramientas que íbamos a usar durante el transcurso de este camino, antes de empezar a resolver CVE es importante empezar por algo básico para entender los conceptos de explotación y no enredarnos a la hora de reversar la aplicación, a veces los softwares comerciales son demasiado grandes, y empezar de esa forma creo que no es lo ideal.

¿ A qué nos enfrentamos?

VulnServer es un software que sufre de una vulnerabiliad denominada StackBufferOverflow y su principal función es la de crear un servidor Web abriendo un puerto en la máquina que lo ejecute y recibir cualquier petición HTTP.

Lo que necesitamos

Para solucionar este software necesitamos de las siguientes herramientas:

  • IDA PRO 6.8/7.0
  • SublimeText/PyCharm
  • TcpView de sysinternals
  • IDA Sploiter
  • VulnServer que puedes descargarlo desde mi repositorio en github aqui

Reversando la aplicación

Bueno ha llegado la hora de la acción y lo primero que haremos será abrir el archivo ejecutable desde ida pro, ya que para hacer un análisis estático, prefiero utilizar este debugger, ustedes pueden elegir el que deseen, los cuales recomendé en la entrada PREPARANDO EL ENTORNO DE EXPLOITING, este análisis se hará para este caso lo más manual posible sin utilizar scripts automatizados que nos arme todo, sino que lo haremos lo más estático posible para entender que es lo que sucede.

Hemos cargado el ejecutable en ida pro, entonces ya podemos realizar un análisis estático preliminar para ver si podemos encontrar algo interesante sin tener que hacerlo de la forma dinámica.

Si nos fijamos en la siguiente imagen, IDA es un muy inteligente ya que nos ha renombrado algunas variables dentro del main del ejecutable como Buf, LocalPort, SockVersion, ServerSocket, Message por lo cual nos da un pequeño indicio de que estamos tratando con un software que utiliza socket para comunicarse.

Si bajamos un poco más exactamente en la dirección de memoria en mi caso 0x00401363 podemos ver la instrucción lea, la cual obtiene la dirección de memoria de la variable Buf, verifiquemos si se trata de un buffer y de que tamaño es.

Para ir a Buf nos situamos sobre la palabra y damos doble click izquierdo sobre ella.

Al parecer estábamos en lo correcto, generalmente cuando se desea acceder a un buffer muchas veces es lógico que obtengamos un puntero hacia dicho buffer para acceder a el con la instrucción LEA, miremos de que tamaño es dicho buffer, para eso si nos situamos sobre la palabra, damos click derecho y seleccionamos array.

Podemos observar su tamano en bits, lo cual indica lo siguiente:

Cada posición del arreglo es de 1 bits y su total 2000, lo que seria 2000*1 = 2000 bits, si pasamos esto a DWORD nos daría 2000/4 = 500, a demás sabemos que la representación de una letra como en el caso de la letra «A» = 8 bits/4 bytes.

Entonces cerramos la ventana y convertimos a bytes el array posicionándonos sobre la palabra buf y presionando la tecla d dos veces hasta obtener en la primera posición este resultado.

Ahora si damos click derecho sobre la palabra buf veremos que ha cambiado a valor por posición 4 bytes y total de 500.

Si presionamos en ok veremos el resultado final, adicionalmente cambiaré el nombre de la variable a buf->p_buffer_500_dword, para cambiar el nombre damos click derecho sobre el buffer y presionamos rename o la tecla N.

Asi creo que podemos trabajar mejor, si regresamos nuevamente al main veremos los cambios reflejados.

Vemos más abajo en la dirección 0x401376 que se mueve el valor 0x1F90 a la variable LocalPort, seguramente ese es el puerto por donde la aplicación va a correr, si nos situamos sobre dicho valor damos click derecho nos aparecerá la forma en como queremos representar dicho valor, presiono el que muestra en decimal y seria 8080 , ahí esta el puerto por donde correrá nuestro VulnServer.

Agregare un comentario a dicha instrucción para que sepamos que ahí es donde se asigna el valor al puerto del servidor.

Vamos un poco más abajo específicamente en la dirección de memoria, 0x4013A2 vemos el llamado a una función socket, que recibe tres parámetros, observamos los push anteriores a la llamada de la función: address family, type, protocol, esto lo podemos aclarar un poco en la página oficial de microsoft.

Ya con esto aclaramos todo para verificar que utilizaremos la función socket para nuestro VulnServer, vamos avanzar o si no esto será demasiado largo, si recorremos la linea verde que es lo ideal donde nuestro software se levantaría sin ningún problema, veremos funciones como listen, bind las cuales son funciones que van a levantar nuestro server.

Vemos en el camino un segundo buffer de nombre Message este tiene un tamaño más grande de 1250 dword.

Este buffer es utilizando en la función recv, realmente cuando uno esta analizando software que sean de tipo server web o utilicen conexiones por socket los puntos más importantes para analizar son las funciones recv, ellas son quien reciben los datos de parte del cliente, en este caso veamos la estructura de la función recv desde MSDN.

Dicha función recibe 4 parámetros:

Un flag, un tamaño, un puntero al buffer, y el descriptor que identifica el socket.

Veamos esto en nuestro ida con el buffer Message.

Si buscamos referencias a nuestro Message->p_buffer_1250_dword presionando la tecla x sobre el nombre vemos 3 referencias, vamos a la tercera que nos indica que hay un uso más abajo del que acabamos de analizar.

Damos en ok y llegamos a una función, en la dirección 0x4014E5

Si observamos detenidamente, se obtiene el puntero al buffer Message->p_buffer_1250_dword y se guarda en edi, y por consiguiente se pasa como parámetro a la función _pr, entonces vayamos a la función _pr dando click sobre ella y miremos que hace con este buffer.

Vemos que el puntero al buffer se paso como argumento y que posiblemente sera utilizado mas adelante, si nos fijamos observamos otro buffer con el nombre buf, que tiene un tamaño de 500 dwords, y vemos algo mas sospechoso todavía, se utiliza la función strcpy para copiar datos del buffer de 1250 dwords al de 500 dwords, creo que acá esta el problema de desbordamiento 🙂

Veamos un poco de la función strcpy en MSDN, esta recibe dos parámetros una fuente de copia de datos y un destino, en este caso source seria el buffer de 1250 dwords y destino buffer de 125 dwords.

Pero cuanto necesitamos realmente para controlar EIP, o el Return Address, si vamos al buffer de 500 dwords y seleccionamos hasta el Return Adress «r» podemos hacer cuentas.

Necesitamos 504 A’es para llegar al return address, y 4 más para llenarlo creo que ya podemos empezar armar nuestro exploit y hacerlo crashear.

Armando nuestro exploit, en python.

Ya con todo el análisis estático que hicimos podemos armar nuestro exploit en python, este exploit esta dividido en 3 partes.

  1. Una función llamada pattern_create, la cual recibe como parámetro dos argumentos, la primera es la función que vamos a utilizar para crear basura o el patron de caracteres, y el segundo argumento es el tamaño. El patrón de caracteres se crea al estilo metasploit que nos servirá para identificar donde sobre escribimos el Return Adress o EIP, el segundo podría ser crear 500 A’es o el carácter que queramos.

2. Una función llamada pwned, la cual recibe como parámetro 3 argumentos que son los siguientes:
_host -> dirección ip de maquina víctima
_port -> puerto del servicio vulnerable
_payload -> carga util que enviaremos hacia el servicio vulnerable (código malicioso)

3. Una función main o principal, la cual es la que mantiene los parámetros que serán enviados a las funciones anteriores.

Controlando EIP con nuestro exploit en python.

Hasta acá podemos hacer nuestra prueba de concepto, saber si nuestros cálculos si son y si adicionalmente podemos controlar EIP o Return Address, para eso voy armar mi exploit enviando 500 A’es y 4 B’s.

Mi exploit para este POC quedaría así:

Pongo en acción mi VulnServer haciendo doble click sobre el, y abro TcpView para ver si el puerto que identificamos en el análisis estático es correcto.

Ahora tiramos nuestro exploit de la siguiente manera.
python my_exploit.py

Baaaaang, hemos sobre escrito el return Address de nuestro VulnServer, pero verifiquemos si podemos brincar a nuestra pila directamente, este programa no tiene protecciones como DEP ni ASLR por lo que será más fácil, luego veremos con más calma eso, después de nuestro EIP colocamos un poco de basura para ver hasta espacio tenemos para nuestro shellcode.

Para ello vamos hacer dos cosas:

1. Modificar el exploit agregando la basura que queremos.
2. Corremos el VulnServer atachamos con el IDA y ejecutamos el Exploit.

En la siguiente imagen vemos claramente que el stack o pila esta llena de nuestros Nop’s o 90 por lo cual podemos colocar nuestra shellcode ahí y buscar gadget como CALL ESP, JMP ESP, PUSH ESP RETN para que salte a nuestra pila.

Buscando nuestro salto a ESP.

Habíamos dicho que íbamos a poner nuestra shellcode justo después de donde controlamos EIP o sea en nuestro stack en este caso, utilizaré un plugin para IDA llamado IDA sploiter el cual deje el enlace de descarga en el apartado lo que necesitamos, y con ello ubicaremos nuestro gadget.

Entonces:
Abrimos el VulnServer en IDA PRO lo ejecutamos y luego lo pausamos, vamos a View->Open Subviews->Modules.

Si observamos podemos encontrar varias cosas muy importantes en el módulo de Ida Sploiter, como la identificación de que módulos tienen protecciones y si empiezan con bytes nulos.

Damos click derecho sobre el modulo crtdll.dll y damos en Search Gadgets y escribimos los gadgets que necesitamos, yo hice mi búsqueda y encontré un push esp ret, así que utilizaremos ese.

Exploit final en python.

Bueno es hora de hacer cuentas, sabemos lo siguiente necesitamos 504 A’es para pisar EIP + 4 para rellenar EIP que sería nuestro Gadget + Nops + shellcode.

500A’es + EIP + 20Nops + Shellcode.

Por mi parte tengo un shellcode que ejecuta la calculadora en Windows 10 así que eso bastará para el POC, entonces mi exploit final será este, el cual dejo el enlace para que lo descarguen.

Solo nos queda correr nuestro VulnServer y ejecutar nuestro exploit y obtendremos lo siguiente.

Migrando Nuestro Exploit a Metasploit.

Ya casi hemos llegado al final de nuestra entrada Explotando VulnServer y creo que ya es hora de migrarlo a metasploit, para eso voy a subir la plantilla final del exploit y cuales son los items más importantes de su contenido.

Como se puede apreciar es muy corta la plantilla, ya que metasploit ha minimizado muchas cosas para la explotación, solo para migrarlo Metasploit , describiré los parámetros fundamentales para que este exploit sea funcional:

  • EXITFUNC -> Esta opción EXITFUNC establece efectivamente un hash de función en la carga útil que especifica una DLL y una función a la que llamar cuando se completa la carga útil.
  • Space -> Es el espacio mínimo que necesitamos para alojar nuestro payload o código malicioso.
  • Badchars -> Son los caracteres que queremos evitar para que nuestro payload no pare su ejecución, como terminadores de string en el caso de 0x0d o bytes nulos como 0x00.
  • Offset -> cuanto es lo que necesitamos para pisar el Return Address o EIP
  • RPORT -> sabemos que por defecto este corre en el puerto 8080 así que lo colocamos por defecto de una vez en el exploit.

Lo siguiente que haremos será copiarlo a la ruta en donde tengamos metasploit en kali linux suele estar en /usr/share/metasploit-framework/ 

Como nuestro exploit es para windows y es adicionalmente a un server web podemos colocarlo en la siguiente ruta:
/usr/share/metasploit-framework/modules/exploits/windows/http/

A continuación dejo el link para descargar el módulo de metasploit, los símbolos creados por IDA PRO cuando hicimos el reversing.
Puedes ir al repositorio de VulnServer aquí

Video de la ejecución del exploit desde una máquina kali linux hacia mi víctima Windows 10 PRO.

Conclusion

Bueno hasta acá estuvo esta segunda entrada, si llegaste hasta aquí déjame
felicitarte, estuvo un poco largo pero lo ideal es que hayas aprendido algo, y sobre todo que tengas algo para ir aprendiendo.
Si quieres animarme puedes hacer dos cosas:

1. Migrar el exploit a windows XP y Windows 7 y 8 como tarea.
2. Invitarme un cafe desde aquí

Agradezco a todos por seguir mis entradas y leer esto que comparto, abrazos.

happy hacking, Cracking and exploiting…
@sasaga92

Deja un comentario

Web construida con WordPress.com.

Subir ↑