30.01.2014 11:47, by Triff
Category:
Event:
Задание:
Unhash this:
5ebad7dcbd73584f32ef949486a161a1e9f10e48ade43b03649a2ca680f327c4
nc 195.133.87.165 5555
Auth token: rb0xch4ll3ng3
Решение:
Подключаемся к серверу, выполнив команду "nc 195.133.87.165 5555", и видим приветствие:
RX-Box hasher v0.1
------------------
Auth:
Вводим токен:
rb0xch4ll3ng3
Enter message:
Теперь можно ввести любое сообщение, и оно будет прохешировано. Вводим разные короткие сообщения и получаем:
"0" - "3ad2b2fcdb1f39281286e7b4e4995795d8906d709e82583b51ff18c3b4c745a70ad2b2fc"
"1" - "3bd2b2fcdb1f39281286e7b4e4995795d8906d709e82583b51ff18c3b4c745a70ad2b2fc"
"00" - "3ae2b2fcdb1f39281286e7b4e4995795d8906d709e82583b51ff18c3b4c745a70ad2b2fc"
"001"-"3ae283fcdb1f39281286e7b4e4995795d8906d709e82583b51ff18c3b4c745a70ad2b2fc"
Видно, что каждый байт исходного текста отображается в один байт (два hex-символа) хеша, то есть восстановить хеш можно простым посимвольным перебором. Еще можно заметить интересный момент: длина возвращаемого хеша - 72 hex-символа, в то же время нам дано лишь 64 символа, значит нужно подобрать лишь первые 32 байта сообщения.
Далее просто пишем скрипт, который будет в цикле подключаться к серверу и подбирать хеш посимвольно.
Например такой:
#!/usr/bin/env python
from socket import create_connection
from time import sleep
import string
hash = "5ebad7dcbd73584f32ef949486a161a1e9f10e48ade43b03649a2ca680f327c4"
message = ""
end1 = 9
end2 = 2
for i in xrange(0,32,1):
for c in string.printable:
con = create_connection(('195.133.87.165', 5555))
con.recv(1024)
con.recv(1024)
con.send("rb0xch4ll3ng3\n")
sleep(0.1)
con.recv(1024)
con.send(message+c+"\n")
sleep(0.02)
res = con.recv(1024)
if res[7:end1] == hash[0:end2]:
message = message + c
print message
end1 = end1 +2
end2 = end2 +2
break
print ""
print "Message: " + message
print ""Запускаем скрипт и видим, как он постепенно подбирает исходное сообщение. В конце работы печатается результат:
Message: The flag is b8641ac83fc85e4e44bc
Флаг: b8641ac83fc85e4e44bc
Attachments: