RetoNavideno2011

From Sec-Track Wiki
Jump to: navigation, search

SOLUCIONARIO RETO NAVIDENO 2011 (by nonroot)

http://nonroot.blogspot.com/


Quisiera explicar algunos puntos sobre el reto que pueden ayudar a que los que comienzan a jugar este tipo de desafios se puedan orientar mejor:

a. La mayoría de los retos de nivel básico, medio y un poco avanzados van a buscar que interactuemos con herramientas conocidas, pocos retos intentaran que descubramos nuevas técnicas o nuevas herramientas.

b. Lo primero que debemos identificar es el QUE?, esto significa QUE es lo que se quiere lograr, entenderlo bien, una vez lo tenemos claro pasamos al COMO?, que es la parte que nos obliga a encontrar recursos que puedan solucionar el problema.

Desde mi punto de vista el QUE siempre será mas complicado pues se requiere conocimiento para poder identificar QUE es lo que se quiere hacer. Si no tenemos el conocimiento de un tema especifico siempre podremos descubrirlo en el camino, pero será mas dificil.

En los solucionarios se suele mostrar el COMO, pero casi nunca el procedimiento o la metodologia para explicar como se encontró el QUE. Eso es algo que siempre trato de hacer, quizas por mi vocación de docente, pero obviamente no es obligación para los que escriben los solucionarios. En el solucionario de ActivaLink se pueden ver algunas explicaciones ;) http://mirror.activalink.org/writeup_I_reto_navideno_intercepteam.txt Bien por eso.


Ahora si, sobre el reto:

1. Encuentra a Villa Quien.

El reto empezaba pidiendo que se encontrara a Villa Quien, eso se puede considerar el primer desafio.

QUE?: Encontrar a villaquien, que puede ser VillaQuien?, villa quien es un lugar, pero no un lugar físico, el reto no lo pide, es un lugar donde pueda seguir jugado.

- Villa quien debe estar en la misma maquina o en el mismo dominio

- Villa quien hace parte del comienzo del juego, asi que no debe ser tan dificil encontrarlo

- La palabra Status empieza con mayusculas, otros contenidos también, asi que VillaQuien debe escribrise de esa forma, en mayusculas la primera letra.

COMO?: si concluí que VillaQuien debe ser un directorio o un subdominio del sistema, entonces debo usar un script para buscar las posibilidades, en este punto es necesario usar herramientas que automaticen el proceso de busqueda, son conocidos como spiders, bruteforce directories, directory scanners, etc. Tambien buscadores de virtualhosts o subdominios, cosas como : nikto, dnsenum, dirb, etc.

Lo que hice fue crear una lista de posibles palabras:

diccionario.txt
...
villaquien
v1ll4Qu13n
Villaquien
VillaQuien
...

Creo que me entienden la idea, luego uso los programas con este diccionario para encontrar finalmente el directorio.

Con el tiempo este tipo de cosas se podrán deducir, pero al principio es bueno que se acostumbren a ser metodologicos en el proceso, pues es donde se da la verdadera formación (análista de vulns, penetration tester, etc)

2. Si ya entramos a VillaQuien, encontramos una imagen llamada VillaQuien.png

root@bt:~# ls -laH VillaQuien.png
-rw-r--r-- 1 root root 896931 2011-12-21 18:45 VillaQuien.png
root@bt:~# file VillaQuien.png
VillaQuien.png: PNG image, 739 x 540, 8-bit/color RGBA, non-interlaced
root@bt:~#

QUE?: Pues en el código fuente encontramos la pista:


Así que necesitamos ubicar un lugar, quizas un directorio dentro de otro directorio, así que podemos repetir el proceso visto en 1. o Quizas debemos bajar la imagen y tener otro enfoque.

Es posible que la imagen fuera de autoria de los desarrolladores del juego, pero también es posible que sea bajada de algún sitio. Lo que hago cuando tengo una imagen es:

- Buscarla en tineye.com para verificar que existe en otro lugar comparar sus tamaños originales y deducir si la imagen del juego tiene mas o menos contenido.

- Analizar la imagen para identificar el uso de esteganografia. En este punto es muy complicado detectar si la imagen tiene algo adentro, pues existen mil tecnicas para esconder cosas en las imagenes y desafortunadamente no hay herramientas automatizadas para perfilar completamente una imagen (alguien se anima a codear el proyecto?) con todas las tecnicas actuales. Herramientas como stegdetect estan muy desactualizadas.

