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: