Heute schon gehackt (worden)

Werbung
Spiq:
Heute schon gehackt
(worden) ?
1. März 2012
Dr. Steffen NORBERT, CISA, OSCP & OSCE
([email protected] )
2 von 30
Die unvermeidliche Folie
über den Vortragenden
●
●
●
●
Ich “bin” die Firma Iseconsult, ein freiberuflicher IT
Security Berater seit etwa 10 Jahren.
Davor bei verschiedenen Grossfirmen und zuletzt als
Leiter der IT Security Architektur bei einer Schweizer
Grossbank.
Ca. 15 Jahre IT Security und insgesamt über 30 Jahre
IT Berufserfahrung.
Nach (zu) langer Zeit gedanklich ausschliesslich auf der
Verteidiger Seite, seit erst etwa 3 Jahren mit neuem
Schwerpunkt “Offensive IT Sicherheit”.
3 von 30
WARNUNG / Haftungsausschluss
●
●
●
●
●
Hacking ist meistens strafbar!
Zum Teil zeige ich Handlungen und Software die u.U.
– unterschiedlich von Land zu Land – “verboten” sind
Ich zeige das ausschließlich um die Abwehr von Hacking Angriffen
zu stärken, bzw. zur Ausbildung
Wenn Sie sich solche Software beschaffen und/oder meine Demos
nachvollziehen, müssen Sie zuvor selbst sicherstellen, dass Sie
dies im Einklang mit rechtlichen und (arbeits-) vertraglichen
Regelungen tun und nicht dadurch zum Opfer werden
Ich schließe jede Haftung aus, wenn Sie selbst Versuche
unternehmen und dadurch Probleme bekommen!
YOU HAVE BEEN WARNED !
4 von 30
Meine These die ich heute belegen will:
●
Um sich gegen Spionage und Sabotage durch Hacker so
weit als möglich und sinnvoll zu schützen, muss man zu
aller erst wissen wie es geht. Firewalls, Virenschutz und
Internet-Server Hardening reichen jedenfalls nicht aus.
Mein Focus:
●
●
“Targeted attacks”, d.h. Angriffe bei denen
Schwachstellen in Erfahrung gebracht und dann
ausgenutzt weden. (Also keine “Massenware”).
Wie es funktioniert und warum es leider oft sooo einfach
ist. Schieben Sie den Gedanken “aber ich bin doch kein
Ziel” einmal für 1 Stunde beiseite!
5 von 30
Bevor wir beginnen:
➔
➔
➔
➔
➔
Es erwartet Sie ein “harter” Abend mit live Demo und
“anstrengendem” Vortrag
Public Exploits: nichts wirklich Neues!.
Keine neuen oder geheimen Tools, keine 0day Exploits,
keine besonders gut geschützten “Opfer”.
Aber über das Verstehen der Methoden möchte ich helfen
Schutzmaßnahmen zu definieren die “überleben”.
Bitte scheuen Sie sich nicht zu unterbrechen, wenn etwas
unklar ist oder Sie ein wichtige Anmerkung haben;
Vertiefungen und Diskussionen möchte ich aber gerne
ans Ende schieben.
These: Hacken heißt
Daten werden zu Code
➔
6 von 30
Dazu brauchen wir 2 Dinge:
Nicht (oder schlecht) überprüfter Input
➔ Input bestimmt den Ablauf
Beispiele (die wir gleich vertiefen werden):
➔
➔
➔
➔
➔
PHP : include(“/pfad/”.$_GET['sprache'].”texte.php”);
SQL: mysql_query(“select * from tab where x = “.$_POST
['auswahl']);
➔
C: chr lbuff[80]; gets(lbuff); // auch strcpy!
➔
C: chr lbuff[80]; sprintf(lbuff,”Fehler, xyz: %s\n”, eingabe);
Dass damit Fehler bis hin zu “Abstürzen” möglich sind, ist
Gemeinwissen, dass dies einem Hacker genügen kann, die volle
Kontroll über den Computer zu übernehmen, werden wir sehen!
Ein Beispiel aus dem Leben
7 von 30
➔
Nehmen wir an, wir finden bei einem Penetrationtest das Folgende vor:
➔
Jetzt suchen wir erst einmal, ob eine Vulnerability bekannt ist
➔
Die finden wir … und gleich mit einer Anleitung, wie angreifen
Ein Beispiel aus dem Leben
8 von 30
Ein Beispiel aus dem Leben
9 von 30
lfi exploit
10 von 30
Autopsie: Was ist passiert und warum
●
●
●
●
●
. . . ?type=../../../../../xampp/apache/logs/access.log%00 . . .
$_GET['type'] hat irgendwie den Weg in ein include oder require
statement geschafft
Mit einem NULL-Byte haben wir den String dahinter
abgeschnitten (ab PHP 5.3.4 ist das vorbei --> immer patchen!)
Mit “../../../” (path-traversal) sind wir der vorgegebenen directory
entkommen
PHP führt allen Code aus der per include eingbracht wird! Aber
woher bekommen wir ein “passendes” File?
●
●
●
Es gibt viele Möglichkeiten, im Beispiel habe ich die
Version über access.log und “user agent” gezeigt.
Das ging nur, weil system() erlaubt war (kein safe mode!) und
weil access.log gelesen sowie das File cmd.php geschrieben
werden darf → Berechtigungen!
ABER: VORSICHT VOR DER CREATIVITÄT des HACKERS!
11 von 30
Ein verbreiteter “Denkfehler”:
●
Oft werden Eingabedaten fälschlich als “sicher”
erachtet, z.B. weil:
●
sie durch (Java-) Skripte client-seitig geprüft wurden
●
sie aus einem Formular-Feld mit Auswahl stammen
●
●
sie aus hidden fields stammen
●
sie aus Cookies stammen
●
sie aus dem Header stammen
●
●
sie aus einem Formular-Feld mit Beschränkungen
stammen
bei großen Programmen nicht so einfach zu erkennen
ist, dass es Eingabedaten sind
ABER: Alles was vom Client kommt, kann von einem
böswilligen Benutzer manipuliert werden (wie das
Beispiel gezeigt hat)!
12 von 30
Zweites Beispiel: SQL Injection
●
●
Stellen Sie sich vor, Sie bekommen folgenden Code zu Gesicht:
Das Problem: Code (hier SQL) und Daten sind vermischt UND
die Daten (Eingabe) werden nicht überprüft!
SQL injection
13 von 30
Autopsie: Was ist passiert und warum(1)
●
●
●
●
●
●
●
$_POST['user'] wurde ohne Prüfung in eine SQL Query
übernommen:
Query = “select from users where user ='”.$POST['user'].”' and ...”
Mit einem Einfach-Hochkomma haben wir den Benutzernamen
geschlossen. Der Rest des Strings verändert die Query!
Mit dem Kommentar String ( -- ) haben wir verhindert, dass der
zweite Teil der Query (.. and … ) angehängt wurde.
So konnten wir uns einloggen ohne User-namen und Passwort zu
kennen
Durch Überlegen und Ausprobieren konnten wir sogar als
Administrator einloggen!
ABER wir konnten sogar ein File anlegen und so viel weiter
kommen (2==>):
14 von 30
Autopsie: Was ist passiert und warum(2)
●
Zwei “Tricks”:
●
●
●
mit union select können wir eigene “Daten” einbringen
Mit … into dumpfile (oder outfile) können wir diese
eigenen Daten in ein File schreiben, in diesem Falle ein
php Skript
Warum hat es funktioniert:
●
●
●
Der “technische” Benutzer (mysql user) hatte das File
Privileg (nicht sehr ungewöhnlich → Reports)
Der Benutzer unter dem mysql läuft, hat Schreibrechte auf
einem Directory im Web-Server Dokumenten-Baum
(ebenfalls nicht sehr ungewöhnlich)
Sowie alles vom letzten Beispiel (z.B. kein safe mode)
●
ABER der Ausgangspunkt bleibt SQL-Injection
●
AUCH HIER, HACKERS CREATIVITÄT nicht unterschätzen!
15 von 30
Drittes Beispiel: Stack Buffer Overflow
●
Stellen Sie sich vor, Sie bekommen folgenden Code zu Gesicht:
int logwriter(char *user) {
char logline[132];
...
sprintf(logline,"Benutzer: %s login failure",user);
…
return (0);
}
●
●
Falls der Benutzer-Name nicht auf Länge geprüft wurde, kann
das zu einem Stack Buffer Overflow führen.
Wir sehen uns dazu den Stack (den Kellerspeicher) einmal
(schematisch) an
16 von 30
Drittes Beispiel: Stack Buffer Overflow
lower addresses
Frame of
subroutine
132 Bytes:
logline
132 Bytes:
logline
4 Bytes: saved framepointer
ESP
EBP
4 Bytes: return address
4 Bytes: char *user
Frame of
calling program
higher addresses
Ein etwas älteres, aber “real world” Beispiel
sehen wir uns nun an:
warftpd exploit
17 von 30
Autopsie: Was ist passiert und warum
●
●
●
●
sprintf(zielstring,formatstring,usereingabe-string)
führte zu stack buffer overflow
Da auch die return-adresse (Rücksprung aus dem aktuellen
Unterprogramm) überschrieben wird, können wir dem
Programm Ablauf “entführen”
Wir entführten den Programmablauf in unsere Daten hinein!
(Daten wurden Code!)
Wenn “DEP” (=data execution prevention) angeschaltet
gewesen wäre, hätte es so nicht funktioniert!
●
●
●
ABER: Mittels “ROP” (= return oriented programming)
kann man DEP “schlagen”
Um ROP schwieriger zu machen, gibt es ASLR
(=address space layout randomization)
MS-WIN SYS-ADMIN: lerne im Detail wann DEP und
ASLR eingeschaltet sind!
18 von 30
DEP und ROP
●
Der gezeigte Stack Buffer Overflow führte dazu, dass Code auf
dem Stack ausgeführt wurde. Schutz-Idee DEP (= data
execution prevention): Der Stack wird “nicht-ausführbar”.
●
●
●
Generalisierung: “enge” RWE-Rechte für alle
Speicherbereiche eines Prozesses.
DEP braucht Hardware: (AMD) NX oder (Intel) XD Bit
Aushebeln von DEP ist ROP (=return oriented programming),
Vorläufer = “return2lib”
●
●
Grundidee von ret2lib: Man “springt” (ret) nicht auf den
Stack sondern an den Beginn eines Unterprogramms,
nachdem man auf dem Stack die Parameter hinterlegt
hat. (Solche Aufrufe kann man verketten!)
Verallgemeinerung ROP: Man “springt” zu einer Serie
von passenden Stellen im Code (genannt “Gadget”)
die jeweils meist mit RET enden.
19 von 30
DEP und ROP (2)
●
●
ROP heisst demnach eine Kette von GADGET-Adressen auf
dem Stack zu hinterlegen (da ja Befehle nicht gehen → NX!).
Beispiele gängiger ROP-Strategien:
●
●
●
●
Schalte DEP für den aktuellen Stack ab
(→ VirtualProtect)
Kopiere den Shellcode über bestehenden Code
(→ WriteProcessMemory)
Erstelle neuen Speicherbereich mit “WE” Berechtigung
und kopiere Shellcode dort hin
(→ VirtualAlloc dann memcpy o.ä.)
Ein reales Beispiel (aus einem “privaten” Exploit) →
DEP und ROP (3)
#
buf2 = pack('L',0x77c4ebc9)
buf2 += pack('L',0xfefefefe)
buf2 += pack('L',0xfefefefe)
buf2 += pack('L',0x7c90192c)
buf2 += pack('L',0x0124fc3e)
buf2 += pack('L',0x77eb82c7)
buf2 += pack('L',0x77c3a77e)
buf2 += pack('L',0x7c81106f) * 4
buf2 += pack('L',0x77c3a77e)
buf2 += pack('L',0x7c81106f) * 4
buf2 += pack('L',0x77c3a77e)
buf2 += pack('L',0x7c81106f) * 4
buf2 += pack('L',0x77c3a77e)
20 von 30
# prepare the 4 parms of VirtualProtect:
# POP EAX; POP EBP; (RET)
# EAX
# EBP
# POP EBX; (RET)
# EBX
# ADD EBX,EBP; (RET)
# ADD [EBX],EAX; (RET)
# INC EBX ; (RET) *4
# ADD [EBX],EAX; (RET)
# INC EBX; (RET) *4
# ADD [EBX],EAX; (RET)
# INC EBX; (RET) *4
# ADD [EBX],EAX; (RET)
buf2 += pack('L',0x7c801ad4)
# Virtual Protect
buf2 += pack('L',0x7c874413)
# JMP ESP, ( ESP is at += 10 at RET)
# ARGS: ADDR
Protect Size Protection (WE) Recv. old prot
#
0x0023f000
0x00000fff
0x00000040
0x0023f000
buf2 += pack('L',0x0124f0e7) + pack('L',0x01011101)
buf2 += pack('L',0x01010142) + pack('L',0x0124f102) # shellcode follows
Die Antwort auf ROP ist ASLR
●
●
●
ROP braucht die Adressen der “GADGETS” (und des Stacks)
Schutz-Idee gegen ROP: Verhindern, dass die Adressen
“bekannt” sind durch zufällige Wahl der Basisadressen aller
Module & Sektionen ==> ASLR (=address space layout
randomization)
Aushebeln von ASLR:
●
●
●
●
●
21 von 30
Brute force (es gibt Untersuchungen: nur in Sonderfällen
eine Option)
Information Disclosure Vulnerability: Wenn wir z.B. eine
Formatstring-Vulnerability haben, ist das trivial
Finden von nicht randomisierten Modulen
ASLR ist nicht aktiv: Windows XP!
oder alte library oder static linking
FAZIT: Stack Buffer Overflow ist nicht so “out” wie man
zunächst denkt!
Generalisierung des
stack buffer overflows
22 von 30
(1) Wir (Hacker ☺ ) müssen SHELLCODE in die Eingabedaten
“einschmuggeln”
(2) Wir müssen dann den Programm-Ablauf entführen
➔
➔
•
•
Dazu brauchen wir beispielsweise einen
stack buffer overflow ODER
Einen “n-Bytes write primitive”
d.h. Wenn wir an eine beliebige Stelle einige beliebige
(von uns gewählte Bytes) schreiben können, dann
können wir oft auch den Programm-Ablauf entführen!
Die verbreitetsten Varianten sind: stack buffer overflow, heap buffer
overflow und format string exploit (%n)
Aber mit eingebetteten Skript sprachen (nota bene java script oder
flash …) gibt es einen ganzen neuen Bereich von Möglichkeiten (→
“Heap Spray”, ein Thema für weiteren Vortrag)
23 von 30
Achtung vor Fehleinschätzungen (1)
1) Mein Programm ist nicht gefährdet, weil es mit dem Netzwerk
nichts “am Hut hat”:
➔
FALSCH, da die Daten auch anders, z.B. über Files
“vergiftet” werden können. Bekannte Beispiele sind
PDF Reader und Media Player
2) Mein Programm ist kein Server sondern ein (Netzwerk) Client
und deshalb ist es “sicher”:
●
FALSCH, da Client Programme besonders gefährdet
sind, denn auch die Daten vom Server können
manipuliert sein. Bekanntes Beispiel: Internet Explorer
(aber auch andere Browser!) Stichwort: Client side
exploits
24 von 30
Achtung vor Fehleinschätzungen (2)
3) Ich muss das Programm nicht sicher machen, denn auf meinen
Server sind alle Sicherheitsmaßnahmen (DEP,ASLR,guard
stack(/GS),safe-SEH etc.) an
●
FALSCH, da diese Maßnahmen z.T. Run-time, z.T. LinkTime oder Compile-Time Maßnahmen sind und z.T.
pro Programm ein- oder ausgeschaltet werden und
z.T. Hardware/BIOS abhängig sind.
4) Ich bin nicht gefährdet, denn ich habe eine Firewall
➔
BESONDERS FALSCH, denn alle gezeigten Angriffe
kamen über Kanäle die Firewalls offen lassen müssen!
5) Ich bin nicht gefährdet, denn ich benutze ein (gutes) Anti-Viren
Programm
➔
FALSCH, denn die Signaturen von “targeted” attacks
können noch nicht bekannt sein und die heuristischen
Methoden können oft umgangen werden.
25 von 30
Wenn Zeit ist
Ein Blick in Hackers Werkzeugkasten
Nur eine sehr kleine Auswahl:
●
●
●
Metasploit und Meterpreter: Hacker Framework und
Postexploitation Werkzeug
Socat Demo: Postexploitation, Firewalls schlagen mit
portforwarding
Ettercap (ARP & DNS Spoofing) → man in the middle
attack
26 von 30
Wenn Zeit ist
Portforwarding / Tunneling
●
●
●
●
Metasploit/ Meterpreter “portfwd”
Portforwarding macht einen Port eines Rechners
auf einem anderen erreichbar
Tunneling überträgt ein Protokoll über ein anderes;
d.h. (für uns sehr wichtig) überträgt auch PF, ggf. in
beide Richtungen!
Es gibt viele “interessante” Softwarepakete in dieser
“Sparte”:, z.B:
●
rinet.d, fpipe, plink, winrelay, netcat, socat,
proxytunnel
Wenn Zeit ist
27 von 30
Portforwarding / Tunneling
●
Zunächst ein kleiner Exkurs, was jeder der
Kontrolle über einen “Intranet”-Rechner hat,
tun kann:
●
●
●
●
Portforwarding mit Socat
Achtung bei Tests: Virenscanner schlagen bei
mancher dieser Software evtl. Alarm
Nicht gezeigt, aber ein Klassiker: Mitarbeiter die z.B. IRC
am Arbeitsplatz nutzen wollen oder auf “verbotene” WebServer zugreifen wollen
(Netzwerk-) Sicherheitsverantwortlicher?
==> Lesen Sie unbedingt:
http://proxytunnel.sourceforge.net/paper.php
28 von 30
Wenn Zeit ist
Portforwarding / Tunneling
●
Beispiel (aus der Socat Doku): “Passing Friendly Firewall:
●
●
●
Before leaving (company), start “double client”:
socat ssl:priv-host:443,fork,forever,intervall=30,
cert=...,cafile=...,verify tcp:protected-server:80
At home, start “double server”:
socat tcp-l:80,fork ssl-l:443,reuseaddr,
forever,cert=...,cafile=...
With browser connect to double server (127.0.0.1:80)
So kann “jeder” Mitarbeiter von zu Hause aus auf Intranet-Server zugreifen.
Natürlich kann eine Hacker so auch von einem übernommenen Client aus
im Intranet “weiterarbeiten”.
Literatur Liste
29 von 30
Ich gebe hier einige von mir bessonders geschätzte Bücher und Quellen an und warne gleich:
Das Gebiet ist nicht gut dokumentiert! Vielfach wird man viel Zeit und Schweiß investieren
müssen oder braucht einen “Mentor”! “Einsteiger-Literatur” gibt es m.M.n. keine (lesenswerte):
●
Bücher (eher für “Fortgeschrittene”):
●
●
●
●
The Shellcoders Handbook von
Chris Anley, John Heasman, Felix "FX" Linder u. Gerardo Richarte
The Webapplication Hackers Handbook von Dafydd Stuttard und
Marcus Pinto (neue Auflage 2011!)
The Database Hackers Handbook von David Litchfield, Chris Anley,
John Heasman und Bill Grindlay (leider von 2005, aber gut!)
Downloads (meist PDFs ):
●
www.exploit-db.com/papers/13162
Smashing the modern Stack for fun and profit
●
www.exploit-db.com/papers/10193 ff :
Exploit writing Tutorial part 1 to 10 from Peter van Eeckhoutte
●
●
www.blackhat.com/presentations/bh-usa-09/MCDONALD
/BHUSA09-McDonald-WindowsHeap-PAPER.pdf
Suchen Sie selbst, beispielsweise in den Blackhat Archiven oder auf
www.exploit-db.com
30 von 30
Mein Fazit
●
Ich bin überzeugt, dass sich jeder Softwareentwickler
und jeder System-Administrator intensiv(er) mit diesem
spannenden und interessanten Thema beschäftigen
sollte.
●
Fragen & Diskussion gerne jetzt im Anschluss
●
Bedarf für Ausbildung? Ich gebe spezielle Kurse!
●
Bedarf für mehr Demo, Diskussion oder Beratung?
==> Bitte E-mail an mich!
[email protected]
Ihr Fazit?
Herunterladen