Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 27.07.2012, 03:52 Titel: CrackMe |
|
|
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 |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 27.07.2012, 11:28 Titel: |
|
|
Schon schwierig. Wenn ich mich als Admin anmelden will, dann sagt er mir "Remote access for administrators not allowed!".
Liegt die Lösung dadrin, dem Programm irgendwie zu sagen, dass man sich nicht über RemoteAccess einloggt? |
|
Nach oben |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 27.07.2012, 13:32 Titel: |
|
|
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 |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 27.07.2012, 13:51 Titel: |
|
|
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.  |
|
Nach oben |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 27.07.2012, 13:56 Titel: |
|
|
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 |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 27.07.2012, 14:12 Titel: |
|
|
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.  |
|
Nach oben |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 27.07.2012, 14:14 Titel: |
|
|
WeitereTips gebe ich jetzt per PM, um nicht selber alles zu spoiler. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 27.07.2012, 14:47 Titel: |
|
|
Ich würde spontan die Eingabe
macgyver
tehbest\0@@@@@@@@@
probieren.
(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 |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 27.07.2012, 14:54 Titel: |
|
|
Jojo ist auf der richtigen Spur, die Antwort stimmt aber noch nicht. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 27.07.2012, 14:57 Titel: |
|
|
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 |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 27.07.2012, 15:09 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 27.07.2012, 15:13 Titel: |
|
|
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.
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 |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 27.07.2012, 15:23 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4701 Wohnort: ~/
|
Verfasst am: 27.07.2012, 15:30 Titel: |
|
|
Draufgekommen wäre ich da jetzt nicht von allein - ist aber ziemlich cool.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 27.07.2012, 18:56 Titel: |
|
|
lalala, array- oder stringgrenzen überprüfen ist ja auch für spießer  _________________ 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 |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 29.07.2012, 00:19 Titel: |
|
|
Habs auch raus. Ohne Jojo
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  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4701 Wohnort: ~/
|
Verfasst am: 29.07.2012, 13:42 Titel: |
|
|
Mit InputUsing wäre sowas ja nicht passiert.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
|