Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-28326-check — Verificatore non distruttivo dello stato delle patch per SolarWinds ARM CVE-2026-28326 che sonda il listener gRPC su TCP 55555 per segnalare VULNERABLE, PATCHED o INCONCLUSIVE. | Kitploit
Strumenti/GitHubGitHub/bishopfox/cve-2026-28326-check
Strumenti DifensiviScanner di VulnerabilitàAnalisi delle VulnerabilitàRaccolta InformazioniSicurezza di RetePenetration TestingStrumento di Accesso Remoto
GitHub

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
bishopfox/cve-2026-28326-check

CVE-2026-28326-check

Verificatore non distruttivo dello stato delle patch per SolarWinds ARM CVE-2026-28326 che sonda il listener gRPC su TCP 55555 per segnalare VULNERABLE, PATCHED o INCONCLUSIVE.

Vedi Repository
4 giorni faNon ancora revisionato
Condividi

SolarWinds Access Rights Manager RCE non autenticato — Script di rilevamento della vulnerabilità

Un controllo dello stato della patch non autenticato per CVE-2026-28326, la vulnerabilità di esecuzione di codice in remoto non autenticata in SolarWinds Access Rights Manager (ARM), corretta in ARM 2026.2.1 il 2026-09-17. CWE-798, CVSS 8.8 Alto (CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H). Segnalata a SolarWinds da Kai Huang di Armadin. L'AV:A in quel vettore presuppone che TCP 55555 sia raggiungibile solo da una rete adiacente, che è la postura per cui sono costruiti gli stessi strumenti firewall di ARM; dove la porta è stata aperta in modo più ampio, il punteggio sottostima l'esposizione per quell'ambiente.

Il listener di remoting gRPC di ARM su TCP 55555 autentica i peer con un certificato client. Le build non aggiornate accettano anche una credenziale di fallback derivata da una chiave hardcoded identica su ogni installazione, che aggira tale autenticazione ed espone un percorso di deserializzazione non sicuro. Il risultato è l'esecuzione di codice come account del servizio ARM, che per impostazione predefinita viene eseguito come LocalSystem.

Lo script segnala se la correzione è presente su ciascun target. Legge i codici di stato restituiti dall'intercettore di autenticazione e non utilizza la chiave, non si autentica e non invia dati al percorso di deserializzazione. Un risultato diverso da VULNERABLE non indica di per sé che un target sia corretto; vedere .

Interpretazione dei risultati non vulnerabili

Utilizzo

root@kitploit:~
# single target (port defaults to 55555)
./cve_2026_28326_check.py arm.example.com

# explicit port
./cve_2026_28326_check.py arm.example.com:55555

# several targets
./cve_2026_28326_check.py arm-a.example.com arm-b.example.com

# scan a list, one target per line ('#' comments allowed), compact output
./cve_2026_28326_check.py -f targets.txt --brief

# machine-readable output for pipelines
./cve_2026_28326_check.py -f targets.txt --json > results.json

Python 3.8+, solo libreria standard — nessun pacchetto di terze parti.

Eseguire lo strumento contro il server ARM anziché contro un collector. Entrambi i ruoli ascoltano sulla 55555, ma un collector rifiuta le richieste esterne allo stesso modo prima e dopo la correzione, quindi lo strumento lo segnala come INCONCLUSIVE.

Opzioni

