- Application Data Flow
- Capinfos
- Configure wireshark to decrypt ssl
- Launch your browser and check for the log file
- Using a pre-master secret key to decrypt ssl and tls
- Using an rsa key to decrypt ssl
- Wireshark · display filter reference: secure sockets layer
- Анализ pcap-файлов
- Анализ tcp-соединений
- Анализ трафика в wireshark
- Интерфейс wireshark
- Использование wireshark для изучения сетевых протоколов
- Как расшифровать ssl в wireshark?
- Настройка wireshark
- Перехват handshake
- Поиск пакетов
- Практика анализа трафика беспроводных сетей
- Просмотр содержимого пакетов
- Работа с географической базой geoip
- Фильтрация по идентификатору
- Часто используемые фильтры wireshark
Application Data Flow
Once the entire TLS Handshake is successfully completed and the peers validated, the applications on the peers can begin communicating with each other.The article gives a brief explanation of how the TLS Protocol works and the analysis of the TLS handshake using a powerful tool like Wireshark.
One important thing to note is applications should not rely on TLS to create the strongest secure connection between the peers as it is possible for a hacker to make the peers drop down to the least secure connection. Also, the use of TSL/SSL could impact performance (explained here). Hence, a clear understanding of the protocol will help evaluate its advantages and vulnerabilities.
Read the ebook Monitoring Network Protocols to learn Digital Experience Monitoring can help improve network performance.
Capinfos
В комплекте с Wireshark поставляется удобный инструмент командной строки
capinfos
. Эта утилита генерирует статистику пакетного дампа, с временем начала/окончания записи и другими подробностями. С опцией
-T
она выдаёт текст с табуляцией — он подходит для импорта в электронные таблицы или анализа в консоли.
test@ubuntu:~$ capinfos test.pcap
File name: test.pcap
File type: Wireshark/tcpdump/... - pcap
File encapsulation: Ethernet
File timestamp precision: microseconds (6)
Packet size limit: file hdr: 262144 bytes
Number of packets: 341 k
File size: 449 MB
Data size: 444 MB
Capture duration: 3673.413779 seconds
First packet time: 2021-12-01 11:26:53.521929
Last packet time: 2021-12-01 12:28:06.935708
Data byte rate: 120 kBps
Data bit rate: 967 kbps
Average packet size: 1300.72 bytes
Average packet rate: 93 packets/s
SHA256: 989388128d676c329ccdbdec4ed221ab8ecffad81910a16f473ec2c2f54c5d6e
RIPEMD160: 0742b6bbc79735e57904008d6064cce7eb95abc9
SHA1: d725b389bea044d6520470c8dab0de1598b01d89
Strict time order: True
Number of interfaces in file: 1Configure wireshark to decrypt ssl
Once your browser is logging pre-master keys, it’s time to configure Wireshark to use those logs to decrypt SSL.
Open Wireshark and click Edit, then Preferences. The Preferences dialog will open, and on the left, you’ll see a list of items. Expand Protocols, scroll down, then click SSL.
In the list of options for the SSL protocol, you’ll see an entry for (Pre)-Master-Secret log filename. Browse to the log file you set up in the previous step, or just paste the path.
When you’ve finished setting the (Pre)-Master-Secret log filename, click OK and return to Wireshark. You’re ready to move on.
Related post:How to use Wireshark
Launch your browser and check for the log file
Before you launch Wireshark and configure it to decrypt SSL using a pre-master key, you should start your browser and confirm that the log file is being used.
In order to populate the log, it’s important that you visit a site that has SSL enabled. I’m using my own Apache server for testing, but any site will work. One of the biggest benefits of using a pre-master shared key is you don’t need access to the server to decrypt SSL.
After you’ve visited a SSL-enabled website, check the file for data. In Windows, you can use Notepad. In Linux or Mac, use the following command:
cat ~/.ssl-log.key
On any operating system, your file should look like mine does above. After you’ve confirmed that your browser is logging pre-master keys in the location you selected, you can configure Wireshark to use those keys to decrypt SSL.
Using a pre-master secret key to decrypt ssl and tls
Using a pre-master secret key to decrypt SSL in Wireshark is the recommended method.
A pre-master secret key is generated by the client and used by the server to derive a master key that encrypts the session traffic. It’s the current standard in cryptography and is usually implemented via Diffie-Hellman.
Your browser can be made to log the pre-master secret key, which Wireshark uses to decrypt SSL and TLS sessions.
Here are the steps to decrypting SSL and TLS with a pre-master secret key:
- Set an environment variable
- Launch your browser
- Configure Wireshark
- Capture and decrypt the session keys
When you’re finished, you’ll be able to decrypt SSL and TLS sessions in Wireshark without needing access to the target server.
Using an rsa key to decrypt ssl
You might have noticed earlier that Wireshark has a field that allows you to upload your RSA keys and use them to decrypt SSL. In practice, RSA key decryption is deprecated.
The reason decrypting SSL with an RSA key isn’t commonly used anymore is that Perfect Forward Encryption (PFE) has made it obsolete. Sessions negotiated with Diffie-Hellman don’t use the RSA key directly; instead they generate a one-time key, stored only in RAM, that is encrypted using the key on disk.
If you were previously using an RSA key to decode traffic, and it stopped working, you can confirm that the target machine is using Diffie-Hellman exchanges by enabling SSL logging.
To turn on logging, click Edit from the toolbar menu and select Preferences. Expand the Protocols menu item on the left and scroll down to SSL. From here, you can click the Browse button and set the location of your SSL log.
Once the location is set, all SSL interactions will be logged in the specified file.
Capture a session with your SSL-enabled host, then check the logs. Specifically, you should scroll until you find the frame that the TLS handshake was negotiated on. It’s likely that you’ll see a telltale DHE entry in the cipher string.
That means Diffie-Hellman key exchanges are enabled. In my case, Apache is specifically using Diffie-Hellman with elliptic-curve keys, which is denoted by the string ECDHE.
Scroll a little further and you’re likely to see that the master secret cannot be found.
If your logs look like that, and you can’t decrypt data using an RSA key, you have no choice but to switch over to the pre-master secret method above.
Since PFE is becoming standard practice, with TLSv1.3 likely forcing the issue, simple RSA key decryption is deprecated and should not be used.
Wireshark · display filter reference: secure sockets layer
Display Filter Reference: Secure Sockets Layer
Protocol field name: ssl
Versions: 1.0.0 to 2.6.20
Back to Display Filter Reference
| Field name | Description | Type | Versions |
|---|---|---|---|
| pct.handshake.cert | Cert | Unsigned integer, 2 bytes | 1.0.0 to 1.12.13 |
| pct.handshake.certspec | Cert Spec | Label | 1.0.0 to 1.12.13 |
| pct.handshake.cipher | Cipher | Unsigned integer, 2 bytes | 1.0.0 to 1.12.13 |
| pct.handshake.cipherspec | Cipher Spec | Label | 1.0.0 to 1.12.13 |
| pct.handshake.exch | Exchange | Unsigned integer, 2 bytes | 1.0.0 to 1.12.13 |
| pct.handshake.exchspec | Exchange Spec | Label | 1.0.0 to 1.12.13 |
| pct.handshake.hash | Hash | Unsigned integer, 2 bytes | 1.0.0 to 1.12.13 |
| pct.handshake.hashspec | Hash Spec | Label | 1.0.0 to 1.12.13 |
| pct.handshake.server_cert | Server Cert | Label | 1.0.0 to 1.12.13 |
| pct.handshake.sig | Sig Spec | Unsigned integer, 2 bytes | 1.0.0 to 1.12.13 |
| pct.msg_error_code | PCT Error Code | Unsigned integer, 2 bytes | 1.0.0 to 1.12.13 |
| ssl.alert_message | Alert Message | Label | 1.0.0 to 2.6.20 |
| ssl.alert_message.desc | Description | Unsigned integer, 1 byte | 1.0.0 to 2.6.20 |
| ssl.alert_message.level | Level | Unsigned integer, 1 byte | 1.0.0 to 2.6.20 |
| ssl.app_data | Encrypted Application Data | Sequence of bytes | 1.0.0 to 2.6.20 |
| ssl.change_cipher_spec | Change Cipher Spec Message | Label | 1.0.0 to 2.6.20 |
| ssl.connection_id_data | Connection ID Data | Sequence of bytes | 2.0.0 to 2.6.20 |
| ssl.early_data.max_early_data_size | Maximum Early Data Size | Unsigned integer, 4 bytes | 2.4.0 to 2.6.20 |
| ssl.extension.draft_version_tls13 | Draft version of TLS 1.3 | Unsigned integer, 2 bytes | 2.4.0 to 2.6.20 |
| ssl.extension.oid_filters.oid | Certificate Extension OID | ASN.1 object identifier | 2.4.0 to 2.6.20 |
| ssl.extension.oid_filters.oid_length | Certificate Extension OID Length | Unsigned integer, 1 byte | 2.4.0 to 2.6.20 |
| ssl.extension.oid_filters.values_length | Certificate Extension Values Length | Unsigned integer, 2 bytes | 2.4.0 to 2.6.20 |
| ssl.extension.oid_filters_length | OID Filters Length | Unsigned integer, 2 bytes | 2.4.0 to 2.6.20 |
| ssl.extension.psk_ke_mode | PSK Key Exchange Mode | Unsigned integer, 1 byte | 2.4.0 to 2.6.20 |
| ssl.extension.psk_ke_modes_length | PSK Key Exchange Modes Length | Unsigned integer, 1 byte | 2.4.0 to 2.6.20 |
| ssl.handshake | Handshake Protocol | Label | 1.0.0 to 2.6.20 |
| ssl.handshake.cert_status | Certificate Status | Label | 1.6.0 to 2.4.16 |
| ssl.handshake.cert_status_len | Certificate Status Length | Unsigned integer, 3 bytes | 1.6.0 to 2.4.16 |
| ssl.handshake.cert_status_type | Certificate Status Type | Unsigned integer, 1 byte | 1.6.0 to 2.4.16 |
| ssl.handshake.cert_type | Certificate Type | Unsigned integer, 1 byte | 1.0.0 to 2.6.20 |
| ssl.handshake.cert_type.type | Certificate Type | Unsigned integer, 1 byte | 1.12.0 to 2.6.20 |
| ssl.handshake.cert_type.types | Certificate Type List | Label | 1.12.0 to 2.6.20 |
| ssl.handshake.cert_type.types_len | Certificate Type List Length | Unsigned integer, 1 byte | 1.12.0 to 2.6.20 |
| ssl.handshake.cert_types | Certificate types | Label | 1.0.0 to 2.6.20 |
| ssl.handshake.cert_types_count | Certificate types count | Unsigned integer, 1 byte | 1.0.0 to 2.6.20 |
| ssl.handshake.cert_url.padding | Padding | Label | 1.12.0 to 2.6.20 |
| ssl.handshake.cert_url.sha1 | SHA1 Hash | Sequence of bytes | 1.12.0 to 2.6.20 |
| ssl.handshake.cert_url.url | URL | Character string | 2.2.0 to 2.6.20 |
| ssl.handshake.cert_url.url_hash | URL and Hash | Label | 1.12.0 to 2.6.20 |
| ssl.handshake.cert_url.url_hash_len | URL and Hash list Length | Unsigned integer, 2 bytes | 1.12.0 to 2.6.20 |
| ssl.handshake.cert_url.url_len | URL Length | Unsigned integer, 2 bytes | 1.12.0 to 2.6.20 |
| ssl.handshake.cert_url_type | Certificate Chain Type | Unsigned integer, 1 byte | 1.12.0 to 2.6.20 |
| ssl.handshake.certificate | Certificate | Sequence of bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.certificate_length | Certificate Length | Unsigned integer, 3 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.certificate_request_context | Certificate Request Context | Sequence of bytes | 2.4.0 to 2.6.20 |
| ssl.handshake.certificate_request_context_length | Certificate Request Context Length | Unsigned integer, 1 byte | 2.4.0 to 2.6.20 |
| ssl.handshake.certificates | Certificates | Label | 1.0.0 to 2.6.20 |
| ssl.handshake.certificates_length | Certificates Length | Unsigned integer, 3 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.challenge | Challenge | Label | 1.0.0 to 2.6.20 |
| ssl.handshake.challenge_length | Challenge Length | Unsigned integer, 2 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.cipher_spec_len | Cipher Spec Length | Unsigned integer, 2 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.cipher_suites_length | Cipher Suites Length | Unsigned integer, 2 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.cipher_suites_length.mult2 | Expert Info | Label | 1.12.0 to 2.2.17 |
| ssl.handshake.cipherspec | Cipher Spec | Unsigned integer, 3 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.ciphersuite | Cipher Suite | Unsigned integer, 2 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.ciphersuites | Cipher Suites | Label | 1.0.0 to 2.6.20 |
| ssl.handshake.clear_key_data | Clear Key Data | Label | 1.0.0 to 2.6.20 |
| ssl.handshake.clear_key_length | Clear Key Data Length | Unsigned integer, 2 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.client_cert_vrfy.sig | Signature | Sequence of bytes | 1.12.0 to 2.6.20 |
| ssl.handshake.client_cert_vrfy.sig_len | Signature length | Unsigned integer, 2 bytes | 1.12.0 to 2.6.20 |
| ssl.handshake.client_point | Pubkey | Sequence of bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.client_point_len | Pubkey Length | Unsigned integer, 1 byte | 1.8.0 to 2.6.20 |
| ssl.handshake.comp_method | Compression Method | Unsigned integer, 1 byte | 1.0.0 to 2.6.20 |
| ssl.handshake.comp_methods | Compression Methods | Label | 1.0.0 to 2.6.20 |
| ssl.handshake.comp_methods_length | Compression Methods Length | Unsigned integer, 1 byte | 1.0.0 to 2.6.20 |
| ssl.handshake.connection_id | Connection ID | Label | 1.0.0 to 2.6.20 |
| ssl.handshake.connection_id_length | Connection ID Length | Unsigned integer, 2 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.dname | Distinguished Name | Label | 1.0.0 to 2.6.20 |
| ssl.handshake.dname_len | Distinguished Name Length | Unsigned integer, 2 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.dnames | Distinguished Names | Label | 1.0.0 to 2.6.20 |
| ssl.handshake.dnames_len | Distinguished Names Length | Unsigned integer, 2 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.encrypted_key | Encrypted Key | Label | 1.0.0 to 2.6.20 |
| ssl.handshake.encrypted_key_length | Encrypted Key Data Length | Unsigned integer, 2 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.epms | Encrypted PreMaster | Sequence of bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.epms_len | Encrypted PreMaster length | Unsigned integer, 2 bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.exponent | Exponent | Sequence of bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.exponent_len | Exponent Length | Unsigned integer, 2 bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.extension.data | Data | Sequence of bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.extension.heartbeat.mode | Mode | Unsigned integer, 1 byte | 1.8.0 to 2.6.20 |
| ssl.handshake.extension.len | Length | Unsigned integer, 2 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.extension.type | Type | Unsigned integer, 2 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.extensions.cookie | Cookie | Sequence of bytes | 2.4.0 to 2.6.20 |
| ssl.handshake.extensions.cookie_len | Cookie length | Unsigned integer, 2 bytes | 2.4.0 to 2.6.20 |
| ssl.handshake.extensions.psk.binders | PSK Binders | Label | 2.4.0 to 2.6.20 |
| ssl.handshake.extensions.psk.binders_len | PSK Binders length | Unsigned integer, 2 bytes | 2.4.0 to 2.6.20 |
| ssl.handshake.extensions.psk.identities.length | Identities Length | Unsigned integer, 2 bytes | 2.4.0 to 2.6.20 |
| ssl.handshake.extensions.psk.identity.identity | Identity | Sequence of bytes | 2.4.0 to 2.6.20 |
| ssl.handshake.extensions.psk.identity.identity_length | Identity Length | Unsigned integer, 2 bytes | 2.4.0 to 2.6.20 |
| ssl.handshake.extensions.psk.identity.obfuscated_ticket_age | Obfuscated Ticket Age | Unsigned integer, 4 bytes | 2.4.0 to 2.6.20 |
| ssl.handshake.extensions.psk.identity.selected | Selected Identity | Unsigned integer, 2 bytes | 2.4.0 to 2.6.20 |
| ssl.handshake.extensions.supported_version | Supported Version | Unsigned integer, 2 bytes | 2.4.3 to 2.6.20 |
| ssl.handshake.extensions.supported_versions | Supported Versions | Unsigned integer, 2 bytes | 2.4.0 to 2.4.2 |
| ssl.handshake.extensions.supported_versions_len | Supported Versions length | Unsigned integer, 1 byte | 2.4.0 to 2.6.20 |
| ssl.handshake.extensions_alpn_len | ALPN Extension Length | Unsigned integer, 2 bytes | 1.12.0 to 2.6.20 |
| ssl.handshake.extensions_alpn_list | ALPN Protocol | Label | 1.12.0 to 2.6.20 |
| ssl.handshake.extensions_alpn_str | ALPN Next Protocol | Character string | 1.12.0 to 2.6.20 |
| ssl.handshake.extensions_alpn_str_len | ALPN string length | Unsigned integer, 1 byte | 1.12.0 to 2.6.20 |
| ssl.handshake.extensions_ec_point_format | EC point format | Unsigned integer, 1 byte | 1.4.0 to 2.6.20 |
| ssl.handshake.extensions_ec_point_formats | EC point formats | Label | 2.4.0 to 2.6.20 |
| ssl.handshake.extensions_ec_point_formats_length | EC point formats Length | Unsigned integer, 1 byte | 1.4.0 to 2.6.20 |
| ssl.handshake.extensions_elliptic_curve | Elliptic curve | Unsigned integer, 2 bytes | 1.4.0 to 2.2.17 |
| ssl.handshake.extensions_elliptic_curves | Elliptic Curves List | Label | 1.4.0 to 2.2.17 |
| ssl.handshake.extensions_elliptic_curves_length | Elliptic Curves Length | Unsigned integer, 2 bytes | 1.4.0 to 2.2.17 |
| ssl.handshake.extensions_key_share_client_length | Client Key Share Length | Unsigned integer, 2 bytes | 2.4.0 to 2.6.20 |
| ssl.handshake.extensions_key_share_group | Group | Unsigned integer, 2 bytes | 2.4.0 to 2.6.20 |
| ssl.handshake.extensions_key_share_key_exchange | Key Exchange | Sequence of bytes | 2.4.0 to 2.6.20 |
| ssl.handshake.extensions_key_share_key_exchange_length | Key Exchange Length | Unsigned integer, 2 bytes | 2.4.0 to 2.6.20 |
| ssl.handshake.extensions_key_share_selected_group | Selected Group | Unsigned integer, 2 bytes | 2.4.0 to 2.6.20 |
| ssl.handshake.extensions_length | Extensions Length | Unsigned integer, 2 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.extensions_npn | Next Protocol | Character string | 1.8.0 to 2.6.20 |
| ssl.handshake.extensions_npn_length | NPN extension length | Unsigned integer, 2 bytes | 1.8.0 to 1.8.3 |
| ssl.handshake.extensions_npn_str_len | Protocol string length | Unsigned integer, 1 byte | 1.8.0 to 2.6.20 |
| ssl.handshake.extensions_padding | Padding | Label | 1.12.0 to 2.0.5, 2.2.0 |
| ssl.handshake.extensions_padding_data | Padding Data | Sequence of bytes | 1.12.0 to 2.6.20 |
| ssl.handshake.extensions_padding_len | Padding length | Unsigned integer, 2 bytes | 1.12.0 to 2.0.5, 2.2.0 |
| ssl.handshake.extensions_reneg_info | Renegotiation info | Sequence of bytes | 2.0.0 to 2.6.20 |
| ssl.handshake.extensions_reneg_info_len | Renegotiation info extension length | Unsigned integer, 1 byte | 1.8.0 to 2.6.20 |
| ssl.handshake.extensions_server_name | Server Name | Character string | 1.8.0 to 2.6.20 |
| ssl.handshake.extensions_server_name_len | Server Name length | Unsigned integer, 2 bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.extensions_server_name_list_len | Server Name list length | Unsigned integer, 2 bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.extensions_server_name_type | Server Name Type | Unsigned integer, 1 byte | 1.8.0 to 2.6.20 |
| ssl.handshake.extensions_status_request_exts_len | Request Extensions Length | Unsigned integer, 2 bytes | 1.12.0 to 2.6.20 |
| ssl.handshake.extensions_status_request_len | Certificate Status Length | Unsigned integer, 2 bytes | 1.12.0 to 2.6.20 |
| ssl.handshake.extensions_status_request_list_len | Certificate Status List Length | Unsigned integer, 2 bytes | 2.6.0 to 2.6.20 |
| ssl.handshake.extensions_status_request_responder_ids_len | Responder ID list Length | Unsigned integer, 2 bytes | 1.12.0 to 2.6.20 |
| ssl.handshake.extensions_status_request_type | Certificate Status Type | Unsigned integer, 1 byte | 1.12.0 to 2.6.20 |
| ssl.handshake.extensions_supported_group | Supported Group | Unsigned integer, 2 bytes | 2.4.0 to 2.6.20 |
| ssl.handshake.extensions_supported_groups | Supported Groups List | Label | 2.4.0 to 2.6.20 |
| ssl.handshake.extensions_supported_groups_length | Supported Groups List Length | Unsigned integer, 2 bytes | 2.4.0 to 2.6.20 |
| ssl.handshake.g | g | Sequence of bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.g_len | g Length | Unsigned integer, 2 bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.hint | Hint | Sequence of bytes | 1.12.0 to 2.6.20 |
| ssl.handshake.hint_len | Hint Length | Unsigned integer, 2 bytes | 1.12.0 to 2.6.20 |
| ssl.handshake.identity | Identity | Sequence of bytes | 1.12.0 to 2.6.20 |
| ssl.handshake.identity_len | Identity Length | Unsigned integer, 2 bytes | 1.12.0 to 2.6.20 |
| ssl.handshake.key_arg | Key Argument | Label | 1.0.0 to 2.6.20 |
| ssl.handshake.key_arg_length | Key Argument Length | Unsigned integer, 2 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.key_update.request_update | Key Update Request | Unsigned integer, 1 byte | 2.4.0 to 2.6.20 |
| ssl.handshake.length | Length | Unsigned integer, 3 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.md5_hash | MD5 Hash | Label | 1.0.0 to 2.6.20 |
| ssl.handshake.modulus | Modulus | Sequence of bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.modulus_len | Modulus Length | Unsigned integer, 2 bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.npn_padding | Padding | Sequence of bytes | 1.12.0 to 2.6.20 |
| ssl.handshake.npn_padding_len | Padding Length | Unsigned integer, 1 byte | 1.12.0 to 2.6.20 |
| ssl.handshake.npn_selected_protocol | Selected Protocol | Character string | 1.12.0 to 2.6.20 |
| ssl.handshake.npn_selected_protocol_len | Selected Protocol Length | Unsigned integer, 1 byte | 1.12.0 to 2.6.20 |
| ssl.handshake.ocsp_response_len | OCSP Response Length | Unsigned integer, 3 bytes | 2.6.0 to 2.6.20 |
| ssl.handshake.ocsp_response_list_len | OCSP Response List Length | Unsigned integer, 3 bytes | 2.6.0 to 2.6.20 |
| ssl.handshake.p | p | Sequence of bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.p_len | p Length | Unsigned integer, 2 bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.random | Random | Sequence of bytes | 2.0.0 to 2.6.20 |
| ssl.handshake.random_bytes | Random Bytes | Sequence of bytes | 1.0.0 to 1.12.13, 2.4.0 to 2.6.20 |
| ssl.handshake.random_time | GMT Unix Time | Date and time | 1.0.0 to 2.6.20 |
| ssl.handshake.server_curve_type | Curve Type | Unsigned integer, 1 byte | 1.8.0 to 2.6.20 |
| ssl.handshake.server_named_curve | Named Curve | Unsigned integer, 2 bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.server_point | Pubkey | Sequence of bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.server_point_len | Pubkey Length | Unsigned integer, 1 byte | 1.8.0 to 2.6.20 |
| ssl.handshake.session_id | Session ID | Sequence of bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.session_id_hit | Session ID Hit | Boolean | 1.0.0 to 2.6.20 |
| ssl.handshake.session_id_length | Session ID Length | Unsigned integer, 2 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.session_id_length.error | Session ID length error | Label | 1.12.0 to 2.6.20 |
| ssl.handshake.session_ticket | Session Ticket | Sequence of bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.session_ticket_age_add | Session Ticket Age Add | Unsigned integer, 4 bytes | 2.4.0 to 2.6.20 |
| ssl.handshake.session_ticket_length | Session Ticket Length | Unsigned integer, 2 bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.session_ticket_lifetime_hint | Session Ticket Lifetime Hint | Unsigned integer, 4 bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.session_ticket_nonce | Session Ticket Nonce | Sequence of bytes | 2.4.0 to 2.6.20 |
| ssl.handshake.session_ticket_nonce_length | Session Ticket Nonce Length | Unsigned integer, 1 byte | 2.4.0 to 2.6.20 |
| ssl.handshake.sha_hash | SHA-1 Hash | Label | 1.0.0 to 2.6.20 |
| ssl.handshake.sig | Signature | Sequence of bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.sig_hash_alg | Signature Algorithm | Unsigned integer, 2 bytes | 1.4.3 to 2.6.20 |
| ssl.handshake.sig_hash_alg_len | Signature Hash Algorithms Length | Unsigned integer, 2 bytes | 1.4.3 to 2.6.20 |
| ssl.handshake.sig_hash_alg_len.mult2 | Expert Info | Label | 1.12.0 to 2.2.17 |
| ssl.handshake.sig_hash_algs | Signature Algorithms | Label | 1.4.3 to 2.6.20 |
| ssl.handshake.sig_hash_algs.mult2 | Expert Info | Label | 2.0.0 to 2.2.17 |
| ssl.handshake.sig_hash_hash | Signature Hash Algorithm Hash | Unsigned integer, 1 byte | 1.4.3 to 2.6.20 |
| ssl.handshake.sig_hash_sig | Signature Hash Algorithm Signature | Unsigned integer, 1 byte | 1.4.3 to 2.6.20 |
| ssl.handshake.sig_len | Signature Length | Unsigned integer, 2 bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.status_request.undecoded | Responder ID list or Request Extensions are not implemented, contact Wireshark developers if you want this to be supported | Label | 1.12.0 to 2.6.20 |
| ssl.handshake.type | Handshake Message Type | Unsigned integer, 1 byte | 1.0.0 to 2.6.20 |
| ssl.handshake.verify_data | Verify Data | Label | 1.0.0 to 2.6.20 |
| ssl.handshake.version | Version | Unsigned integer, 2 bytes | 1.0.0 to 2.6.20 |
| ssl.handshake.yc | Pubkey | Sequence of bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.yc_len | Pubkey Length | Unsigned integer, 2 bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.ys | Pubkey | Sequence of bytes | 1.8.0 to 2.6.20 |
| ssl.handshake.ys_len | Pubkey Length | Unsigned integer, 2 bytes | 1.8.0 to 2.6.20 |
| ssl.heartbeat_message | Heartbeat Message | Label | 1.8.0 to 2.6.20 |
| ssl.heartbeat_message.padding | Payload Length | Sequence of bytes | 1.8.0 to 2.6.20 |
| ssl.heartbeat_message.payload | Payload Length | Sequence of bytes | 1.8.0 to 2.6.20 |
| ssl.heartbeat_message.payload_length | Payload Length | Unsigned integer, 2 bytes | 1.8.0 to 2.6.20 |
| ssl.heartbeat_message.payload_length.invalid | Invalid heartbeat payload length | Label | 1.12.0 to 2.6.20 |
| ssl.heartbeat_message.type | Type | Unsigned integer, 1 byte | 1.8.0 to 2.6.20 |
| ssl.ignored_unknown_record | Ignored Unknown Record | Label | 2.0.0 to 2.6.20 |
| ssl.malformed.buffer_too_small | Malformed message, not enough data is available | Label | 2.4.0 to 2.6.20 |
| ssl.malformed.trailing_data | Undecoded trailing data is present | Label | 2.4.0 to 2.6.20 |
| ssl.malformed.vector_length | Variable vector length is outside the permitted range | Label | 2.4.0 to 2.6.20 |
| ssl.pct.cert_specs_length | CERT_SPECS Length | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.ch_offset | CH_OFFSET | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.ch_offset.invalid | CH_OFFSET invalid | Label | 2.0.0 to 2.6.20 |
| ssl.pct.challenge_data | Challenge Data | Sequence of bytes | 2.0.0 to 2.6.20 |
| ssl.pct.cipher_specs_length | CIPHER_SPECS Length | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.clear_key_data | Clear Key data | Sequence of bytes | 2.0.0 to 2.6.20 |
| ssl.pct.clear_key_length | Clear Key Length | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.client_cert_length | Client Cert Length | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.client_cert_specs | Client CERT_SPECS | Sequence of bytes | 2.0.0 to 2.6.20 |
| ssl.pct.client_cert_specs_length | Client CERT_SPECS Length | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.client_certificate_data | Client Certificate data | Sequence of bytes | 2.0.0 to 2.6.20 |
| ssl.pct.client_session_id_data | Client Session ID Data | Sequence of bytes | 2.0.0 to 2.6.20 |
| ssl.pct.client_sig_specs_length | Client SIG_SPECS Length | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.client_signature | Client Signature | Sequence of bytes | 2.0.0 to 2.6.20 |
| ssl.pct.client_version | Client Version | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.client_version.invalid | Client Version invalid | Label | 2.0.0 to 2.6.20 |
| ssl.pct.encrypted_key_data | Encrypted Key data | Sequence of bytes | 2.0.0 to 2.6.20 |
| ssl.pct.encrypted_key_length | Encrypted Key Length | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.encryption_key_length | Encryption key length | Unsigned integer, 1 byte | 2.0.0 to 2.6.20 |
| ssl.pct.error_information_data | Error Information data | Sequence of bytes | 2.0.0 to 2.6.20 |
| ssl.pct.error_information_length | Error Information Length | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.exch_specs_length | EXCH_SPECS Length | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.handshake.cert | Cert | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.handshake.certspec | Cert Spec | Label | 2.0.0 to 2.6.20 |
| ssl.pct.handshake.cipher | Cipher | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.handshake.cipherspec | Cipher Spec | Label | 2.0.0 to 2.6.20 |
| ssl.pct.handshake.exch | Exchange | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.handshake.exchspec | Exchange Spec | Label | 2.0.0 to 2.6.20 |
| ssl.pct.handshake.hash | Hash | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.handshake.hashspec | Hash Spec | Label | 2.0.0 to 2.6.20 |
| ssl.pct.handshake.server_cert | Server Cert | Sequence of bytes | 2.0.0 to 2.6.20 |
| ssl.pct.handshake.sig | Sig Spec | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.hash_specs_length | HASH_SPECS Length | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.iv_data | IV data | Sequence of bytes | 2.0.0 to 2.6.20 |
| ssl.pct.iv_length | IV Length | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.mac_key_length_in_bits | MAC key length in bits | Unsigned integer, 1 byte | 2.0.0 to 2.6.20 |
| ssl.pct.msg_error_code | PCT Error Code | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.pad | PAD | Sequence of bytes | 2.0.0 to 2.6.20 |
| ssl.pct.response_data | Response data | Sequence of bytes | 2.0.0 to 2.6.20 |
| ssl.pct.response_length | Response Length | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.server_certificate_length | Server Certificate Length | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.server_response | Server Response | Sequence of bytes | 2.0.0 to 2.6.20 |
| ssl.pct.server_response_length | Server Response Length | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.server_session_id_data | Server Session ID data | Sequence of bytes | 2.0.0 to 2.6.20 |
| ssl.pct.server_version | Server Version | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct.server_version.invalid | Server Version invalid | Label | 2.0.0 to 2.6.20 |
| ssl.pct.sh_client_auth_req_flag | SH_CLIENT_AUTH_REQ flag | Unsigned integer, 1 byte | 2.0.0 to 2.6.20 |
| ssl.pct.sh_restart_session_ok_flag | SH_RESTART_SESSION_OK flag | Unsigned integer, 1 byte | 2.0.0 to 2.6.20 |
| ssl.pct.specs_mismatch_cert | SPECS_MISMATCH_CERT | Unsigned integer, 1 byte | 2.0.0 to 2.6.20 |
| ssl.pct.specs_mismatch_cipher | SPECS_MISMATCH_CIPHER | Unsigned integer, 1 byte | 2.0.0 to 2.6.20 |
| ssl.pct.specs_mismatch_client_cert | SPECS_MISMATCH_CLIENT_CERT | Unsigned integer, 1 byte | 2.0.0 to 2.6.20 |
| ssl.pct.specs_mismatch_client_sig | SPECS_MISMATCH_CLIENT_SIG | Unsigned integer, 1 byte | 2.0.0 to 2.6.20 |
| ssl.pct.specs_mismatch_exch | SPECS_MISMATCH_EXCH | Unsigned integer, 1 byte | 2.0.0 to 2.6.20 |
| ssl.pct.specs_mismatch_hash | SPECS_MISMATCH_HASH | Unsigned integer, 1 byte | 2.0.0 to 2.6.20 |
| ssl.pct.verify_prelude_data | Verify Prelude data | Sequence of bytes | 2.0.0 to 2.6.20 |
| ssl.pct.verify_prelude_length | Verify Prelude Length | Unsigned integer, 2 bytes | 2.0.0 to 2.6.20 |
| ssl.pct_handshake.type | Handshake Message Type | Unsigned integer, 1 byte | 1.0.0 to 2.6.20 |
| ssl.quic.initial_version | Initial Version | Unsigned integer, 4 bytes | 2.6.0 to 2.6.20 |
| ssl.quic.len | Parameters Length | Unsigned integer, 2 bytes | 2.6.0 to 2.6.20 |
| ssl.quic.negotiated_version | Negotiated Version | Unsigned integer, 4 bytes | 2.6.0 to 2.6.20 |
| ssl.quic.parameter | Parameter | Label | 2.6.0 to 2.6.20 |
| ssl.quic.parameter.ack_delay_exponent | ack_delay_exponent | Unsigned integer, 1 byte | 2.6.0 to 2.6.20 |
| ssl.quic.parameter.idle_timeout | idle_timeout | Unsigned integer, 2 bytes | 2.6.0 to 2.6.20 |
| ssl.quic.parameter.initial_max_data | initial_max_data | Unsigned integer, 4 bytes | 2.6.0 to 2.6.20 |
| ssl.quic.parameter.initial_max_stream_data | initial_max_stream_data | Unsigned integer, 4 bytes | 2.6.0 to 2.6.20 |
| ssl.quic.parameter.initial_max_stream_id_bidi | initial_max_stream_id_bidi | Unsigned integer, 4 bytes | 2.6.0 to 2.6.20 |
| ssl.quic.parameter.initial_max_stream_id_uni | initial_max_stream_id_uni | Unsigned integer, 4 bytes | 2.6.0 to 2.6.20 |
| ssl.quic.parameter.length | Length | Unsigned integer, 2 bytes | 2.6.0 to 2.6.20 |
| ssl.quic.parameter.max_packet_size | max_packet_size | Unsigned integer, 2 bytes | 2.6.0 to 2.6.20 |
| ssl.quic.parameter.stateless_reset_token | stateless_reset_token | Sequence of bytes | 2.6.0 to 2.6.20 |
| ssl.quic.parameter.type | Type | Unsigned integer, 2 bytes | 2.6.0 to 2.6.20 |
| ssl.quic.parameter.value | Value | Sequence of bytes | 2.6.0 to 2.6.20 |
| ssl.quic.supported_versions | Supported Versions | Unsigned integer, 4 bytes | 2.6.0 to 2.6.20 |
| ssl.quic.supported_versions.len | Supported Versions Length | Unsigned integer, 2 bytes | 2.6.0 to 2.6.20 |
| ssl.reassembled.data | Reassembled PDU data | Sequence of bytes | 1.10.0 to 2.6.20 |
| ssl.reassembled.length | Reassembled PDU length | Unsigned integer, 4 bytes | 1.4.0 to 2.6.20 |
| ssl.reassembled_in | Reassembled PDU in frame | Frame number | 1.0.0 to 2.6.20 |
| ssl.record | Record Layer | Label | 1.0.0 to 2.6.20 |
| ssl.record.content_type | Content Type | Unsigned integer, 1 byte | 1.0.0 to 2.6.20 |
| ssl.record.is_escape | Is Escape | Boolean | 1.0.0 to 2.6.20 |
| ssl.record.length | Length | Unsigned integer, 2 bytes | 1.0.0 to 2.6.20 |
| ssl.record.length.invalid | Record fragment length is too large | Label | 2.4.0 to 2.6.20 |
| ssl.record.opaque_type | Opaque Type | Unsigned integer, 1 byte | 2.4.0 to 2.6.20 |
| ssl.record.padding_length | Padding Length | Unsigned integer, 1 byte | 1.0.0 to 2.6.20 |
| ssl.record.version | Version | Unsigned integer, 2 bytes | 1.0.0 to 2.6.20 |
| ssl.resumed | This session reuses previously negotiated keys (Session resumption) | Label | 2.0.0 to 2.6.20 |
| ssl.sct.sct_extensions | Extensions | Label | 2.4.0 to 2.6.20 |
| ssl.sct.sct_extensions_length | Extensions length | Unsigned integer, 2 bytes | 2.4.0 to 2.6.20 |
| ssl.sct.sct_length | Serialized SCT Length | Unsigned integer, 2 bytes | 2.4.0 to 2.6.20 |
| ssl.sct.sct_logid | Log ID | Sequence of bytes | 2.4.0 to 2.6.20 |
| ssl.sct.sct_signature | Signature | Sequence of bytes | 2.4.0 to 2.6.20 |
| ssl.sct.sct_signature_length | Signature Length | Unsigned integer, 2 bytes | 2.4.0 to 2.6.20 |
| ssl.sct.sct_timestamp | Timestamp | Date and time | 2.4.0 to 2.6.20 |
| ssl.sct.sct_version | SCT Version | Unsigned integer, 1 byte | 2.4.0 to 2.6.20 |
| ssl.sct.scts_length | Serialized SCT List Length | Unsigned integer, 2 bytes | 2.4.0 to 2.6.20 |
| ssl.segment | SSL segment | Frame number | 1.0.0 to 2.6.20 |
| ssl.segment.count | Segment count | Unsigned integer, 4 bytes | 1.6.0 to 2.6.20 |
| ssl.segment.data | SSL segment data | Sequence of bytes | 1.10.0 to 2.6.20 |
| ssl.segment.error | Reassembling error | Frame number | 1.0.0 to 2.6.20 |
| ssl.segment.multipletails | Multiple tail segments found | Boolean | 1.0.0 to 2.6.20 |
| ssl.segment.overlap | Segment overlap | Boolean | 1.0.0 to 2.6.20 |
| ssl.segment.overlap.conflict | Conflicting data in segment overlap | Boolean | 1.0.0 to 2.6.20 |
| ssl.segment.toolongfragment | Segment too long | Boolean | 1.0.0 to 2.6.20 |
| ssl.segments | Reassembled SSL segments | Label | 1.0.0 to 2.6.20 |
| ssl.unexpected_message | Unexpected message | Label | 2.4.0 to 2.6.20 |
Анализ pcap-файлов
Обычно я использую Wireshark для выяснения причин сетевых неполадок. Последовательность действий, выполняемая в ходе решения подобных задач, выглядит так:
- Захват пакетов с помощью
tcpdump(обычно — с помощью команды наподобиеsudo tcpdump port 443 -w output.pcap). - Копирование pcap-файла на рабочий ноутбук (
scp host:~/output.pcap .). - Открытие pcap-файла с помощью Wireshark (
wireshark output.pcap).
Как видите, всё очень просто. Однако, после того, как pcap-файл открыт в программе, у вас может возникнуть закономерный вопрос о том, что со всем этим делать. Поговорим об этом.
Анализ tcp-соединений
Часто, когда я анализирую в Wireshark некую ситуацию, мне нужно проверить какое-то конкретное TCP-соединение, с которым, по какой-то причине, что-то не так. Благодаря Wireshark можно проанализировать весь жизненный цикл отдельного TCP-соединения и выяснить причины неправильного поведения системы.
Сделать это можно, щёлкнув правой кнопкой мыши по интересующему вас пакету и выбрав в контекстном меню команду Conversation filter > TCP.
Начало анализа TCP-соединения
После этого Wireshark покажет другие пакеты из того же TCP-соединения, к которому принадлежит тот пакет, по которому вы щёлкнули. На рисунке ниже можно видеть пример успешного SSL-соединения — тут присутствуют пакеты client hello, service hello, certificate, server key exchange, которые используются для установления SSL-соединений.
Анализ TCP-соединения
Рассматриваемую здесь методику анализа TCP-пакетов мне пришлось использовать в день написания этой статьи, на работе. Некоторые соединения сбрасывались, и я заметила, что после отправки пакета client hello клиент отправлял пакет FIN ACK, который завершал TLS-соединение.
Выше описана весьма типичная для меня схема работы с Wireshark. Обычно в соединении участвуют клиент и сервер, и что-то идёт не так либо на клиенте, либо на сервере. Это может быть, например, какой-нибудь сбой или ошибка в настройках системы. В результате Wireshark оказывает мне просто бесценную помощь в деле определения виновника проблем, помогая выяснить — клиент это или сервер.
Анализ трафика в wireshark
В большинстве случаев (почти всегда) анализ перехваченного трафика происходит в оффлайн-режиме. Т.е. ты сначала перехватываешь трафик, потом сохраняешь его в файл перехвата (File->Save). Потом опять перехватываешь и опять сохраняешь, потом объединяешь все файлы перехвата в один (File->Merge).
И только потом, в комфортных условиях, анализируешь весь трафик скопом. И, кстати, эти функции, с сохранением и объединением, ты будешь использовать гораздо чаще чем ты думаешь. С сохранением, потому что получить с первого раза сведения которые тебе нужны удаётся далеко не всегда.
Как ты наверняка заметил файлы перехвата содержат огромное количество строк, и что бы быстро в них ориентироваться нужно научится делать несколько вещей:
- Поиск по пакетам. При нажатии комбинации клавиш Ctrl F открывается панель поиска. Там есть несколько вариантов поиска, но на данном этапе тебе достаточно будет использовать Display filter который позволяет создать фильтр, чтобы найти только те пакеты, которые отвечают заданному в нем выражению и String — осуществляет поиск в строках по указанным символам (поиск вперед Ctrl N, поиск назад Ctrl B;
- Отметка пакетов. Очень часто бывает что ты нашел нужный пакет, но есть необходимость вернуться к нему позже, для этого этот пакет можно отметить, нажми правой кнопкой на нужный пакет в Packet List и выбери Mark Packet или нажми Ctrl M, отмечать можно любое количество пактов, а чтобы перемещаться между отмеченными пакетами используются комбинации клавиш Shift Ctrl N — следующий и Shift Ctrl B — предыдущий.
- Фильтры. Фильтр — это выражение, в котором задаются критерии для включения или исключения пакетов из анализа. В Wireshark выделяют два вида фильтров: фильтры перехвата и фильтры отображения. Мы рассмотрим некоторые примеры применения фильтров, но про сами фильтры я сделаю отдельную статью. Потому, что там надо будет изучить довольно большой объём информации: логику применения, синтаксис, операторы. Короче это отдельная большая тема.
Интерфейс wireshark
Перед нами появится основное окно программы с которым мы будем проводить больше всего времени. И сразу начнут перехватываться данные. Пока что нажмём «Стоп» (красный квадратик в левом верхнем углу) и порассматриваем интерфейс программы.
Пройдёмся по интерфейсу сверху вниз:
- В самом верху, под главным меню, находится панель с кнопками — это Main Toolbar. Здесь находятся основные элементы управления программой — старт/стоп и настройки захвата, открытие/закрытие файлов захвата, навигация по пакетам и управлением размером текста;
- Сразу под ней находится — Filter Toolbar — здесь мы будем вписывать фильтры и операторы, но об этом чуть позже;
- Ещё ниже находится — Packet List . Это таблица в которой отображаются все пакеты из текущей сессии перехвата или из открытого файла перехвата;
- Под ним — Packet Details — здесь отображаются сведения о выбранном пакете (выбирать пакеты можно в Packet List);
- И самое нижнее окошко — Packet Bytes. Здесь показаны исходные данные пакета в необработанном виде, т.е. в том виде, в каком пакет передаётся по сети. (Сейчас бы начать тебе про интерпретацию пакетов рассказывать, но это в другой раз)
Использование wireshark для изучения сетевых протоколов
В этом материале встречаются некоторые термины, которые можно отнести к чему-то вроде жаргона сетевых специалистов. Например — кадр (frame), TCP-порт (TCP port), DNS-ответ (DNS response), IP-адрес источника (source IP address), пакет
client hello
SSL-соединения (SSL client hello). Одной из причин их использования является тот факт, что Wireshark, определённо, не пытается оградить пользователя от тонкостей внутреннего устройства сетевых технологий. Новичка такое положение дел может, поначалу, заставить задуматься о том, что Wireshark — это программа не для него, а лишь для опытных сетевых специалистов.
У такой ориентированности Wireshark на низкоуровневые сетевые механизмы, однако, есть серьёзный плюс. Дело в том, что работая с этой программой, можно узнать что-то новое о сетевых протоколах. Например, я не особенно много знаю о внутренних механизмах протокола TLS/SSL.
Однако, анализируя трафик в Wireshark, я обратила внимание на то, что первые два пакета SSL-соединения — это client hello и server hello. В результате протокол, который, если не вникать в детали его работы, кажется чем-то таинственным и недоступным для понимания, начинает обретать более понятную форму, превращается в нечто такое, что можно понять и проанализировать.
Как расшифровать ssl в wireshark?
если себя снифаешь ну или свои устройства, подписывай сертификат, инсталь на устройства, далее в акуле есть в меню пунктик декрипта пакета на основе ключей, грубо говоря хендшейка, на хабре неоднократно об этом писалось, посмотри статью где перехват трафика покер рума делается
А изи хак конечно же как выше предложено – fiddler, исталишь в настройках https галочку на декрипте, добавляешь серт в доверенные, и уже с устройства на котором снифаешь топаешь с включенным фидлером ipv4.fiddler:8888 (порт дефолтный, если меняешь – указываешь тот который в роли дебаг прокси) и на этой страничке исталишь сертификат. Далее выполняешь задачу требуемую
Если же с компа снифвешь, там через winnt ставится прокси, ну подробнее можешь в faq на сайте почитать, если нужно приложение отснифать которое не поддерживает установку прокси, любым софтом можно завернуть траф в твой дебаг прокси = профит
Настройка wireshark
Общие параметры самого приложения WIreshark находятся во вкладке Edit->Preferences. Их можно настроить в зависимости от своих потребностей или предпочтений. Но я бы, на стадии знакомства с программой, не рекомендовал туда лезть. С опытом использования программы и работы с трафиком, понимание что тебе нужно подкрутить для удобства придет само. А потому просто кратко перечислим какие здесь есть разделы:
- Appearance (Внешний вид). Грубо говоря здесь определяется внешний вид программы. Положение окон, расположение основных панелей, расположение полосы прокрутки и столбцов в панели Packet List, шрифты, а также цвета фона и шрифтов.
- Capture (Перехват). В этом разделе можно настроить порядок перехвата пакетов. В том числе стандартный интерфейс для перехвата, параметры обновления панели Packet List в реальном времени.
- Filter Expressions (Фильтрующие выражения). Здесь можно создавать фильтры сетевого трафика и управлять ими. Этот момент мы обсудим отдельно.
- Name Resolution (Преобразование имен). В этом разделе активируются средства Wireshark, позволяющие преобразовывать адреса в имена, более удобные для понимания. В том числе адреса канального, сетевого и транспортного уровня. А также можно указывать максимальное количество параллельных запросов на преобразование имен.
- Protocols (Протоколы). В этом разделе находятся параметры, влияющие на перехват и отображение различных пакетов, которые Wireshark может декодировать. Правда настраивать параметры можно далеко не для всех протоколов. Да и в большинстве случаев, без острой на то необходимости, менять здесь ничего не надо.
- Statistics (Статистика). Название раздела говорит само за себя, здесь находятся параметры отображения и ведения статистики.
- Advanced (Продвинутый). Параметры которые не вошли не в одну из перечисленных категорий, либо предназначены для более тонкой настройки функционала. Вот сюда точно лезть не нужно.
Если ты планируешь в большей мере работать с трафиком беспроводных сетей, то есть смысл немного кастомизировать рабочие области Wireshark для большего удобства. А именно добавить несколько дополнительных столбцов, информация из которых поможет значительно сэкономить время.
Перейдем в Edit->Preferences и во вкладке Appearance выберем раздел Columns. Здесь жмем на плюсик и добавляем такие колонки, с такими параметрами:
- Title: Channel, Type: Custom, Fields: wlan_radio.channel — будет показывать нам канал в котором перехвачен пакет;
- Title: Signal Strenght, Type: Custom, Fields: wlan_radio.signal_dbm — покажет мощность сигнала в канале в момент перехвата пакета.
Перехват handshake
Как узнать пароль wi-fi сети я статью уже писал, поэтому примем за аксиому что он у тебя есть. А SSID и канал мы и так видим в Wireshark, вопрос остаётся только в PTK. Соответственно нужно перехватить рукопожатие и не какое-нибудь, а именно то которое произошло между интересующим нас клиентом и точкой доступа непосредственно перед обменом интересующей нас информацией.
Можем сразу открываем терминал и запускаем перехват рукопожатия:
sudo airodump-ng wlan0mon --channel 11 --write 123
ждать повторных подключений мы не будем, поэтому помогаем отключится всем устройствам в сети:
aireplay-ng --deauth 100 -a 3c:15:c2:f0:b8:4c wlan0mon
и спустя небольшой промежуток времени видим в правом верхнем углу нашего терминала появилась надпись: WPA handshake
это означает, что рукопожатие мы получили, а значит успех близок. Вернемся в Wireshark.
В Filter Toolbar нужно написать:
eapol
Это необходимо что бы убедится что рукопожатие действительно у нас, если это так — можем продолжать. Теперь сделаем то, что я чуть раньше предупреждал не делать, а именно поменяем настройки протоколов. Идём Edit-> Preferences и выбираем вкладку Protocols. В ней нам надо найти IEEE 802.11 и поставить галку Enable decryption после чего нажать Edit
в появившемся окне жмём « » и там где Key type выбрать wpa-pwd. А там где Key нужно ввести через двоеточие «пароль:имя сети». Потом нажать ОК и сохранить изменения в настройках протокола.
сразу после этого захваченный трафик будет расшифрован и начнет приобретать более вразумительный и понятный вид.
Поиск пакетов
Wireshark поддерживает мощный язык запросов. Это значительно упрощает поиск конкретных пакетов в списках. Обычно я, при работе с программой, использую очень простые запросы. Вот несколько примеров:
Язык запросов Wireshark обладает гораздо большими возможностями, нежели язык запросов
tcpdump
(и, кроме того, поддерживает автозавершение по нажатию клавиши TAB). В результате часто я применяю следующую последовательность действий: захватываю большой объём пакетов с помощью
tcpdump
(скажем, нечто вроде всех пакетов с 443-го порта), а затем тщательно изучаю их с использованием Wireshark.
Практика анализа трафика беспроводных сетей
Я уже упоминал, что для сбора трафика в беспроводной сети нужно использовать режим мониторинга сетевого адаптера, но в этом режиме будет работать именно наш сетевой адаптер. Но при этом, для понимания ситуации в целом, неплохо бы знать в каких вообще режимах могут работать сетевые адаптеры:
- Управляемый режим (Managed mode). Применяется в том случае, если клиент беспроводной сети подключается непосредственной к точке беспроводного доступа. В подобных случаях программный драйвер, связанный с адаптером беспроводной связи, использует точку беспроводного доступа для управления всем процессом обмена данными по беспроводной сети.
- Режим прямого подключения (Ad-hoc mode). Применяется в том случае, если организована беспроводная сеть, в которой устройства подключаются непосредственно друг к другу. В этом режиме два клиента беспроводной сети, которым требуется обмениваться данными друг с другом, разделяют обязанности, которые обычно возлагаются на точку беспроводного доступа.
- Ведущий режим (Master mode). Некоторые адаптеры беспроводной связи поддерживают также ведущий режим. В этом режиме адаптеру беспроводной связи разрешается работать вместе со специальным программным драйвером, чтобы компьютер, на котором установлен этот адаптер, действовал в качестве точки беспроводного доступа для других устройств.
- Режим мониторинга, его ещё называю режим контроля (Monitor mode). Это тот самый режим который мы будем использовать для перехвата и анализа пакетов. Позволяет прослушивать пакеты, распространяемые в эфире. Для полноценного перехвата и анализа пакетов адаптер вместе с программным драйвером должен поддерживать режим текущего контроля, называемый также режимом RFMON, т.е. режимом радиочастотного контроля.
Схематично принцип действия режимов можно нарисовать так:
Просмотр содержимого пакетов
В Wireshark имеется просто восхитительный режим просмотра подробных сведений о пакете, с помощью которого можно разобраться в содержимом любого пакета. Возьмём, например, пакет с сообщением
client hello
из предыдущего примера. Это — первый пакет SSL-соединения, клиент с его помощью как бы говорит: «Привет! Вот он я!».
Wireshark даёт сетевому администратору два невероятно полезных инструмента для исследования содержимого пакетов. Первый — это режим просмотра, в котором можно раскрывать заголовки, имеющиеся у пакета (например — Ethernet-заголовок, IP-заголовок, TCP-заголовок) и просматривать их содержимое.
Анализ заголовков пакета
Работа с географической базой geoip
Если Wireshark скомпилирован с поддержкой GeoIP и у вас есть бесплатные базы Maxmind, то программа может определять местоположение компьютеров по их IP-адресам. Проверьте в
About | Wireshark
, что программа скомпилирована с той версией, какая у вас в наличии. Если GeoIP присутствует в списке, то проверьте наличие на диске баз GeoLite City, Country и ASNum. Укажите расположение баз в меню
Edit | Preferences | Name Resolution
Проверьте систему на дампе трафика, выбрав опцию Statistics | Endpoints | IPv4. В колонках справа должна появиться информация о местоположении и ASN для IP-адреса.
Другая функция GeoIP — фильтрация трафика по местоположению с помощью фильтра ip.geoip. Например, так можно исключить трафик из конкретной ASN. Нижеуказанная команда исключает пакеты от сетевого блока ASN 63949 (Linode).
ip and not ip.geoip.asnum == 63949Конечно, тот же фильтр можно применить
. Удалите шум и оставьте только действительно интересный трафик.
Фильтрация по идентификатору
Wireshark собирает данные всех сетей находящихся в радиусе действия сетевого адаптера, поэтому наиболее логично первоначально отфильтровать трафик конкретной сети, которая нас интересует. Сделать это можно по имени беспроводной сети (SSID):
wlan.ssid == имя_сети хотя наиболее корректно будет отфильтровать по bssid. BSSID — это идентификатор базового набора услуг (Basic Service Set Identifier). Он присваивается каждой точке и идентифицирует её, при этом он посылается в каждом беспроводном пакете управления и пакете данных из передающей точки доступа.
wlan.bssid == 3c:15:c2:f0:b8:4c
Часто используемые фильтры wireshark
Не менее полезным, в некоторых ситуациях будет отфильтровать трафик по используемому каналу связи:
wlan_radio.channel == 10
Используя фильтр:
arp
можно увидеть трафик передаваемый по протоколу ARP, это даст возможность понять какие устройства в данный момент подключены к локальной сети, увидеть их MAC и IP адреса.
Также довольно часто используются такие фильтры:
dns
покажет отправленные dns-запросы, так можно узнать какие сайты посещал пользователь и какими онлайн-ресурсами пользовался.
ip.addr == 192.168.183.129
отфильтрует трафик связанный с конкретным IP (где он был получателем или отправителем).
tcp
покажет tcp трафик, по такому же принципу можно отфильтровать трафик по любому другому протоколу, например udp или icmp.
