Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

CrackMe

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 27.07.2012, 03:52    Titel: CrackMe Antworten mit Zitat

Ich habe heute dieses Programm von AndT gefunden: http://www.freebasic.net/forum/viewtopic.php?f=7&t=17488

Ich hab jetzt was ähnliches gemacht, es ist allerdings noch trickreicher.

Es ist auch ein Hacking-Spiel. Ziel ist es hier, den Server zu crashen (d.h. zur "FATAL EXCEPTION"-Ausgabe zu kommen).

Regeln:
1) Code lesen ist erlaubt. (Ansonsten würdet ihr es wohl nie schaffen.)
2) Code modifizieren ist verboten.
3) Die EXE zu hacken ist verboten (also nicht per Debugger Code umschreiben oder im Speicher was ändern.)
Code einfach "as-is" verwenden.

Wenn ihr es schafft, posted wie ihr es geschafft habt!

Code:
Enum Boolean
   TRUE = -1
   FALSE
End Enum

Enum EPrivilegeLevel
   PRIV_NONE = 0
   PRIV_USER = 32
   PRIV_ADMIN = 64
End Enum

Type TUser
   Name As ZString * 16
   Password As ZString * 16
   PrivilegeLevel As EPrivilegeLevel
End Type

Dim Shared Users(...) As TUser = { _
   ("guest", "", PRIV_USER), _
   ("bob", "dha72", PRIV_USER), _
   ("ronald", "hhs6fsd", PRIV_USER), _
   ("macgyver", "tehbest", PRIV_ADMIN), _
   ("t_rex", "91kfds4", PRIV_ADMIN) _
}

Function IsRemoteAccess() As Boolean
   ' Since we are simulating remote access, this function always returns TRUE
   Return TRUE
End Function

Sub Console(User As TUser)
   ' Normally, here would be a nice console
   ' For this simulation, it's enough to output the privilege level
   Print
   Print "Welcome, " & User.Name & "!"
   Select Case User.PrivilegeLevel
      Case PRIV_NONE
         Print "An internal error occured!"
         Beep()
      Case PRIV_USER
         Print "You have user privileges."
         ' A little simulation of user input.
         Print "~ $ ";
         Sleep(500, 1)
         Print "echo Yeah, here is a console! (Or would be.)"
         Sleep(500, 1)
         Print "Yeah, here is a console! (Or would be.)"
         Print "~ $ ";
         Sleep(500, 1)
         Print "killall -9 init"
         Sleep(500, 1)
         Print "Access denied"
         Print "~ $ ";
         Sleep(500, 1)
         Print "logout"
         Sleep(500, 1)
         Print "You have been logged out."
      Case PRIV_ADMIN
         Print "You have admin privileges."
         ' A little simulation of user input.
         Print "~ # ";
         Sleep(500, 1)
         Print "echo Yeah, here is a console! (Or would be.)"
         Sleep(500, 1)
         Print "Yeah, here is a console! (Or would be.)"
         Print "~ # ";
         Sleep(500, 1)
         Print "killall -9 init"
         Sleep(500, 1)
         Print "FATAL EXCEPTION: init process was killed!"
         Beep()
         Sleep
         End(0)
   End Select
End Sub

Sub AskForCredentials(ByRef Username As ZString, ByRef Password As ZString)
   Print
   Input "Enter username: ", Username
   Input "Enter password: ", Password
End Sub

Sub Main()
   Print "Welcome to Cherry Networks!"
   If IsRemoteAccess() Then
      Print "*** You are using remote login. Only guests and normal users are allowed. ***"
   EndIf
   Print
   
   Do
      Dim CurrentUser As TUser
      AskForCredentials(CurrentUser.Name, CurrentUser.Password)
      
      For i As Integer = LBound(Users) To UBound(Users)
         If Users(i).Name = CurrentUser.Name AndAlso Users(i).Password = CurrentUser.Password Then
            If Users(i).PrivilegeLevel = PRIV_ADMIN AndAlso IsRemoteAccess() Then
               Print "Remote access for administrators not allowed!"
               Print "(This has been enabled to prevent script kiddies from doing any damage"
               Print "on the server.)"
            Else
               CurrentUser.PrivilegeLevel = Users(i).PrivilegeLevel
            EndIf
         EndIf
      Next
      
      If CurrentUser.PrivilegeLevel = PRIV_NONE Then
         Print "Login failed! Please try again!"
         Beep()
      Else
         Console(CurrentUser)
      EndIf
   Loop
End Sub

Main()


Ich habe da keine Konsole eingebaut, nur eine kleine "Konsolensimulation".

Es ist wirklich möglich, es zu hacken, auch wenn es am Anfang unmöglich aussieht.

Viel Spaß!
Cherry
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 27.07.2012, 11:28    Titel: Antworten mit Zitat

Schon schwierig. Wenn ich mich als Admin anmelden will, dann sagt er mir "Remote access for administrators not allowed!". neutral

Liegt die Lösung dadrin, dem Programm irgendwie zu sagen, dass man sich nicht über RemoteAccess einloggt?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 27.07.2012, 13:32    Titel: Antworten mit Zitat

Nein. Wenn du den Code ändern dürftest, wäre das der einfachste Anhaltspunkt, aber das geht ja nicht!

Tip: Der Admin hat wohl versucht, die Script Kiddies abzuwehren, aber dabei einen Bug am System selbst übersehen, der noch schlimmer ist...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 27.07.2012, 13:51    Titel: Antworten mit Zitat

Ich nehme an, der Bug ist in diesem kleinen Codefetzen drin?
Code:
If Users(i).PrivilegeLevel = PRIV_ADMIN AndAlso IsRemoteAccess() Then
    Print "Remote access for administrators not allowed!"
    Print "(This has been enabled to prevent script kiddies from doing any damage"
    Print "on the server.)"
Else
    CurrentUser.PrivilegeLevel = Users(i).PrivilegeLevel 'Genauer gesagt hier?
EndIf

Dummerweise sehe ich da kein Schlupfloch, um dann doch noch Adminrechte zu bekommen. neutral
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 27.07.2012, 13:56    Titel: Antworten mit Zitat

Genaugenommen kann man den Bug NICHT ausnutzen, wenn man die von dir markierte Zeile erreicht - es muss ein anderer Codepfad genommen werden.

Der Bug ist aber viel subtiler.

Ein Tip: Der Bug kann das Programm auch abstürzen lassen, wenn er auf die falsche Weise ausgelöst wird.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 27.07.2012, 14:12    Titel: Antworten mit Zitat

Verdammt, das ist nicht einfach. Ich komme aber auch nicht drauf. Soweit ich das verstanden habe, hat man nur 6 Möglichkeiten am Anfang. Die ersten 5 sind die 5 möglichen Nutzernamen, von denen 3 nicht zum Ziel führen und die anderen beiden nicht verfügbar sind. Der sechste Fall ist ein falscher Login, der einen aber unweigerlich wieder zum Anfang bringt. verwundert
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 27.07.2012, 14:14    Titel: Antworten mit Zitat

WeitereTips gebe ich jetzt per PM, um nicht selber alles zu spoiler.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 27.07.2012, 14:47    Titel: Antworten mit Zitat

Ich würde spontan die Eingabe
macgyver
tehbest\0@@@@@@@@@
probieren. Zunge rausstrecken
(Habe aber kein FB installiert und kann es somit nicht verifizieren. Escaping-Bugs könnt ihr behalten).
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 27.07.2012, 14:54    Titel: Antworten mit Zitat

Jojo ist auf der richtigen Spur, die Antwort stimmt aber noch nicht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 27.07.2012, 14:57    Titel: Antworten mit Zitat

Da haste recht, ich hab zu kompliziert gedacht.
Es genügt die Eingabe:
@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@

Zitat:
Genaugenommen kann man den Bug NICHT ausnutzen, wenn man die von dir markierte Zeile erreicht - es muss ein anderer Codepfad genommen werden.

Nicht zwingendermaßen, wenn man die Rücksprungadresse überschreibt, ist das völlig egal. Aber diese Variante wäre natürlich auch wesentlich aufwendiger.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 27.07.2012, 15:09    Titel: Antworten mit Zitat

Nein, stimmt so auch noch nicht.

Tipp: Enums sind normalerweise Integer.

Returnadresse überschreiben geht zwar auch, aber wirklich viel komplizierter, noch dazu wo Input keine Steuerzeichen mag.

EDIT: Doch, es stimmt, hatte mich nur verschaut.


Zuletzt bearbeitet von Cherry am 27.07.2012, 15:32, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 27.07.2012, 15:13    Titel: Antworten mit Zitat

Warum sollte das nicht genügen? Meines Wissens nach nullt FreeBASIC den Type bei der Initialisierung, d.h. ich überschreibe die ersten beiden Bytes von PrivilegeLevel mit 0x40 0x00, insgesamt also 0x40 0x00 0x00 0x00, d.h. 64.

Edit: Grade eine alte Installation von FBC gefunden und getestet: Funktioniert. A winner is me. Zunge rausstrecken

Code:
Welcome to Cherry Networks!
*** You are using remote login. Only guests and normal users are allowed. ***


Enter username: @@@@@@@@@@@@@@@
Enter password: @@@@@@@@@@@@@@@@@

Welcome, @@@@@@@@@@@@@@@!
You have admin privileges.
~ # echo Yeah, here is a console! (Or would be.)
Yeah, here is a console! (Or would be.)
~ # killall -9 init
FATAL EXCEPTION: init process was killed!

_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 27.07.2012, 15:23    Titel: Antworten mit Zitat

Ja, stimmt. Ich hatte das vorher am Handy gelesen und da hat es so ausgesehen als hätte das Handy die @s umgebrochen und ich dachte du willst alle Zeichen als Passwort eingeben, was ja zu lang ist und den PrivilegeLevel dann ja auf &h40404040 gesetzt hätte.

(Genaugenommen sind Name und PW ja sogar vollkommen egal, solange das PW 17 Zeichen lang ist und mit @ endet.)


Zuletzt bearbeitet von Cherry am 27.07.2012, 15:32, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4701
Wohnort: ~/

BeitragVerfasst am: 27.07.2012, 15:30    Titel: Antworten mit Zitat

Draufgekommen wäre ich da jetzt nicht von allein - ist aber ziemlich cool. cool
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 27.07.2012, 18:56    Titel: Antworten mit Zitat

lalala, array- oder stringgrenzen überprüfen ist ja auch für spießer grinsen
_________________
MFG
Flo

Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.

zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MilkFreeze



Anmeldungsdatum: 22.04.2011
Beiträge: 116

BeitragVerfasst am: 29.07.2012, 00:19    Titel: Antworten mit Zitat

Habs auch raus. Ohne Jojo lächeln

Allerdings musste ich eine Ascii-tabelle hernehmen.

Übrigens: Der HackIt wären interessanter, wenn die Passwörter der User alle 15-Stellig wären. Dann muss man zumindest daran denken, dass der input zumindest eine Abweichung zum Passwort haben muss. Und eventuell denkt da nicht jeder dran, sondern kopiert lustig das Passwort und hängt ein "@" dran.

Mehr bitte.
_________________
Milch ftw grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4701
Wohnort: ~/

BeitragVerfasst am: 29.07.2012, 13:42    Titel: Antworten mit Zitat

Mit InputUsing wäre sowas ja nicht passiert. grinsen
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz