Solución al reto stealthehash #wgsbd2

Selection_002.png

Esta prueba consistía en conectarse al puerto 2011 de wargame.securitybydefault.com. Nos daban una pista: r3ady_for_the_n3xt_hash.

Cuando nos conectabamos:

nc wargame.securitybydefault.com 2011

El sistema se quedaba esperando a que le mandáramos algo. Buenos, empecemos con el dato que nos dan:

r3ady_for_the_n3xt_hash

Después de introducir ese dato, el sistema nos devolvía un hash y de nuevo se quedaba esperando a que le introdujéramos algo (no seas mal pensado). Si pulsabas la tecla enter, recibiamos algo como:

Bad key, the next hash is: XXXXX

Donde las Xs eran un hash, entonces se cerraba la conexión.

La idea era, conectarse al servidor, mandar la cadena: r3ady_for_the_n3xt_hash, apuntar el hash que de daba el servidor y básicamente empezar de nuevo. Así con cada iteración teníamos un hash nuevo. Los hashes tenías que irlos metiendo en el mismo orden que te los daba el servidor. La pregunta era ¿Cuántos hashes va a estar escupiendo el servidor? Ni idea, hasta que diga algo distinto de “Bad key….”.

Para resolver este reto nada como un script:

#!/usr/bin/env ruby

require 'socket'

hostname = 'wargame.securitybydefault.com'
port = 2011

while 
	s = TCPSocket.open(hostname, port)
	s.write("r3ady_for_the_n3xt_hash\n")
	res = s.gets

	f = File.new("hashes", "r+")
	while (line = f.gets)
		puts "sending: #{line}"
		s.puts line
		sleep 0.3
	end 

	s.puts "a"
	res = s.gets
	puts res
	if res.include?("Bad key") then
		key = res[21..res.length-1]
	else
		break
	end
	puts "key: #{key}"
	f.puts key.chop
	f.close
end

Este script hace básicamente he explicado arriba. Se conecta, manda “r3ady_for_the_n3xt_hash” y empieza a mandar los hashes (que guardamos en el fichero de texto “hashes”) que el servidor nos ha dado previamente hasta que se acaben, entonces mandamos algo (una “a” en nuestro caso), el servidor nos dará un nuevo hash, lo guardamos en nuestro fichero de texto y empezamos de nuevo. Así hasta que el servidor responda con algo distinto de “Bad key…”.

Al principio empecé a usar un Array para guardar los hashes, pero de vez en cuando perdía la conexión con el servidor y tenía que empezar todo el proceso de nuevo, así que tuve que usar un fichero de texto para guardar los hashed y así poder re-usarlos, en caso de pérdida de la conexión.

También me pasó algo curioso. En cierto punto del proceso, cuando tenía unos 90 hashes, el proceso siempre se desconectaba. Hasta que me di cuenta, que el último hash almacenado, en el cual el proceso rompía, era igual que el primero. Por suerte borrando ese hash del fichero, todo volvió a la normalidad y después de 150 hashes, el servidor por fin soltó el token:

OMG_all_hash3s_h4s_b33n_L34K3D!!!!

Para los curiosos, en la imagen de más arriba podéis ver los primeros y los últimos hashes.