La imagen encontrada no coincide con las originales de internet, eso nos dice que tiene algo adentro, así que ya identificamos el QUE.


COMO?: Ahora lo que hay que hacer es sacar lo que tenga, lo mas básico es usar el comando strings que nos permite extraer cadenas de texto de la imagen que nos pueden dar pistas (un intruso podría generar pistas falsas, un reto avanzado también). Con strings vemos algo como directorio.txt, así que esta palabra puede ir a nuestra lista del punto 1.

Podemos usar foremost o scalpel (mejor despues del tunning) para sacar cabeceras y data válidas de un archivo:

root@bt:~# foremost VillaQuien.png
Processing: VillaQuien.png
|*|
root@bt:~# ls -laR output/
output/:
total 20
drwxr-xr--  4 root root  4096 2011-12-18 16:21 .
drwxr-xr-x 48  504 staff 4096 2011-12-18 16:21 ..
-rw-r--r--  1 root root   738 2011-12-18 16:21 audit.txt
drwxr-xr--  2 root root  4096 2011-12-18 16:21 png
drwxr-xr--  2 root root  4096 2011-12-18 16:21 rar

output/png:
total 884
drwxr-xr-- 2 root root   4096 2011-12-18 16:21 .
drwxr-xr-- 4 root root   4096 2011-12-18 16:21 ..
-rw-r--r-- 1 root root 895675 2011-12-18 16:21 00000000.png 

output/rar:
total 12
drwxr-xr-- 2 root root 4096 2011-12-18 16:21 .
drwxr-xr-- 4 root root 4096 2011-12-18 16:21 ..
-rw-r--r-- 1 root root 1254 2011-12-18 16:21 00001749.rar
root@bt:~# 

Como se dan cuenta, sale una imagen y un archivo .rar

root@bt:~/output/rar# rar x 00001749.rar 
RAR 3.90 beta 2   Copyright (c) 1993-2009 Alexander Roshal   3 Jun 2009
Shareware version         Type RAR -? for help 


Extracting from 00001749.rar 
Extracting  directorio.txt                                            OK
All OK
root@bt:~/output/rar#


root@bt:~/output/rar# cat directorio.txt
�Necesitas ir a algun lugar en especifico?
En este archivo est� listado todo VillaQuien:

d1c8790e959f343f23cb6383135d914e
1db17e7a63db949ecd092367f1ac44c0
b2d99fafe2f53a6d70639175707e122a
3c2dcdb4074dbf60f8125cd55945ce9b
...

el archivo tiene un monton de hashes, seguimos entonces ...


3. El listado de hashes es otro paso mas:


QUE? puedo intentar romper los hashes para saber si son pistas o como me informan que esos hashes estan en VillaQuien puedo deducir que son subdirectorios, así que pruebo un par de los mismos y encuentro que generan mas pistas...

COMO? El archivo estaba hecho desde windows, así que tenia caracteres extraños al finalizar cada linea, por eso hay que correr el comando:

root@bt:~/output/rar# dos2unix directorio.txt
dos2unix: converting file directorio.txt to UNIX format ...
root@bt:~/output/rar#

Para dejarlo en formato de unix, así podemos correrle un script que tome cada linea y descargue el mensaje y luego filtrar lo que sea diferente, como se ve en la imagen.

4. En el nuevo sitio encuentro un formulario de registro

QUE?

-puede ser que me tenga que registrar para seguir jugando, pero no funciona -puede ser que sea vulnerable a SQLi, XPATHi, *i, pero no veo errores y parece que no es por ahí -examino el código fuente, ya que los mensajes de error son en JavaScript -Hay una imagen de la biblioteca, repito el procedimiento de 1 y 2 para esta imagen -Finalmente la opción mas viable es examinar el código fuente del javascript

COMO?

Bajo los java script y veo que estan codificados en algo diferente a ascci, así que lo decodifico: Buscan en google HTML encoding y pueden encontrar herramientas para decodificar.

Encuentro código relacionado con la libreria jsencrypt hecha en javascript: http://www.vincentcheung.ca/jsencryption/

5. Tengo un código con jsencrypt

 root@bt:/var/www# cat reto.html
 <html>
 <script src="jsencryption.js"></script>
         <a href="javascript:decryptText('bLSWTbvi')">Ver el libro</a>
 </html>
 root@bt:/var/www# 

QUE? - Es vulnerable la libreria? (alguien ya la estudió?)

- Hay bugs reportados?, exploits?

- Hay forma de hacerle fuerza bruta a la clave para decodificarla?

-Hay forma de adivinar la clave¿

Afortunadamente hay pistas: Quien escribio el documento que necesitas?

COMO? Busco en la historia, en las pistas anteriores y encuentro que la clave es el nombre de la niña.


6. Encuentro una URL RetoNavidad.php que me permite seguir

QUE?

Me encuentro un texto:

                         Ya lo DIce eL grAN MANUAl
                       eL aLEgRE mAeSTre De lA navIdad
              es El MerecEdoR De Un BRiNDIs y Una pAlmAdA DETras
                    y SEra AQuEL almA que Lo nEcesitE mas
                      NO haY otRo mAS fALto dE felIcIdaD
                    Que quiEn vIvE al norTE dE ESTe lugaR
                      Y pARa AVisaRle dE su OportuNidaD
                       Al mOntE crUMpIT debO ViaJaR...

El texto parece normal a simple vista y parece un fragmento de la pelicula. Sin embargo en este punto podemos quedar estancados si no sabemos de que se trata:

- Puede ser un mensaje clave para deducir otro subdirectorio - Puede ser el frangmento de un archivo y la siguiente pisa esta en dicho archivo - Puede ser un mensaje para despistar

En este caso la forma de saber QUE es lo que hay que hacer viene de estar pendientes de las redes sociales y recordar que @hecky escribió un software para ocultar texto dentro de otro texto. Inmediatamente buscamos el programa que se usa y extraemos el mensaje original.

Existen muchas herramientas en Internet, lo importante es saber donde estan y cuando usarlas.

COMO?

Visitamos el sitio y decodificamos : http://neobits.org/tools/horrografia

7. Acceso a un Servidor SSH

Entramos al servidor:

QUE?

Encontramos un archivo ejecutable y un entorno CHROOT que no permite sino ejecutar un par de comando básicos. Se supone que si esta ese archivo ejecutable lo debemos ejecutar (en un reto avanzado, ejecutar el binario puede hacer que se autoelimine, o se renombre o se esconda o lo que sea, eso hace el malware, así que se tendría que hacer diferente).

no tengo cat, less, more, vi, vim, joe, ed, mc, nada de eso??? *

COMO?

Tenemos bash!, bash tiene inbuilt varias funciones, como las de programación o ciclos básicos.

que tal si usamos un script en bash para leer archivos?

while read line; do a=$(($a+1)); echo $line; done < ARCHIVO

Osea que podemos leer algo y volcarlo a otro archivo que si podamos sacar del sistema:

while read line; do a=$(($a+1)); echo $line; done < ARCHIVO_IN > ARCHIVO_OUT

Sin embargo los permisos del archivo son de solo ejecución. Así que con esto se pueden hacer otras cosas, pero no leer el archivo del perro.

Como el caso no es ese, podemos ejecutarlo y nos aparecen los ladridos de un perro.

haciendo un:

while :
do
./archivo_ejecutable
done

Aparace el mensaje de pista que esta en las imagenes.

8. Una nueva pista en los ladridos

Solucion: El confia en mi, encuentralo tras la puerta 21. att:max

QUE?

Esta pista no dice mucho si no estas en el área de networking, pero la puerta 21, se puede asociar al puerto 21, que por omisión es para el canal de comando del servidor FTP (en un juego mas avanzado se puede crear un servicio FTP propio que sea explotable o usar un servicio diferente en ese puerto, hacer port knocking o cualquier otra cosa loca)

-Se me ocurre atacar el FTP con fuerza bruta de usuarios, todas las palabras recolectadas hasta el momento, lo hashes, los nombres de los usuarios bajados del sistema

root@bt:/var/www# cat passwd
root:x:0:0:root:/root:/bin/bash
fity:x:1004:1005::/home/fity:/bin/bash
fity:x:1004:1005::/home/fity:/bin/bash
yeison:x:1005:1006::/home/yeison:/bin/bash
yeison:x:1005:1006::/home/yeison:/bin/bash
shellfity:x:1004:1008::/home/shellfity:/bin/bash
final:x:1005:1009::/home/final:/bin/bash
porfin:x:1006:1010::/home/porfin:/bin/bash
cindy:x:1007:1011::/home/cindy:/bin/bash
cindy:x:1007:1011::/home/cindy:/bin/bash
nuevo:x:1008:1012::/home/nuevo:/bin/bash
cindy:x:1009:1013::/home/cindy:/bin/bash
root@bt:/var/www#

-Se me ocurre un exploit remoto para el VSFTPD (Aunque el banner puede ser modificado) -Se me ocurre ingresar con usuarios anonymous y tratar de ingresar, pero nada funciona.

COMO?

La sintaxis att:max finalmente da para pensar que el usuario es att y la clave es max. Algo que ayuda a reafirmar esto son las claves cortas usadas con el usuario cindy, cuya clave era lou (3 letras, quizas pensando que alguien podría hacer bruteforce ;) bien por eso).

Una vez adentro se intenta subir archivos, escaparse del directorio, etc.

9. Descargo el archivo Llamado.py

Un script en python, que hago?

QUE?

-Lo leo, lo entiendo (hay que saber un poco de programación de sockets para entenderlo, aunque el codigo es corto y sencillo) -Intento buscar scripts en el sistema web:

Llamado.py
Call.py
Server.py
Recibido.py
Bajar.py
Colgar.py

y todo lo que se me ocurra, puede ser que este expuesto.

Segun el script hay que conectarse a ese puerto y enviar un string, intento usar nc, telnet, pero no funciona.

COMO?

El script usa strings con caracteres especiales, por lo que necesitan una codificación UTF-8, así que dependiendo del sistema el script funcionará de una o no. Para arreglarlo simplemente le agrego una primera línea diciendole cual es el "encoding" que usará por omisión en los strings del script: # -*- coding: utf-8 -*-

root@bt:/var/www# cat Llamado.py
# -*- coding: utf-8 -*-
#!/usr/bin/python
import socket 
def recvmsg():
    data = (s.recv(1024))
    while data!=b"?:":
...

Con esto ya tenemos el script funcionando.

10. Llegamos a una conversación

QUE?

-Puede ser que el servidor este usando expresiones regulares, así que la variable de entrada puede ser una ER que valide todo, algo que diga como todos los caracteres o cualquier caracter o cualquier número, pero nada de esto funcionó.

-Puede ser que el script se pueda desbordar de alguna forma, pero tampoco funcionó.

-Puede ser que el script sea vulnerable a ataques de pickle de python que se anunciaron hace algunos meses, pero tampoco.

Lo mas normal es que tuvieramos que seguir la conversación ...

COMO?

Busqué en internet : subtitles grinch español Con eso me bajo un .srt con todas las líneas de texto de la conversación, la cual efectivamente tiene el texto del script.

Algo diferente por supuesto, ya que cada traducción se hará al modo del traductor, entonces faltaba algo para encontrar la versión exacta que ellos esperaban. Esta versión era la versión en español publicada en el sitio web del grupo organizador. Así que busqué en el .srt el tiempo estimado donde se daba la conversación y luego la busqué en el video. Y del video podiamos escuchar las palabras necesarias para continuar la conversación. Una vez respondidas las "palabras mágicas" se nos daba la posibilidad de ganar el reto y fin. Hasta ahí llego yo.



Atacando el Chroot del sistema

Algunos en el chat se dieron cuenta que fue posible sobreescirbir el script del perro, en este punto un concursante podría modificar el script y cambiar las pistas, con eso evitaba que otros pudieran terminar. Pero como fue posible?

El servidor tenia habilitado el SFTP, así que no solo podiamos entrar por SSH también podiamos entrar por SFTP con el usuario cindy. Si intentabamos crear archivos, bajar, borrar, leer, no podiamos, ya que el entorno chroot no lo permitia y los permisos eran del usuario root.

Pero ... si recordamos los permisos mágicos +s en los directorios, sabemos que podemos obligar a que un usuario tenga propiedad sobre lo que se hace en dicho directorio aunque el dueño inicial del directorio fuera el root como era el caso. Así que desde el sftp podia ejecutar un chmod +s al directorio cindy, con eso ya podia escribir dentro y por lo tanto borrar. Hice algunas pruebas, subí archivos compilados para AMD64 y logré ejecutar comandos que no estaban disponibles en el sistema. Eso podría ser un vector de ataque en un escenario real. ;)

No es mas por ahora, espero que con esto las personas que recién inician en el mundo de los retos, wargames y CTFs puedan orientarse mejor la próxima vez.

Recuerden que no hay una forma única de hacer las cosas y que la única forma de aprender a desarrollar los retos es haciendolos, terminandolos y leyendo y practicando los solucionarios de los demas.


Algunas imagenes

File:File.png
alt text

Saludos.

Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox