image

В данной статье узнаем про функцию crypt, узнаем как подбирать пароли к ZIP архиву с незашифрованными именами файлов, познакомимся с утилитой xortool, а так же разберемся с генератором псевдослучайных чисел. Предыдущие статьи на эту тему:

Часть 1 — Кодировки, шифр сдвига, брут хешей и создание картинки с помощью PIL python.

Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:

  • PWN;
  • криптография (Crypto);
  • cетевые технологии (Network);
  • реверс (Reverse Engineering);
  • стеганография (Stegano);
  • поиск и эксплуатация WEB-уязвимостей.

Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.

Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.


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

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

Вы можете присоединиться к нам в Telegram. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.

Комментарии (0)