В данной статье узнаем про функцию crypt, узнаем как подбирать пароли к ZIP архиву с незашифрованными именами файлов, познакомимся с утилитой xortool, а так же разберемся с генератором псевдослучайных чисел. Предыдущие статьи на эту тему:
Часть 1 — Кодировки, шифр сдвига, брут хешей и создание картинки с помощью PIL python.
- PWN;
- криптография (Crypto);
- cетевые технологии (Network);
- реверс (Reverse Engineering);
- стеганография (Stegano);
- поиск и эксплуатация WEB-уязвимостей.
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
ELF64 — PID encryption
Смотрим исходный код. Программа принимает в качестве аргумента строку и сравнивает ее с тем, что вернет функция cryрt от РID программы и строки "$1$awesome".
Функция cryрt — библиотечная функция, которая используется для вычисления хеша пароля. На выходе функции не просто хеш, а строка текста, которая также содержит соль, используемый хеш-алгоритм и параметры, с которыми был получен хеш, такие, как количество раундов и другие опции.
Данная функция включена в языки программирования Perl, PHP, Pike, Python и Ruby. Таким образом нужно угадать PID, с которым будет запущена программа. Подключившись по SSH видим, что нам дают программу, ее исходник, и файл с паролем.
В Linux каждое новое запущенное приложение будет получать наиболее приближенный инкрементированое свободное значение PID. К примеру, несколько раз подряд выполним ps. PID с каждым разом инкременитруется.
Так можно посчитать хеш от любого свободного PID, и с этим значением в качестве аргумента бесконечно запускать программу. Давайте вомем PID, к примеру 30000 и выполним функцию crypt. Я сделаю это в python.
Теперь запустим бесконечный цикл выполнения программы.
И спустя минуту, получаем облочку, откуда читаем пароль.
File — PKZIP
Скачиваем файл, который нам дают. Это ZIP архив, защищенный паролем. Давайте переберем пароль. Так как имена файлов не зашифрованы, сделаем это утилитой fcrackzip, а в качестве словаря возьмем rockyou.txt.
Разархивировав, получаем текстовый файл, где написано, что ответом является пароль от архива.
Known plaintext — XOR
Нам дают зашифрованную с помощью XOR BMP картинку. Так как у нас использовался XOR (предполагаю с ключем малой длины) и имеется большой шифртекст, то можно использовать xortool.
Таким образом xortool считает, что наиболее вероятная длина ключа 6. Попросим его определить ключ.
Отлично. Ключ определен, но xortool уже сам расшифровал файл и сохранил в дирректорию xortool_out.
Code — Pseudo Random Number Generator
Нам дают программу, с помощью которой зашифрован файл, а так же сам файл. К тому же говорят, что шифрование происходило в декабре 2012. Давайте рабирать код.
В самом начале программы запоминается текущее время (точнее пройденное с 1 января 1970). Далее проверяется наличие параметра программы — путь к файлу.
Далее этот файл открывается для чтения и создается новый файл для записи. Дескрипторы обоих файлов передаются в функцию crypt_file.
В crypt_file функция genere_key() вовращает ключ 32 байта, который используется для XOR шифрования файла. Результат шифрования записывается в новый созданный файл.
Ключ состаявляется псевдослучайным образом. Из представленного алфавита на каждом шаге выбирается значение взависимости от значения holdrand, которое также изменяется на каждом шаге, при этом в самом начале оно равно текущему времени.
Таким образом, нам нужно нам нужно сгенерировать возможные ключи. Начальный код на 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 декабря.
start = 1354320000
fin = 1356998400
С границами определились, но ключей все равно будет очень много. Благо в файле сохранилось его разрешение — это bz2.
То есть первые три байта файла должны быть “BZh”, четверым должен быть один из символов от “1” до “9”, и следующие шесть байт — 0x314159265359. Допишем для ключей фильтр. Для этого нам нужны первые байты шифртекста.
def key_filter(key):
ctext = "x23x17x5dx70x5ax11x6dx67x37x08"
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)
И получим всего один ключ.
И с помощью того же xortool можно проксорить файл с ключем.
Таким обазом вы расшифровали архив.
Вы можете присоединиться к нам в Telegram. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
Автор: RalfHacker