Автор: @FaLLenSkiLL
Описание задания
Как обычно ломают хеш? Сверяют с хешами паролей из популярного словаря пока не найдется совпадение
IP: 62.173.140.174:10300
Решение
Пробуем подключиться по nc и прописываем “start”
Приложение дает нам хэш (скорее всего MD5)
В итоге нам нужно подобрать 100 хешей MD5, при этом на расшифровку одно дается не более 5 секунд
Придется писать код.
Я подробно опишу каждую его часть, вдруг вы захотите понять как он работает, а не просто скопировать
Описание кода
Нам понадобятся модули для работы с сокетами, регулярными выражениями, хешированием и временными задержками. Импортируем их
import socket
import re
import hashlib
import time
Для начала, нам нужно как то заставить кодик подключаться к серверу по указанному адресу и порту
# Подключаемся к серверу
host = '62.173.140.174'
port = 10300
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
# Получаем и выводим первое сообщение от сервера
data = s.recv(1024).decode()
print(data)
# Отправляем "start" на сервер, чтобы запустить таск
s.sendall("start\n".encode())
Получаем и выводим пользователю первое сообщения от сервера:
data = s.recv(1024).decode()
print(data)
Отправляем команду “start” для активации таска:
s.sendall("start\n".encode())
Запускаем цикл, который будет подбирать каждый из хэшей. В данном случае их 100, но мы ставим 101, для вывода флага, который появится после всех хэшей
for _ in range(101):
Если у вас не очень быстрый интернет или вы не хотите нагружать сервер, можно установить небольшую паузу на получение нового хеша от сервера
time.sleep(1)
Далее мы получаем хеш от сервера и с помощью регулярного выражения извлекаем его
data = s.recv(1024).decode()
match = re.search(r"\((\d+)/\d+\) ([0-9a-fA-F]+)", data)
Теперь открываем файл словаря и читаем каждую строку, пытаясь найти соответствие хеша в словаре.
Для этого я буду использовать словарь rockyou, который предустановлен в kali linux
if match:
hash_to_crack = match.group(2)
print("Received hash to crack:", hash_to_crack)
# Открываем файл rockyou.txt и читаем его построчно
with open('/usr/share/wordlists/rockyou.txt', 'r', encoding='latin-1') as f:
# Читаем каждую строку из файла rockyou.txt
for password in f:
password = password.strip()
hashed_word = hashlib.md5(password.encode()).hexdigest()
# Если найдено совпадение
if hashed_word == hash_to_crack:
print("Found password:", password)
# Отправляем расшифрованный пароль на сервер
s.sendall((password + '\n').encode())
break
else:
print("Пароля нет в словаре, попробуй еще раз или смени словарь")
После 100 хэшей мы ожидаем получение флага. Выводим его
data = s.recv(1024).decode()
print(data)
На всякий случай будем отлавливать любые исключения, которые могут возникнуть в процессе выполнения программы.
Для этого будем использовать блок try-except
try
# основной код
except Exception as e:
print("An error occurred:", e)
s.close()
Код
В итоге у нас получилось что-то такое:
import socket
import re
import hashlib
import time
def main(): #TaipanByte Code
# Подключаемся к серверу по указанному адресу и порту
host = '62.173.140.174'
port = 10300
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
try:
# Получаем и выводим первое сообщение от сервера
data = s.recv(1024).decode()
print(data)
# Отправляем "start" на сервер, чтобы начать игру
s.sendall("start\n".encode())
# Цикл для решения каждого таска
for _ in range(101):
# Ждем нового хеша
time.sleep(1)
# Получаем хеш от сервера
data = s.recv(1024).decode()
match = re.search(r"\((\d+)/\d+\) ([0-9a-fA-F]+)", data)
if match:
hash_to_crack = match.group(2)
print("Received hash to crack:", hash_to_crack)
# Открываем файл rockyou.txt и читаем его построчно
with open('/usr/share/wordlists/rockyou.txt', 'r', encoding='latin-1') as f:
# Читаем каждую строку из файла rockyou.txt
for password in f:
password = password.strip()
hashed_word = hashlib.md5(password.encode()).hexdigest()
# Если найдено совпадение
if hashed_word == hash_to_crack:
print("Found password:", password)
# Отправляем расшифрованный пароль на сервер
s.sendall((password + '\n').encode())
break
else:
print("Ты не успел, попробуй еще раз")
# После решения всех тасков ожидаем получение флага
data = s.recv(1024).decode()
print(data)
# Закрываем соединение
s.close()
except Exception as e:
print("Ну пипец:", e)
s.close()
if __name__ == "__main__":
main()
Запускаем код, получаем флаг
Стоит иметь ввиду, что если пароль попадется в конце словаря, то вы можете не успеть и код придется запускать сначала.
Tags: