Розшифруйте трафік SSL за допомогою інструменту командного рядка openssl - продовження 5 частини


1

З моїх попередніх публікацій, частина 1 , частина 2 , частина 3 і частина 4, я вважаю, що я обчислив / розшифрував все правильно і готовий спробувати розшифрувати зашифроване клієнтом повідомлення рукостискання. Я застряг на наступному кроці, як тільки у мене є всі ключі. Я читав і досліджував це пару днів і просто застряг.

Дотримуючись вказівок з моїх попередніх постів, які я придумав

20 bytes for a client MAC key: 64666eafe1cbd51f2e2b50799b40f6007c3dc56f
20 bytes for a server MAC key: e0aac1312d35b5e8b6bf9af6ecf07e1dff27c784
32 bytes client encryption key:
4bf20108190203c4210ff9df6c4eb6e907ddd1f49646ab4b243c80a6ae9b4808
32 bytes for a server encryption key:
 ca94445e3d771d3e06b71ee0deb4c1879986c4c6a4b78bf1c3c1083a6ddce9ff

Моє зашифроване повідомлення про рукостискання клієнта:

Hex.       FILE SIZE: 40
 ADDRESS   000 001 002 003 004 005 006 007       ASCII
===============================================================================
00000000   09A 01B 0F3 06B 078 06C 03B 059      ~Z  ^[  -s   k   x   l   ;   Y
00000008   085 061 07C 076 0AF 0D9 085 0D6      ~E   a   |   v  -/  -Y  ~E  -V
00000010   08F 0FD 0AF 06D 09F 01A 025 0EF      ~O  -}  -/   m  ~_  ^Z   %  -o
00000018   040 015 097 002 0B5 0AD 0EF 040       @  ^U  ~W  ^B  -5  --  -o   @
00000020   02B 0DB 051 096 0CE 076 0A9 03F       +  -[   Q  ~V  -N   v  -)   ?
00000028   0D7 030 049 03A 0CC 0F9 029 044      -W   0   I   :  -L  -y   )   D
00000030   07F 0A9 0C6 0F1 017 02D 06B 040      ^?  -)  -F  -q  ^W   -   k   @
00000038   035 0F5 057 08E 0BF 0E9 05C 06D       5  -u   W  ~N  -?  -i   \   m
00000040

Я вважаю, що мені потрібно скористатися варіантом openssl end -d -K, але спотикаючись тут між RFC та Google, щоб знайти рішення / приклад, який чітко пояснює це. Хтось знає, як / якщо я можу це зробити в командному рядку в openssl? Дякую

Оновлення. Я не впевнений, чому / як я не помітив у RFC 7.4.9 PRF(master_secret, finished_label, Hash(handshake_messages)) Я ввійшов у систему всіх повідомлень про рукостискання, може хтось пояснить, як я можу імітувати це за допомогою просто командного рядка openssl з даними, які я захопив / розшифрував до цього моменту.? Схоже, що хеш повідомлень рукостискання - це те, що мені потрібно виконати до цього розділу 5 RFC. Я припускаю, що я збираюся використовувати master_secret, який я створив, я не впевнений, яке насіння для цього має використовувати Opensl шлях Я раніше цим користувався. Я не бачу, що для цього хешу існує мітка, зв'язана, тому я просто використовую всі повідомлення про рукостискання до цього моменту, об'єднані разом? Багато кроків я втрачаю там, де перебуваю. Дякую

openssl dgst -sha256 -mac hmac -macopt hexkey:$key <seed -binary >a1

Відповіді:


2

Мене заінтригує те, що ти, здається, використовуєш новий формат-дамп-файл кожного разу, коли публікуєш повідомлення :-)

Якщо припустити, що ви раніше використовували (RSA-з-) AES256CBC- (HMAC) SHA1: так, ви можете розшифрувати шифри TLS CBC за допомогоюopenssl enc , крім ARIA. (Також RC4, хоча вам слід уникати використання RC4 для будь-яких цілей, включаючи TLS. OTOH encне може робити жодні шифри AEAD: не GCM чи CCM, а не ChaCha / Poly.) Формат запису в TLS1.2 (та 1.1) для Шифр CBC розглянуто в розділі 6.2.3.2 RFC5246 . Для AES перші 16 октетів - це IV, а решта - це шифротекст, який повинен розшифруватися до корпусу запису простого тексту (у цьому випадку повідомлення "Готовий") та плюс HMAC плюс підкладка - але вкладка TLS не є такою ж, як PKCS5 / 7 прокладки, підтримувані enc(і внутрішньо EVP_{??crypt,Cipher}*API), тому цю частину потрібно зробити самостійно.

Як описано на його довільній сторінці у вашій системі або в Інтернеті , і досить багато запитань у кількох стеках (хоча більшість я зазначив - це відповідність командного рядка іншому коду, як Java та python тощо, а не специфікації), openssl encза замовчуванням пароль шифрування на основі (PBE), яке тут не те, що ви хочете. Для того, щоб зробити « на основі ключів» розшифровку, вам потрібно вказати -d, -K( в верхньому регістрі НЕ прописаний) з ключем в шістнадцятковому, і -ivз IV в шістнадцятковому , якщо використовується шифр (AES-CBC робить):

