Сейчас на форуме: tyns777, bezumchik (+5 невидимых)

 eXeL@B —› Вопросы новичков —› Расшировка CMS файла
Посл.ответ Сообщение

Ранг: 14.1 (новичок), 5thx
Активность: 0.030.01
Статус: Участник

Создано: 15 сентября 2019 21:24
· Личное сообщение · #1

Доброго времени суток. Имеется такая проблема.

Есть файлы формата .pdf и их же пошифрованный с помощью КриптоПро вариант (с форматом .pdf.sig). Гугл сказать, что пошифрованы CMS обычным base64, без какого-либо ключа.

Сначала я удалил из CMS файла заголовки -----BEGIN CMS----- и -----END CMS-----, затем на примитивном питоновском скрипте из двух строк сделал расшифровщик, который с этой задачей справился и я получил файл .pdf. Однако, там была помимо блока данных ещё и лишняя соль (то есть до начала заголовка "%PDF" и после "%%EOF"), которую пришлось отдельно удалять. Однако файл не открылся. При сравнении полученного и исходного файла выяснилось, что в полученном файле отдельно записались в определенных местах дополнительные ненужные байты, ломающие всю структуру.

https://dropmefiles.com/0EyJF

В архиве три файла. shema.pdf - рабочий исходник, затем пошифрованный файл, и файл shema_copy.pdf - полученный обработанный вариант.

Вопрос. Имел ли кто-то успешный опыт расшифровки подобных файлов и как с этим справиться, чтобы получить рабочий оригинал ? Дело в том, что не у всех файлов есть исходники. И кроме того, не все файлы формата .pdf (то есть найти заголовки и окончания файла тоже практически не представляется возможным), а другого формата.




Ранг: 55.9 (постоянный), 29thx
Активность: 0.120.22
Статус: Участник

Создано: 15 сентября 2019 23:04 · Поправил: Adler
· Личное сообщение · #2

Slinger, ну так там все очевидно.
Они не "пошифрованы", а подписаны, да и base64, это кодирование, а не шифрование.
Если убрать мусор до и после заголовка (перед %PDF и после %EOF), то в полученном на каждой 10000h позиции вставлены 5 байт (04 83 01 00 00), а начиная с 150000h - 4 байта (04 82 C0 AB).
В другом файле может будет иначе, но закономерность прослеживается легко.
Где-то я уже такое встречал, но что-то никак не могу вспомнить...

| Сообщение посчитали полезным: Slinger


Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 16 сентября 2019 01:33
· Личное сообщение · #3

Вариант 1

Если инструмент не важен, то можно воспользоваться оригинальным cryptcp от Крипто Про:
--> cryptcp <--

Пример использования:
Code:
  1. cryptcp -verify -dn chusadm@mail.ru scheme.msg scheme.pdf

Где scheme.msg - это твой файл "shema.sig", а "scheme.pdf" - имя файла, в который будет сохранено содержимое сообщения. Соответствующий сертификат должен быть установлен в системе.

Примерный выхлоп:
Code:
  1. scheme.msg... Signature verifying...
  2. Signer: Корнилова, 59 Пермский край, г. Чусовой, 0, Администрация Чусовского муниципального района, 0, Заместитель главы муниципального района по развитию, 005921009285, 04087713455, 1025902088398, chusadm@mail.ru, Администрация Чусовского муниципального района, Елена Викторовна, RU



Вариант 2

Если же очень хочется накатать свой собственный инструмент, то смотри в сторону реализации в Bouncy Castle:
CMSSignedData


Вариант 3

Можно обработать оригинальный файл без каких-либо модификаций, в оригинальном виде, со строками "-----BEGIN CMS-----" и "-----END CMS-----"
Code:
  1. openssl cms -verify -inform PEM -in scheme.pdf.sig -noverify -out scheme.pdf

См. ниже примечания в шаге 4, требуется установка GOST Engine для OpenSSL.

Если хочется разобраться в формате:
Декодировать ручками (почти) и с помощью OpenSSL:

1. Отрезать "-----BEGIN CMS-----" и "-----END CMS-----", сохранить base64 текст в файл msg.b64. Это не обязательный шаг, см. ниже пример с прямым декодированием с помощью OpenSSL.

