ChatGPT:rt-gm-3-superadmin-password

Материал из 8j0rn wiki

Вопрос для ChatGPT:

Можно ли реализовать на python подобный алгоритм:

  1. Сохраняем на комп конфиг (логинимся под admin/пароль_с_наклейки, дальше Система/Перезагрузка/Сброс конфигурации/Сохранить настройки на локальный жесткий диск:/Сохранить), получаем файл config.bin
  2. Открываем config.bin в HEX-редакторе, видим заголовок вида 49Iskratel_RTGM3S - запоминаем первые два байта, удаляем этот заголовок (16 байт).
  3. Вспоминаем запомненные два байта, забиваем их в поиск по файлу.
  4. Найдя вхождение - смотрим только на "круглые" (кратные 0x400 (1024) байтам) адреса, и если там лежат эти первые два байта - удаляем их и продолжаем поиск пока не дойдём до конца файла. У меня эти байты лежали по смещениям (каждое новое смещение валидно только если весь мусор до него уже удалён) 0x400, 0xc00, 0x1800, 0x2800, 0x3c00 - проверял дважды (при этом байты при втором экспорте были не такие как в первый раз).
  5. Сохраняем полученный (подрезанный и подчищенный) файл как config.enc
  6. Расшифровываем полученный config.enc командой openssl enc -d -aes-256-cbc -in config.enc -out config.gz -md md5 -pass pass:RT-GM2-9_Rostelecom
  7. Распаковываем полученный config.gz, получаем файл config.xml
  8. Открываем полученный config.xml в текстовом редакторе, ищем по тексту слово superadmin - рядом с ним в теге password находим искомый пароль.

(Источник)

Ответ ChatGPT:

Да, реализовать описанный вами алгоритм на Python возможно. Я приведу пошаговое объяснение, как можно это сделать, включая основные операции с файлами, поиск байтов и использование библиотеки для работы с шифрованием. Обратите внимание, что для работы с файлами и шифрованием вам понадобятся некоторые библиотеки, такие как pycryptodome для AES-шифрования и gzip для распаковки. Убедитесь, что они установлены в вашей среде.

Шаг 1: Сохранение конфигурации

Этот шаг вы уже выполнили вручную, поэтому мы начнем с работы с файлом config.bin.

Шаг 2: Удаление заголовка

def remove_header(file_path):
    with open(file_path, 'rb') as f:
        data = f.read()

    header = data[:16]  # Считываем заголовок (первые 16 байт)
    first_two_bytes = header[:2]  # Запоминаем первые два байта
    data = data[16:]  # Удаляем заголовок

    return data, first_two_bytes

Шаг 3: Поиск и удаление вхождений

def clean_file(data, first_two_bytes):
    offset = 0
    while offset < len(data):
        index = data.find(first_two_bytes, offset)
        if index == -1:
            break
        if index % 0x400 == 0:  # Проверяем, кратно ли 0x400
            data = data[:index] + data[index + 2:]  # Удаляем найденные байты
        offset = index + 1  # Продолжаем поиск с следующего байта
    return data

Шаг 4: Сохранение очищенного файла

def save_cleaned_file(data, output_path):
    with open(output_path, 'wb') as f:
        f.write(data)

Шаг 5: Расшифровка файла

from Crypto.Cipher import AES
import hashlib
import os

def decrypt_file(input_path, output_path, password):
    # Генерируем ключ
    key = hashlib.md5(password.encode()).digest()  # Используем MD5 для генерации ключа
    cipher = AES.new(key, AES.MODE_CBC, iv=os.urandom(16))  # IV нужно будет сохранить, если используется

    with open(input_path, 'rb') as f:
        ciphertext = f.read()

    plaintext = cipher.decrypt(ciphertext)

    with open(output_path, 'wb') as f:
        f.write(plaintext)

Шаг 6: Распаковка файла

import gzip

def decompress_file(input_path, output_path):
    with gzip.open(input_path, 'rb') as f:
        with open(output_path, 'wb') as out_f:
            out_f.write(f.read())

Шаг 7: Поиск пароля в XML

import xml.etree.ElementTree as ET

def find_password_in_xml(file_path):
    tree = ET.parse(file_path)
    root = tree.getroot()

    for elem in root.iter():
        if 'superadmin' in elem.text:
            password = elem.find('password').text
            return password
    return None

Пример использования

# Путь к файлу
config_file_path = 'config.bin'
cleaned_file_path = 'config.enc'
decrypted_file_path = 'config.gz'
xml_file_path = 'config.xml'
password = 'RT-GM2-9_Rostelecom'

# Выполняем шаги
data, first_two_bytes = remove_header(config_file_path)
cleaned_data = clean_file(data, first_two_bytes)
save_cleaned_file(cleaned_data, cleaned_file_path)
decrypt_file(cleaned_file_path, decrypted_file_path, password)
decompress_file(decrypted_file_path, xml_file_path)
found_password = find_password_in_xml(xml_file_path)

print(f'Найденный пароль: {found_password}')

Примечания

  1. Убедитесь, что вы корректно обрабатываете IV для AES, если он используется.
  2. Код может потребовать доработки в зависимости от формата ваших файлов и структуры XML.
  3. Обязательно протестируйте каждый шаг отдельно, чтобы убедиться, что он работает корректно.

Статус реализации

<<ВПРОЦЕССЕ>>