![image](https://habrastorage.org/webt/ux/pz/a0/uxpza0t6_t38ztc07yhtciypf8g.jpeg)
В данной статье узнаем про функцию crypt, узнаем как подбирать пароли к ZIP архиву с незашифрованными именами файлов, познакомимся с утилитой xortool, а так же разберемся с генератором псевдослучайных чисел. Предыдущие статьи на эту тему:
Часть 1 — Кодировки, шифр сдвига, брут хешей и создание картинки с помощью PIL python.
Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
- PWN;
- криптография (Crypto);
- cетевые технологии (Network);
- реверс (Reverse Engineering);
- стеганография (Stegano);
- поиск и эксплуатация WEB-уязвимостей.
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
ELF64 — PID encryption
![image](https://habrastorage.org/webt/zp/9w/da/zp9wdanzxvhz4uiuusjcfd5coe8.png)
Смотрим исходный код. Программа принимает в качестве аргумента строку и сравнивает ее с тем, что вернет функция cryрt от РID программы и строки "$1$awesome".
Функция cryрt — библиотечная функция, которая используется для вычисления хеша пароля. На выходе функции не просто хеш, а строка текста, которая также содержит соль, используемый хеш-алгоритм и параметры, с которыми был получен хеш, такие, как количество раундов и другие опции.
![image](https://habrastorage.org/webt/jq/3f/3y/jq3f3y-d2srjnkudzwbrhxwsfsk.png)
Данная функция включена в языки программирования Perl, PHP, Pike, Python и Ruby. Таким образом нужно угадать PID, с которым будет запущена программа. Подключившись по SSH видим, что нам дают программу, ее исходник, и файл с паролем.
![image](https://habrastorage.org/webt/9m/8i/k7/9m8ik71wa-fei5gcp-hbcm01mpk.png)
В Linux каждое новое запущенное приложение будет получать наиболее приближенное инкрементированое свободное значение PID. К примеру, несколько раз подряд выполним ps. PID с каждым разом инкременитруется.
![image](https://habrastorage.org/webt/iu/sr/db/iusrdb1rfj_k3rh116obbcee_ds.png)
Так можно посчитать хеш от любого свободного PID, и с этим значением в качестве аргумента бесконечно запускать программу. Давайте возмем PID, к примеру 30000 и выполним функцию crypt. Я сделаю это в python.
![image](https://habrastorage.org/webt/im/yh/pr/imyhpredd7_yoo0jvvlcjlz9zbg.png)
Теперь запустим бесконечный цикл выполнения программы.
![image](https://habrastorage.org/webt/vx/y6/mr/vxy6mrtke5wyblw7fmzaz0_92nw.png)
И спустя минуту, получаем оболочку, откуда читаем пароль.
![image](https://habrastorage.org/webt/m1/zu/u7/m1zuu7o4dytba97nopsqm0a-qck.png)
File — PKZIP
![image](https://habrastorage.org/webt/8h/fh/n8/8hfhn8x1q1c6mng5btrn9n3tpxm.png)
Скачиваем файл, который нам дают. Это ZIP архив, защищенный паролем. Давайте переберем пароль. Так как имена файлов не зашифрованы, сделаем это утилитой fcrackzip, а в качестве словаря возьмем rockyou.txt.
![image](https://habrastorage.org/webt/sd/mi/qt/sdmiqt3lilxfpbaxz8chexwtlrk.png)
Разархивировав, получаем текстовый файл, где написано, что ответом является пароль от архива.
![image](https://habrastorage.org/webt/lp/m5/uq/lpm5uqukykoth4k-y_gjf8t2qqi.png)
Known plaintext — XOR
![image](https://habrastorage.org/webt/eg/it/va/egitvahzvebbcqatvgwcqfclo-g.png)
Нам дают зашифрованную с помощью XOR BMP картинку. Так как у нас использовался XOR (предполагаю с ключом малой длины) и имеется большой шифртекст, то можно использовать xortool.
![image](https://habrastorage.org/webt/fe/uo/_r/feuo_rxvnihxkyvnz92balmp0ka.png)
Таким образом xortool считает, что наиболее вероятная длина ключа 6. Попросим его определить ключ.
![image](https://habrastorage.org/webt/2j/tb/ol/2jtbol6v5yhbd0swhdy8cnbpn7g.png)
Отлично. Ключ определен, но xortool уже сам расшифровал файл и сохранил в директорию xortool_out.
![image](https://habrastorage.org/webt/ul/wr/u4/ulwru45g91prmp9990nawqeu98c.png)
Code — Pseudo Random Number Generator
![image](https://habrastorage.org/webt/pd/pr/ns/pdprnsnnnqtgmthwxzpzzbgtg0e.png)
Нам дают программу, с помощью которой зашифрован файл, а так же сам файл. К тому же говорят, что шифрование происходило в декабре 2012. Давайте рабирать код.
В самом начале программы запоминается текущее время (точнее пройденное с 1 января 1970). Далее проверяется наличие параметра программы — путь к файлу.
![image](https://habrastorage.org/webt/te/ve/w6/tevew6jfzkm_160_8kit7_8ue-i.png)
![image](https://habrastorage.org/webt/cf/bc/lo/cfbclozjtg9e6itqoj7t6rznmg4.png)
Далее этот файл открывается для чтения и создается новый файл для записи. Дескрипторы обоих файлов передаются в функцию crypt_file.
![image](https://habrastorage.org/webt/2h/ri/ya/2hriyayc7ulxizar3dhk_6ndj7m.png)
В crypt_file функция genere_key() вовращает ключ 32 байта, который используется для XOR шифрования файла. Результат шифрования записывается в новый созданный файл.
![image](https://habrastorage.org/webt/tf/ed/s1/tfeds1s1m5txk8llicyfh6hmrbc.png)
Ключ составляется псевдослучайным образом. Из представленного алфавита на каждом шаге выбирается значение в зависимости от значения holdrand, которое также изменяется на каждом шаге, при этом в самом начале оно равно текущему времени.
![image](https://habrastorage.org/webt/c3/hm/mp/c3hmmpadb0yoqdaor0er7q_xtes.png)
Таким образом, нам нужно сгенерировать возможные ключи. Начальный код на 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](https://habrastorage.org/webt/_p/vj/i-/_pvji-osfxwv0e941u66gdemhmu.png)
start = 1354320000
fin = 1356998400
С границами определились, но ключей все равно будет очень много. Благо в файле сохранилось его расширение — это bz2.
![image](https://habrastorage.org/webt/3m/ue/tq/3muetqnmr68aqqxdhurwzs-vae4.png)
То есть первые три байта файла должны быть “BZh”, четверым должен быть один из символов от “1” до “9”, и следующие шесть байт — 0x314159265359. Допишем для ключей фильтр. Для этого нам нужны первые байты шифртекста.
![image](https://habrastorage.org/webt/vq/dw/wf/vqdwwfaeqhc31rflnns7gr2wuiu.png)
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](https://habrastorage.org/webt/zv/yp/4i/zvyp4iyuuxu-m2daciww8howgbe.png)
И с помощью того же xortool можно проксорить файл с ключом.
![image](https://habrastorage.org/webt/b6/8t/ly/b68tlygv2_abbqakbsmc1bucywi.png)
Таким образом вы расшифровали архив.
Вы можете присоединиться к нам в Telegram. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.