2. Декодировать данные командой:
Code:
  1. base64 --i msg.b64 -o msg.der

На выходе получим файл в DER кодировке.

3. Распарсить ASN.1 данные с помощью OpenSSL:
Code:
  1. openssl asn1parse -inform DER -in msg.der >msg-info.txt

Результат парсинга будет сохранён в текстовый файл "msg-info.txt".

Выхлоп (HEX DUMP поскипан):
Code:
  1.       0:d=0  hl=2 l=inf  cons: SEQUENCE
  2.       2:d=1  hl=2 l=   9 prim: OBJECT            :pkcs7-signedData
  3.      13:d=1  hl=2 l=inf  cons: cont [ 0 ]
  4.      15:d=2  hl=2 l=inf  cons: SEQUENCE
  5.      17:d=3  hl=2 l=   1 prim: INTEGER           :01
  6.      20:d=3  hl=2 l=  12 cons: SET
  7.      22:d=4  hl=2 l=  10 cons: SEQUENCE
  8.      24:d=5  hl=2 l=   6 prim: OBJECT            :GOST R 34.11-94
  9.      32:d=5  hl=2 l=   0 prim: NULL
  10.      34:d=3  hl=2 l=inf  cons: SEQUENCE
  11.      36:d=4  hl=2 l=   9 prim: OBJECT            :pkcs7-data
  12.      47:d=4  hl=2 l=inf  cons: cont [ 0 ]
  13.      49:d=5  hl=2 l=inf  cons: OCTET STRING
  14.      51:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  15.   65592:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  16.  131133:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  17.  196674:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  18.  262215:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  19.  327756:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  20.  393297:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  21.  458838:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  22.  524379:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  23.  589920:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  24.  655461:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  25.  721002:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  26.  786543:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  27.  852084:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  28.  917625:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  29.  983166:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  30. 1048707:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  31. 1114248:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  32. 1179789:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  33. 1245330:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  34. 1310871:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  35. 1376412:d=6  hl=4 l=49323 prim: OCTET STRING [HEX DUMP]:
  36. 1425739:d=6  hl=2 l=   0 prim: EOC
  37. 1425741:d=5  hl=2 l=   0 prim: EOC
  38. 1425743:d=4  hl=2 l=   0 prim: EOC

Где с 51 по 1425739 - данные документа (PDF) чанками максимальным размером 65536 байт.

4. Проверяем, что у нас как минимум OpenSSL 1.1, ставим GOST Engine для поддержки шифрования и подписей по ГОСТ:
--> GOST Engine <--

Тестирование установленного движка ГОСТ:
Code:
  1. openssl engine gost -t

Выхлоп:
Code:
  1. (gost) Reference implementation of GOST engine
  2.      [ available ]

Если движок ГОСТ не будет корректно установлен, то на следующем шаге будет получено сообщение об ошибке, типа такого:
Code:
  1. Verification failure
  2. 4533929408:error:0609E09C:digital envelope routines:pkey_set_type:unsupported algorithm:crypto/evp/p_lib.c:210:
  3. 4533929408:error:0B09406F:x509 certificate routines:x509_pubkey_decode:unsupported algorithm:crypto/x509/x_pubkey.c:114


5. Извлекаем файл из сообщения:
Code:
  1. openssl cms -verify -inform DER -in msg.der -noverify -out scheme.pdf

Флаг "-noverify" позволяет проигнорировать подпись и извлечь файл без лишних проверок.

Разумеется, можно обработать оригинальный файл без каких-либо модификаций, в оригинальном виде, со строками "-----BEGIN CMS-----" и "-----END CMS-----"
Code:
  1. openssl cms -verify -inform PEM -in scheme.pdf.sig -noverify -out scheme.pdf

Где scheme.pdf.sig - оригинальный файл CMS.
Обрати внимание на параметр -inform PEM, который позволяет напрямую обрабатывать исходный файл в формате PEM.

Выхлоп:
Verification successful

Файл "scheme.pdf" сохранён в папке.

6. Проверяем целостность:
Code:
  1. sha1sum *.pdf

689fcd09000c17da5e8a1be5af9ac316bbffd5a7 scheme.pdf