FlagDescrizione
TARGETUno o più target HOST[:PORT]; la porta predefinita è 55555
-f, --targets-file FILELegge i target da un file (uno per riga; commenti con #)
-p, --port PORTPorta predefinita quando un target ne omette una (predefinita: 55555)
--timeout SECSTimeout per singola sonda (predefinito: 12)
--workers NTarget concorrenti (predefinito: 16); l'output mantiene l'ordine di input
-b, --briefUna singola riga allineata per target, per scansionare molti host
--jsonEmette JSON strutturato, includendo entrambe le sonde per target
--no-colorDisabilita l'output colorato (rispetta anche NO_COLOR e i non-TTY)

Esempi

Server vulnerabile (output predefinito; il marcatore [!] e VULNERABLE sono mostrati in rosso su un TTY):

root@kitploit:~
$ ./cve_2026_28326_check.py arm.example.com
[!] arm.example.com:55555: VULNERABLE  [unavailable-on-server-role]
      Remoting/Send returned 14 UNAVAILABLE on a listener answering as the server role, the pre-patch rejection path (<= 2026.2.0.42)

Server corretto. La build corretta restituisce un grpc-message, che lo strumento stampa insieme al verdetto:

root@kitploit:~
$ ./cve_2026_28326_check.py arm-dr.example.com
[+] arm-dr.example.com:55555: PATCHED  [unauthenticated-gate]
      Remoting/Send returned 16 UNAUTHENTICATED, the localhost and per-process-token gate introduced by the fix (>= 2026.2.1.7)
      grpc-message: Client certificate not found. Please register your application first.

Listener che non può essere classificato. Un collector, o un server che rifiuta le richieste esterne, risponde a entrambe le sonde allo stesso modo su entrambe le build:

root@kitploit:~
$ ./cve_2026_28326_check.py collector.example.com
[?] collector.example.com:55555: INCONCLUSIVE  [external-requests-refused]
      the listener refuses external requests, which a collector role and a restricted server both do identically on either build; scan the ARM server itself

Target multipli con --brief:

root@kitploit:~
$ ./cve_2026_28326_check.py -f targets.txt --brief; echo "exit: $?"
VULNERABLE    arm.example.com:55555            unavailable-on-server-role
PATCHED       arm-dr.example.com:55555         unauthenticated-gate
INCONCLUSIVE  collector.example.com:55555      external-requests-refused
UNAFFECTED    db.example.com:55555             not-arm
ERROR         offline.example.com:55555        unreachable
exit: 1

Output JSON con --json. Sono inclusi i risultati di entrambe le sonde, così il verdetto può essere verificato rispetto alle risposte grezze:

root@kitploit:~
$ ./cve_2026_28326_check.py arm.example.com --json
[
  {
    "target": "arm.example.com:55555",
    "verdict": "VULNERABLE",
    "reason": "unavailable-on-server-role",
    "detail": "Remoting/Send returned 14 UNAVAILABLE on a listener answering as the server role, the pre-patch rejection path (<= 2026.2.0.42)",
    "grpc_message": "",
    "probes": [
      {
        "path": "/SolarWinds_ARM_GRPC_ConnectionAuthrization.ConnectionAuthorization/GetCertificate",
        "status": 0,
        "message": "",
        "alpn": "h2",
        "note": ""
      },
      {
        "path": "/SolarWinds_ARM_Remoting.Remoting/Send",
        "status": 14,
        "message": "",
        "alpn": "h2",
        "note": ""
      }
    ]
  }
]

È sicuro eseguirlo?

Il controllo è pensato per l'uso su sistemi di produzione:

  • Non utilizza la chiave hardcoded né presenta alcuna credenziale. Osserva come il server rifiuta un peer anonimo, cosa che dipende dalla build installata.
  • Non invia dati al percorso di deserializzazione. La vulnerabilità viene attivata da un oggetto serializzato nel corpo di un messaggio Remoting/Send. Entrambe le sonde inviano un messaggio gRPC con corpo di lunghezza zero, e l'intercettore rifiuta la chiamata prima che qualsiasi corpo del messaggio venga inoltrato.
  • Non modifica lo stato del server. Non viene presentato alcun certificato client, credenziale o sessione. La sonda GetCertificate invia un codice di registrazione vuoto, che il server rifiuta prima di cercare o rimuovere qualsiasi codice in sospeso, quindi la sonda non consuma un codice di registrazione per un client che è in fase di registrazione.
  • Apre due connessioni TCP per target, una per sonda, e chiude ciascuna dopo aver letto lo stato.

Impronta di richieste e log

#ChiamataScopo
1ConnectionAuthorization/GetCertificateConferma che l'endpoint è ARM e si trova nel ruolo server
2Remoting/SendLa sonda sullo stato della patch

Su un server non aggiornato una richiesta anonima rifiutata viene registrata a livello debug (Unable to validate remote request token) e una riga informativa che nomina il peer. Le build corrette registrano un rifiuto che nomina il peer e il suggerimento di registrazione citato nel grpc-message sopra. Nessuna delle due build registra una sessione.

Per cercare lo sfruttamento anziché l'esposizione, esaminare i record NetworkConnectionEntry di ARM. Una voce con IsAuthenticated=false e un ClientCertThumbPrint popolato è coerente con il bypass dell'autenticazione e non si verifica nel traffico normale.

Come funziona

La correzione ha cambiato quale stato l'intercettore di autenticazione restituisce a un peer che non presenta alcun certificato client. Prima della patch, ogni percorso di rifiuto nel controllo del certificato client impostava Unavailable. Dopo la patch, il controllo localhost-più-token imposta Unauthenticated con un messaggio distintivo, e nient'altro su quel percorso restituisce 16. Due chiamate anonime distinguono le build:

Remoting/SendGetCertificateBuildVerdetto
14 UNAVAILABLE0 OK<= 2026.2.0.42VULNERABLE
16 UNAUTHENTICATEDany>= 2026.2.1.7PATCHED
14 UNAVAILABLE14 UNAVAILABLEeitherINCONCLUSIVE

Il verdetto viene letto da Remoting/Send perché solo gli handler duplex-streaming e unary propagano lo stato dell'intercettore; gli handler server- e client-streaming lo sovrascrivono su entrambe le build.

Segnala lo stato della patch, non una versione

Il controllo osserva il comportamento del percorso di codice corretto e non si basa su una stringa di versione. Non segnala quale build stia eseguendo un server corretto.

ALPN è necessario

Il listener ARM reimposta le connessioni TLS che non negoziano ALPN h2, quindi lo strumento lo imposta esplicitamente. Uno scanner che si connette tramite TLS senza ALPN non riceve dati dalla porta.

Interpretazione dei risultati non vulnerabili

VULNERABLE e PATCHED si basano ciascuno su una risposta osservata del server. INCONCLUSIVE e ERROR significano che le sonde non hanno classificato il target, quindi il suo stato di patch è sconosciuto. Per questo motivo INCONCLUSIVE viene segnalato separatamente da PATCHED.

Verdetti

Ogni verdetto porta un breve tag reason. --brief lo stampa come terza colonna e --json lo riporta come reason.

VerdettoTag reasonSignificato
VULNERABLEunavailable-on-server-roleRemoting/Send ha restituito 14 su un listener che risponde a GetCertificate come ruolo server. La correzione non è presente.
PATCHEDunauthenticated-gateRemoting/Send ha restituito 16, lo stato introdotto dalla correzione. Si applica solo a questa CVE.
INCONCLUSIVEexternal-requests-refusedEntrambe le sonde hanno restituito 14. Un ruolo collector e un server limitato si comportano in modo identico qui su entrambe le build. Scansionare il server ARM stesso.
INCONCLUSIVEpartial-responseSolo una sonda ha restituito uno stato, quindi la coppia non può essere confrontata. Riprovare.
INCONCLUSIVEunrecognized-statusL'endpoint ha risposto con una combinazione di stati al di fuori dell'insieme riconosciuto.
UNAFFECTEDnot-armQui non ha risposto alcun servizio gRPC ARM.
ERRORunreachableLa connessione TCP, l'handshake TLS o lo scambio HTTP/2 sono falliti.

Per tutti e tre i motivi di INCONCLUSIVE lo stato della patch è sconosciuto. Il tag reason indica cosa affrontare prima di eseguire nuovamente il controllo.

Codici di uscita

CodiceSignificato
0Nessun target era VULNERABLE
1Almeno un target è VULNERABLE
2Errore di utilizzo (argomenti errati, target non valido o file dei target non leggibile)
130Interrotto (Ctrl-C)

Il codice di uscita 0 copre PATCHED, UNAFFECTED e tutti e tre i motivi di INCONCLUSIVE. Per distinguere un target corretto da uno che non è stato possibile classificare, leggere il verdetto (la prima colonna di --brief o il campo verdict di --json) anziché il codice di uscita.

Limitazioni

  • Ruolo collector: un collector risponde a entrambe le sonde con 14 su entrambe le build ed è segnalato come INCONCLUSIVE. Questo caso è stato testato contro un mock che riproduce la risposta, non contro un collector distribuito.
  • Analisi degli header: lo strumento cerca grpc-status come campo HPACK letterale e non implementa la decodifica Huffman o della tabella dinamica. Il core C di gRPC, che ARM utilizza, invia questi trailer non compressi. Se una build futura li codificasse con Huffman, lo strumento segnalerebbe INCONCLUSIVE con partial-response.
  • Ambito: PATCHED si applica solo a questa CVE e non indica lo stato di altre vulnerabilità di ARM.
  • Sfruttamento e compromissione: VULNERABLE indica che la correzione non è presente sul percorso che la sonda ha raggiunto. Lo strumento non esegue codice sul target e non rileva compromissioni precedenti; vedere l'indicatore NetworkConnectionEntry sopra.
  • Raggiungibilità: i risultati riflettono ciò che il server espone alla posizione di rete da cui viene eseguito lo strumento. Su un'installazione predefinita TCP 55555 ascolta su tutte le interfacce, incluso IPv6.

Remediation

Aggiornare ad ARM 2026.2.1.7 o successivo, secondo le note di rilascio di ARM 2026.2.1. Le build 2026.2.0.42 e precedenti sono interessate.

Note aggiuntive:

  • Limitare TCP 55555 ai soli collector e client di ARM. Questo limita l'esposizione sui sistemi che non possono essere aggiornati immediatamente.
  • La correzione rimuove il percorso di autenticazione di fallback; non ruota la chiave. Poiché la chiave era la stessa su tutte le installazioni, considerare qualsiasi periodo precedente all'applicazione della patch come uno in cui l'autenticazione del listener poteva essere aggirata da chiunque fosse in grado di raggiungerlo.
  • Un inventario delle versioni mostra cosa dovrebbe essere installato; questo controllo mostra se la correzione è in vigore sul listener.

Licenza

Questo codice è distribuito sotto una licenza MIT.

Disclaimer legale

L'uso di questo strumento per attaccare target senza previo consenso reciproco è illegale. È responsabilità dell'utente finale rispettare tutte le leggi locali, statali e federali applicabili. Gli sviluppatori non si assumono alcuna responsabilità e non sono responsabili per qualsiasi uso improprio o danno causato da questo programma.

Vedi anche

  • Note di rilascio di SolarWinds ARM 2026.2.1
  • NVD — CVE-2026-28326
Scarica lo strumento