Int ssl_log_secret ( const SSL * ssl, const char * label, const uint8_t * secret, size_t secret_len ) ) ĬALLBACK_OFFSET was determined by disassembling libboringssl.dylib, and like all magic numbers is fragile as it may change if the struct changes in future versions, or on different CPU architectures.
Wireshark https capture code#
Searching the code for the labels that are defined in key log format finds examples like this one in where the CLIENT_RANDOM values are being logged: In iOS11, Apple migrated from OpenSSL to Google’s BoringSSL so Tom and Marat’s code stopped working but the ideas it introduced remained valid and compared to OpenSSL the BoringSSL code easier to understand.Īnd as Chrome supports TLS key logging so BoringSSL already contains code to log TLS keys. Tom and Marat used Frida to hook the CoreTLS function ( tls_handshake_internal_prf) that generated key material and dump the relevant TLS keys.Īlthough I got a modified version of their code working well enough to inspect some apps, and talk about it at JSOxford I never quite managed to address extracting keys for resumed TLS sessions and some other cases where it didn’t work. I first came across Frida a few years when someone shared Tom Curran and Marat Nigmatullin's paper on TLS Session Key Extraction from Memory on iOS Devices. I’ve filtered the capture to just display HTTP and HTTPS traffic and highlighted the start of one of the decrypted HTTP/2 connections. You can also launch Wireshark, open the packet capture, and then specify the keylog in Preferences > Protocols > TLS > (Pre)-Master-Secret log filename Wireshark -r bbc-news.pcap -o tls:keylog_file:bbc-news.keylog
To decrypt the packets we need the matching TLS keys, Chrome and Firefox will provide these when the SSLKEYLOGFILE environment variable is set but unfortunately there seems to be no equivalent for Safari.įortunately thanks to tools like Frida, we have the ability to implement it ourselves. I’ve filtered the capture to just display the traffic to and from But as the traffic is encrypted using TLS 1.2 we can’t see the contents of the packets. You should see a screen something like this:
Wireshark https capture install#
If they’re not already installed, install xcode’s command line tools:.
You can find more details in this article from Apple but the basic process is: This mirrors the network traffic from the device to a virtual interface in MacOS and from there the traffic can be captured using tools like tcpdump and Wireshark.
Capturing iOS network trafficĪpple support capturing iOS device network traffic via a Remote Virtual Interface (RVI). In this post I walk through how I capture iOS apptraffic using tcpdump, and how I use a Frida script to extract the TLS keys during the capture so that I can decrypt the traffic too. Safari and iOS doesn’t have this feature natively, and proxies like Charles only communicate to the browser via HTTP/1.x so I needed to find another solution. One challenge with analysing HTTP/2 traffic is that it’s encrypted and while Chrome and Firefox support logging TLS keys and tools like Wireshark can then decrypt the traffic. Sometimes I can use the tools built into browsers, other times proxies, but when I want to take a deeper look and particularly if I’m looking at how a browser is using HTTP/2, I rely on packet captures.
I often want to examine the web traffic generated by browsers, and other apps.