Совпадает с исходным файлом. ОК.



Вариант 4

Расшифровка онлайн с помощью сервера проверки электронной подписи КриптоПро DSS:
--> Сервер проверки электронной подписи КриптоПро DSS <--

1. Выбрать файл "scheme.sig"
2. Загрузить файл на сервер.
3. Если параметры не были опеределены автоматически, то выбрать:
- Формат подписи: Подпись в формате CMS
- Параметры: Присоединённая подпись
4. Нажимаем Снять и проверить. Будет предложено сохранить файл "scheme.pdf".
5. На выходе получаем файл "scheme.pdf", содержимое которого полностью совпадает с исходным файлом:
Code:
  1. 689fcd09000c17da5e8a1be5af9ac316bbffd5a7  scheme.pdf


-----
EnJoy!


| Сообщение посчитали полезным: plutos, Hugo Chaves, Slinger, Isaev

Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 16 сентября 2019 03:03
· Личное сообщение · #4

варик 5

c46e_16.09.2019_EXELAB.rU.tgz - pdfcms.zip

| Сообщение посчитали полезным: Slinger

Ранг: 14.1 (новичок), 5thx
Активность: 0.030.01
Статус: Участник

Создано: 16 сентября 2019 10:28
· Личное сообщение · #5

Adler

Спасибо. Я тоже вечером дописал инструмент для декодирования и выпиливания того, что мне нужно.

1. Соль до заголовка почему-то разная у файлов, но благо сигнатура файла (спец символы) есть и в .pdf, и в других кодированных файлах, поэтому здесь просто повезло.
2. Соль после окончания файла разная, но начинается с одних и тех же символов, поэтому отследить её вполне можно.
3. Далее удаляю байты "04 83 01 00 00", которые расположены на всё протяжении файла на смещениях, кратные 10000h
4. Последние 4 байта уникальны, но их тоже можно отследить.

Как итог - рабочий файл

Jupiter

Огромное спасибо за развёрнутый ответ и за описание работы и проверки!

SReg

На выходе получаю .pdf нулевого размера. Сначала выбирал обычный .sig, потом из .sig удалил заголовок и окончание (BEGIN CMS и END CMS), но результат тот же.



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 16 сентября 2019 10:50
· Личное сообщение · #6

Slinger я проверил, все работает, на 7 и 10. может файл открыт, либо путь кривой к сигу.. и удалять ничего не надо.
в любом случае можешь отладить, ну и сорец есть сконпиль если хочешь.




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 16 сентября 2019 12:01
· Личное сообщение · #7

Slinger пишет:
Соль до заголовка почему-то разная у файлов

Это не соль, а структура OCTET STRING формата ASN.1, которую я описал выше.
Code:
  1.      49:d=5  hl=2 l=inf  cons: OCTET STRING
  2.      51:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  3.   65592:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  4.  131133:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  5.  196674:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  6.  262215:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  7.  327756:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  8.  393297:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  9.  458838:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  10.  524379:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  11.  589920:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  12.  655461:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  13.  721002:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  14.  786543:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  15.  852084:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  16.  917625:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  17.  983166:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  18. 1048707:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  19. 1114248:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  20. 1179789:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  21. 1245330:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  22. 1310871:d=6  hl=5 l=65536 prim: OCTET STRING [HEX DUMP]:
  23. 1376412:d=6  hl=4 l=49323 prim: OCTET STRING [HEX DUMP]:

Это блоки, из которых состоит документ.
Блок OCTET STRING в ASN.1 ограничен размером в 65536 (10000h) байт, поэтому файл и собирается из кусочков.

-----
EnJoy!


| Сообщение посчитали полезным: Slinger


Ранг: 55.9 (постоянный), 29thx
Активность: 0.120.22
Статус: Участник

Создано: 16 сентября 2019 12:05
· Личное сообщение · #8

Slinger пишет:
На выходе получаю .pdf нулевого размера. Сначала выбирал обычный .sig, потом из .sig удалил заголовок и окончание (BEGIN CMS и END CMS), но результат тот же.

У меня работает. Сперва файл создается 0 размера и буквально через секунду заполняется.


 eXeL@B —› Вопросы новичков —› Расшировка CMS файла
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати