diff --git a/content/posts/figuring-out-https-mitm.md b/content/posts/figuring-out-https-mitm.md new file mode 100644 index 0000000..a6932ae --- /dev/null +++ b/content/posts/figuring-out-https-mitm.md @@ -0,0 +1,107 @@ ++++ +title = "Figuring Out HTTPS MITM in India" +date = "2021-12-25" +author = "Ceda EI" +tags = ["security", "internet"] +keywords = ["security", "internet"] +description = "Being served a MITM page over HTTPS" +showFullContent = false ++++ + +Belonging to India, I am very used to seeing random websites being blocked. +However, today was particularly scary because the [MITM (Man In The Middle +attack)](https://en.wikipedia.org/wiki/Man-in-the-middle\_attack) happened over +HTTPS. I visited [usebottles.com](https://usebottles.com/) over HTTPS and was +served with the following page. + +![](/images/usebottles\_censored.webp) + +Notice the padlock in the address bar. Checking into it, the certificate is +valid and signed by [Cloudflare](https://cloudflare.com/). + +![](/images/usebottles\_certificate.webp) + +## Further Exploration and Hypothesis + +The initial hypothesis was that the Indian Government or the ISP has +Cloudflare's signing keys and are serving the blocked page over HTTPS. This +seems unlikely however and would be a very severe thing and would essentially +erode all trust in HTTPS at scale as Cloudflare can sign any website's domain +which essentially means that ISPs could MITM + +After a bit of exploration, the DNS entry of +[usebottles.com](https://usebottles.com) points to `172.67.197.25` and +`104.21.92.184`. I checked that both of these IPs were owned by Cloudflare. To +ensure that the DNS entries weren't being MITM attacked either, I checked for +the same from my Hetzner Server. + +The second possibility that arises from this is that Cloudflare itself was +serving the blocked page. While more likely than the previous scenario, it is +still unlikely generally. I looked for any notices from Cloudflare about this +and could not find any. + +At this point, I was mostly out of ideas. I looked into the source of the page +and found something interesting. The entire page's source was the following +(invalid) HTML: + +```html + + + +``` + +The most interesting part of this was that the iframe's URL pointed to +[airtel.in](https://www.airtel.in/). Airtel is an ISP in India, however, I was +not using internet services from Airtel. + +My presumption is based on this. + +## Final Hypothesis + +This is what I presume is happening. + +``` +Me <---> Cloudflare <---> usebottles' server + 1 2 +``` + +So far, we have been assuming the MITM is happening at `1` i.e. between Me and +Cloudflare. However, the fact that `2` is secure isn't guaranteed. + +My best guess is that the Cloudflare server I am getting connected to happens +to be using Airtel as the ISP. When Cloudflare's server tries to connect to +usebottles' server, Cloudflare gets MITM attacked by their ISP - Airtel. +Likely, SSL is not enforced between Cloudflare and usebottles' server. Thus, +Cloudflare connects to usebottles' server over HTTP. + +Normally, a connection would happen the following way: + +1. I connect to https://usebottles.com/ +2. I get connected to Cloudflare's server. +3. Cloudflare's server reaches out to usebottle's server. +4. usebottles' server sends a response. +5. Cloudflare signs the response with the certificate. +6. I get a webpage over HTTPS. + +What seems to be happening is: + +1. I connect to https://usebottles.com/ +2. I get connected to Cloudflare's server. +3. Cloudflare's server reaches out to usebottle's server. +4. **Airtel intercepts the request and sends the blocking page** +5. Cloudflare signs the **blocking page** with the certificate. +6. I get **blocking page** served over HTTPS. + +I would be interested in knowing if there are any alternative explanations to +this or something I have missed. You can [contact +me](https://webionite.com/#contact) to let me know! diff --git a/static/images/usebottles_censored.webp b/static/images/usebottles_censored.webp new file mode 100644 index 0000000..b74843c Binary files /dev/null and b/static/images/usebottles_censored.webp differ diff --git a/static/images/usebottles_certificate.webp b/static/images/usebottles_certificate.webp new file mode 100644 index 0000000..b040f05 Binary files /dev/null and b/static/images/usebottles_certificate.webp differ