Schutz gegen Bufferoverflow

lordg2009

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.559
Hallo mal wieder

Also folgendes:
So, wie ich es gelesen hat, endet ein erfolgreicher Bufferoverflow meißt mit root-rechten für das ganze System.

Nehmen wir jetzt mal an, ich hätte auf einem Rechner als einzigen Dienst, der mit der Außenwelt verbunden ist ein TS3-Server laufen. Dieser wurde aber unter einem eigenen Benutzer , welcher nur für diesen Dienst genutzt wird, erstellt und läuft nun auch mit dessen Rechten. Wenn nun jemand einen erfolgreichen Bufferoverflow gegen diesen Dienst fahren würde, würde der Angreifer dann trotzdem root-Rechte erhalten, oder sich auf dem System dann nur mit den eingeschrenkten Rechten bewegen können?

Vielen Dank
 
So wie ich es verstehe ist es ja so, daß der Prozess übernommen werden kann. Durch das Provozieren eines Buffer Overflows kannst du den Hauptspeicher außerhalb des Datenteils des Prozesses manipulieren. Du kannst so den Programmcode überschreiben und fügst idealerweise Aufrufe von eigenem Programmcode durch.

Der Damit aufgerufene Code ist aber ein Child Prozess von deinem gekaperten Prozess und läuft somit immernoch mit denselben Benutzerrechten.

Ist aber nur meine eigene Theorie.
 
Ja genau so denke ich es auch. So wie ich es verstanden habe, bekommt jedes Programm einen begrenzten virtuellen Speicher im RAM zur Verfügung gestellt und hat keinen Zugriffe auf die virtuellen Adressräume der anderen Programme. Das würde auch gar nicht gehen, da virtuelle Adressräume jeweils von 0x00000000 an adressiert werden und sich ohne einer strikten Trennung die Speicheradressen überschneiden würden. Für die Koordination zwischen virtueller und reeler Speicheradresse ist dann die MMU zuständig. Somit dürfte ich eigentlich keinen Code in einen anderen Bereich mit anderen Rechten einfügen dürfen.

Sollte ich mich irren, möge mir bitte jemand wiedersprechen
 
Man kann schon eigenen Code durch Buffer Overflows in den Stack schleusen und dann ausführen und so z.B. per Shell Script Root-Zugang erlangen. Allerdings muss dafür:
- Erstmal eine Lücke im Programm sein, z.B. durch ungesicherte IO-Operationen, so dass man überhaupt Buffer Overflows hinbekommt.
Und weiterhin:
- Muss der Code ausführbar sein. Viele Systeme machen den Stack per gesetztem NX (No Execute) erstmal nicht ausführbar.
- Zudem müssen in der Regel Adressen ausnutzbar sein. Von außen kennt man die genauen Adress-Layouts des Speichers ja nicht. Deshalb würde man entweder relativ adressieren oder aber bestimmte bekannte Adressen im Speicher verwenden. Dagegen kann man sich aber per Address Space Layout Randomization schützen.
 
setTrue schrieb:
durch Buffer Overflows in den Stack schleusen und dann ausführen und so z.B. per Shell Script Root-Zugang erlangen

Das ist schon klar, nur beantwortet es nicht die Frage, ob der Code immer mit Root Rechten läuft, oder eben doch im Kontext des manipulierten Prozesses. Denn wieso sollte mein neuer Prozess Root Rechte haben... dazu braucht ja der Prozess erstmal das Passwort und wo soll er das her haben, wenn nicht vom Parent Process?


Klar ist die Antwort wohl wenn der gekaperte Prozess schon als Root lief, aber darum ging es hier ja nicht.
 
Naja, aber Address Space Layout Randomization ist ja dann doch schon ziemlich speziell. Das wird doch, soweit ich weiß, findetn das doch nur in irgendwelchen speziellen BSD Varianten Verwendung findet. Deshalb mein Wunsch, den Dienst, von dem ich nicht weiß, ob er ein Fehler enthällt, oder nicht, nur mit eingeschränkten Rechten auszuführen, was ja ganz einfach ist. Deine Ausführung beantwortet halt noch nicht so ganz, ob meine Idee passt.
Ergänzung ()

Ach sry, wurde schon gepostet
 
Soviel ich weiß, wäre der Ablauf in etwa so: Code auf Stack einschleusen, dabei zum Beispiel eine manipulierte Rücksprungadresse überschreiben. Dann wird (fehlende Sicherheitsmaßnahmen mal ausgeschlossen) der Code irgendwann ausgeführt. In dem manipulierten Code kann man dann z.B. mit manipulierten Opcodes auch weiterreichende Privilegien erlangen und ist nicht von dem abhängig, was der anfällige Prozess, über den der Overflow entstanden ist, darf.
 
Mit einem Standart bufferoverflow überschreibst du register. Im Idealfall das eip / rip. Das zeigt dem prozessor wo der nächste assemblerbefehl steht. Wenn du es jetzt schaffst diesen zeiger so zu überschreiben, dass er auf eingeschleusten shellcode zeigt, hast du gewonnen. Der shellcode wird im Kontext des anderen Programms ausgeführt. Du leitest das andere programm also nur um. So der standart. Wie soll ein standartprogramm auch an root rechte gelangen ;) da brauchst du dann schon nen zweiten exploit.
 
Jop, so hab ich das auch verstanden: Du baust eine Kette aus Exploits. Programm A (mit Remote-Zugriff, z.B. der WebserveR) hat einen Exploit mit Buffer Overflow. Programm Bhat eine Lücke, die eine Rechteüberschreitung ermöglicht. KOmmt immer wieder mal vor. Dafür kann B nicht von außen gestartet werden. Jetzt lässt du A über den Overflow einfach B starten, und fütterst B mit den Daten, die für den Rechteüberlauf nötig sind. Schon bist du Gott bzw. Root.
 
Stichwort dazu lautet "privilege escalation attack" - einfach bissl zurecht-googlen :)
 
Zurück
Oben