$ echo $key; echo $iv
4bf20108190203c4210ff9df6c4eb6e907ddd1f49646ab4b243c80a6ae9b4808
9A1BF36B786C3B5985617C76AFD985D6
$ sed 1,2d <1346633.dat
8FFDAF6D9F1A25EF
40159702B5ADEF40
2BDB5196CE76A93F
D730493ACCF92944
7FA9C6F1172D6B40
35F5578EBFE95C6D
$ sed 1,2d <1346633.dat |xxd -p -r |openssl aes-256-cbc -d -K $key -iv $iv -nopad |xxd
0000000: f730 34cc b90f b0b0 6313 9a0f 239c 6e87  .04.....c...#.n.
0000010: 187f ff00 52d1 3e9c 2aef d5cd c07e 15be  ....R.>.*....~..
0000020: dee0 aa95 6994 5ce6 768d 1952 ac00 17ba  ....i.\.v..R....

На жаль, як ви бачите, це розшифрування є недійсним: воно не закінчується накладкою в стилі TLS, і не починається з повідомлення "Готово", яким має бути перша передача клієнта після CCS. Або ваш похідний ключ неправильний, або ваш дамп цього запису.

Одна пропозиція, яка може допомогти: встановити з'єднання за допомогою (відредагувати) openssl s_client -debug та записати його вихід у файл. Це скидає всі записи в шістнадцятковій (і ASCII), які ви можете використовувати як дані для або для перевірки різних входів (включаючи зашифровані записи, що містять Готові), а блок "SSL-сесія" в кінці включає правильне значення головний секрет, який можна використовувати як перехресну перевірку. Ви також можете додати, -msgщоб отримати скидання зашифрованих повідомлень; це об'ємніше, але трохи зручніше, і я це робив нижче. Інша можливість, трохи більше працювати з налаштуванням, - це підключення від клієнтської програми Java SSL / TLS (JSSE), запущеної з системою sysprop javax.net.debug=sslта log; що скидає багато інформації, включаючи головний секрет та робочі ключі.


Як приклад того, як це має працювати, я пройшов процедуру на сеансі реєстрації вибірки (який я фактично створив у першому Q кілька тижнів тому), зробивши вручну майстер та робочі виводи та розшифрувавши та перевіривши готове повідомлення клієнта :

$ cat tempc
2f e9 97 3e e4 11 89 81 c5 bc 18   11 7b c9 e9 3d
64 cb 88 6e a4 ac f2 01 95 05 d7
fe 3d 09 f4 13 4a d7 39 77 bf 50 dc f4 7b 9b b8
3c 0b 2f bf 98 5a 9c 4c 2d 28 6c 6a b6 93 a9 29
c5 5f f1 a3 cd
$ # this is the hexdump of from s_client -debug, cleaned up 
$
$ echo $key; echo $iv
7d18617e178fc6320019442c6cd071ca4b4f7d2bb83f6194c23681aefd84f120
2fe9973ee4118981c5bc18117bc9e93d
$ # you can see the IV is the first line (16 bytes) of tempc
$ sed 1d tempc |xxd -p -r |openssl aes-256-cbc -d -K $key -iv $iv -nopad |tee tempc! |xxd
0000000: 1400 000c 5bbc 39d8 6c5d dbb1 076b b91b  ....[.9.l]...k..
0000010: 9f4e 5c55 fd9e a185 6901 4bc0 6f02 2c0d  .N\U....i.K.o.,.
0000020: 5bb0 d8c9 0b0b 0b0b 0b0b 0b0b 0b0b 0b0b  [...............
$ # those last 12 bytes are SSL/TLS-style padding 
$ # the first 4 bytes are a handshake message header for x14=Finished,
$ # followed by the 12 byte verify_data value, total 16 bytes 
$
$ echo $mkey
28a3244d49c644f889b44f2bae54466b6913fb1e
$ { printf '\0\0\0\0\0\0\0\0\x16\x03\x03\0\x10'; head -c16 tempc! ; } \
> |openssl sha1 -mac hmac -macopt hexkey:$mkey -binary |xxd -p 
9f4e5c55fd9ea18569014bc06f022c0d5bb0d8c9
$ # the 20 bytes after the 16-byte message and before the padding 
$ # correctly match HMAC-SHA1 of the pseudoheader plus the message

Що стосується "verify_data" у готовому повідомленні , так, вам потрібно взяти хеш усіх попередніх повідомлень рукостискання, як описано в 7.4.9 (у TLS1.3 це названо хешем "стенограми"), а потім PRF ( як обговорювалося в попередніх публікаціях), де ключ - головна таємниця, а насіння - це фіксована мітка «клієнт готовий» або «сервер готовий» (за наявності) плюс хеш стенограми. Це набагато більше роботи, і я цього не зробив для прикладу, хоча, мабуть, можу, якщо потрібно.


Дейв, спасибі ... оскільки я не впевнений, який крок у моєму сценарії оболонки може бути неправильним, виводячи ключ. Я розмістив свій перший крок тут. Чи можете ви подивитись і побачити, чи, можливо, я неправильно не зафіксував зашифрований клієнтом премастер? Це єдине, про що я можу подумати, я, можливо, зробив неправильно. Порівнюючи те, що я бачу У wireshark та файлі, який я створив байт для байту, вони точні, тому я не думаю, що мій перший сте невірний. ось дані, включаючи мій приватний ключ.
Девід Б

ps Я дотримувався вашої контури до "t" спочатку, використовуючи дані, наведені у прикладі для $ key та $ lbsd, щоб переконатися, що я отримав абсолютно такий самий результат, і я. Мій сценарій оболонки заснований на більшій частині цього, за винятком кількох речей. Потім розгорніть це до клавіш.
Девід Б
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.