Автор: @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:

#codeby#writeup#misc#medium