• XSS.stack #1 – первый литературный журнал от юзеров форума

Мануал/Книга Crypt, XOR, взлом нешифрованного ZIP и ГПСЧ. Решение задач с r0от-мi Crypto.

tabac

CPU register
Пользователь
Регистрация
30.09.2018
Сообщения
1 610
Решения
1
Реакции
3 332
В данной статье узнаем про функцию crypt, узнаем как подбирать пароли к ZIP архиву с незашифрованными именами файлов, познакомимся с утилитой xortool, а так же разберемся с генератором псевдослучайных чисел.

ELF64 — PID encryption

image


Смотрим исходный код. Программа принимает в качестве аргумента строку и сравнивает ее с тем, что вернет функция cryрt от РID программы и строки "$1$awesome".

Функция cryрt — библиотечная функция, которая используется для вычисления хеша пароля. На выходе функции не просто хеш, а строка текста, которая также содержит соль, используемый хеш-алгоритм и параметры, с которыми был получен хеш, такие, как количество раундов и другие опции.

image


Данная функция включена в языки программирования Perl, PHP, Pike, Python и Ruby. Таким образом нужно угадать PID, с которым будет запущена программа. Подключившись по SSH видим, что нам дают программу, ее исходник, и файл с паролем.
image


В Linux каждое новое запущенное приложение будет получать наиболее приближенное инкрементированое свободное значение PID. К примеру, несколько раз подряд выполним ps. PID с каждым разом инкременитруется.
image


Так можно посчитать хеш от любого свободного PID, и с этим значением в качестве аргумента бесконечно запускать программу. Давайте возмем PID, к примеру 30000 и выполним функцию crypt. Я сделаю это в python.
image


Теперь запустим бесконечный цикл выполнения программы.
image


И спустя минуту, получаем оболочку, откуда читаем пароль.
image


File — PKZIP

image


Скачиваем файл, который нам дают. Это ZIP архив, защищенный паролем. Давайте переберем пароль. Так как имена файлов не зашифрованы, сделаем это утилитой fcrackzip, а в качестве словаря возьмем rockyou.txt.
image


Разархивировав, получаем текстовый файл, где написано, что ответом является пароль от архива.
image


Known plaintext — XOR

image


Нам дают зашифрованную с помощью XOR BMP картинку. Так как у нас использовался XOR (предполагаю с ключом малой длины) и имеется большой шифртекст, то можно использовать xortool.
image


Таким образом xortool считает, что наиболее вероятная длина ключа 6. Попросим его определить ключ.
image


Отлично. Ключ определен, но xortool уже сам расшифровал файл и сохранил в директорию xortool_out.
image


Code — Pseudo Random Number Generator

image


Нам дают программу, с помощью которой зашифрован файл, а так же сам файл. К тому же говорят, что шифрование происходило в декабре 2012. Давайте рабирать код.

В самом начале программы запоминается текущее время (точнее пройденное с 1 января 1970). Далее проверяется наличие параметра программы — путь к файлу.
image


image


Далее этот файл открывается для чтения и создается новый файл для записи. Дескрипторы обоих файлов передаются в функцию crypt_file.
image


В crypt_file функция genere_key() вовращает ключ 32 байта, который используется для XOR шифрования файла. Результат шифрования записывается в новый созданный файл.
image


Ключ составляется псевдослучайным образом. Из представленного алфавита на каждом шаге выбирается значение в зависимости от значения holdrand, которое также изменяется на каждом шаге, при этом в самом начале оно равно текущему времени.
image


Таким образом, нам нужно сгенерировать возможные ключи. Начальный код на python выглядит так.
Код:
keys = []
charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"
l = len(charset)
holdrand = None

def Rand():
    global holdrand
    holdrand = holdrand * 214013 + 2531011
    return ((holdrand >> 16) & 0x7fff)

def genere_key():
    key = "".join( [ charset[Rand()%l] for _ in range(32) ] )  
    keys.append(key)

start = ?
fin = ?

for ts in range(start, fin):
    holdrand = ts
    genere_key()
Теперь разберемся с границами времени. Так как шифрование производилось в декабре 2012, то нам нужно перебрать все возможные значения от 1 до 31 декабря.
image

Код:
start = 1354320000
fin = 1356998400
С границами определились, но ключей все равно будет очень много. Благо в файле сохранилось его расширение — это bz2.
image


То есть первые три байта файла должны быть “BZh”, четверым должен быть один из символов от “1” до “9”, и следующие шесть байт — 0x314159265359. Допишем для ключей фильтр. Для этого нам нужны первые байты шифртекста.
image

Код:
def key_filter(key):
    ctext = "\x23\x17\x5d\x70\x5a\x11\x6d\x67\x37\x08"
    BZh = "BZh"
    sign = "".join( [ chr(ord(ctext[i])^ord(BZh[i])) for i in range(3) ] )
    byte4 = "".join( [ chr(ord(ctext[3])^ord(i)) for i in "123456789" ] )
    bytePI = chr(ord(ctext[4])^0x31)
    if sign in key[:3] and key[3] in byte4 and key[4] in bytePI:
        print(key)
И получим всего один ключ.
image


И с помощью того же xortool можно проксорить файл с ключом.
image

Таким образом вы расшифровали архив.

автор @RalfHacker
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх