Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
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-76070 — Ricerca originale e PoC non distruttiva per un overflow del buffer di stack pre-autenticazione della password decodificata in Base64 in login.cgi di Netis NC63. | Kitploit
Strumenti/GitHubGitHub/ozcanpng/cve-2026-76070
Sicurezza Sistemi EmbeddedSicurezza IoTAnalisi delle VulnerabilitàExploitReverse EngineeringAnalisi del FirmwareBinary Exploitation
GitHubozcanpng/cve-2026-76070

CVE-2026-76070

Ricerca originale e PoC non distruttiva per un overflow del buffer di stack pre-autenticazione della password decodificata in Base64 in login.cgi di Netis NC63.

Vedi Repository
14 giorni faNon ancora revisionato

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 →
Condividi

CVE-2026-76070: Overflow del buffer di stack pre-autenticazione senza autenticazione tramite password decodificata in Base64 in Netis NC63 login.cgi che porta a RCE

Ricercatore: Özcan Ersan (@ozcanpng)

Stato della divulgazione

  • CVE: CVE-2026-76070
  • Fornitore: Netis Systems Co., Ltd.
  • Prodotto: Router Netis NC63 Wireless AC1200
  • Firmware testato: NC63_V3.0.0.3327
  • Componente interessato: /bin/netis.cgi
  • Endpoint: POST /cgi-bin/login.cgi
  • Parametro: password codificata in Base64
  • Autenticazione: nessuna; la decodifica non sicura avviene prima del confronto delle credenziali
  • Architettura: MIPS32r2 little-endian, ABI o32, uClibc
  • Classe di vulnerabilità: buffer overflow basato su stack con controllo dell'indirizzo di ritorno salvato
  • Validazione: CGI di produzione a hash originale in un runtime QEMU user-mode isolato
  • Stato del record CVE alla preparazione: assegnato; dettagli del record CNA in attesa di compilazione

Riepilogo esecutivo

Il gestore di login pubblico nel firmware Netis NC63 V3.0.0.3327 recupera il parametro password controllato dall'attaccante e lo decodifica con la routine Base64 personalizzata FUN_00402bd4. Il chiamante fornisce un buffer di stack locale di 64 byte ma non passa la sua capacità al decodificatore. Il decodificatore ricava il proprio lavoro dall'input codificato e scrive i byte decodificati senza verificare la fine della destinazione.

L'indirizzo di ritorno MIPS salvato si trova a 136 byte dall'inizio del buffer decodificato. I test dinamici contro il CGI di produzione a hash originale hanno confermato:

  1. un pattern decodificato di 140 byte B produce un fault a 0x42424242;
  2. la sostituzione del ra salvato con 0x0041a2e0 causa una seconda osservazione di ingresso al gestore di login, dimostrando il controllo del program counter; e
  3. un test isolato di sola osservazione raggiunge la chiamata diretta system() del binario originale con un valore a0 MIPS selezionato dall'attaccante. La /bin/sh sostituita ha registrato /bin/sh -c NC63_RCE_PROOF e non ha eseguito alcun comando.

Il PoC pubblico in questo repository si ferma deliberatamente a un pattern di crash. Non contiene catena di ritorno, shellcode, comandi, reverse shell o persistenza.

Integrità dell'artefatto interessato

root@kitploit:~
193f6a5e2ce65972b1805bf076f8d3521379a8441c8aaeb5ad0ba174bbee0792  netis_NC63_V3.0.0.3327.bin
23faa747b7d2f067aa5431bcc227ceca97a7977cf3e7c372f715cbba57f9209b  squashfs-root/bin/boa
eb298774c27070dc595fefcabb4e8c12a46cb5f4fd08f91c3ca92282c3a289a2  squashfs-root/bin/netis.cgi

La copia di /bin/netis.cgi testata dinamicamente ha lo stesso SHA-256 dell'eseguibile estratto dal vendor.

Hash originali e di runtime

Superficie d'attacco e stato dell'autenticazione

Il frontend del vendor invia la password all'endpoint pubblico come Base64:

root@kitploit:~
obj.password = base64encode(utf16to8(password));
request({
    url: "/cgi-bin/login.cgi",
    data: obj
});

Il campo HTML usa maxlength="63", ma si tratta solo di una restrizione lato browser. Un client HTTP diretto può inviare un valore codificato più grande.

Richiesta del frontend e limite solo client

login.cgi è necessariamente raggiungibile prima dell'autenticazione. La decodifica non sicura avviene prima che la password decodificata venga confrontata con la password amministratore configurata. Non è richiesta alcuna sessione valida, header Cookie, header Authorization o password corretta.

Tracciamento source-to-sink

root@kitploit:~
Unauthenticated HTTP client
  |
  | POST /cgi-bin/login.cgi
  | password=<attacker-controlled Base64>
  v
/bin/netis.cgi: FUN_0041a2e0
  |
  | get_request_param("password")
  v
FUN_00402bd4(decoded_stack_buffer, encoded_password)
  |
  | no destination-capacity argument
  | decoded output exceeds 64 bytes
  v
saved s8 at decoded offset 132
saved ra at decoded offset 136
  |
  v
attacker-selected MIPS PC

Codice vulnerabile

Pseudocodice derivato da Ghidra, con nomi normalizzati per leggibilità:

root@kitploit:~
int login_cgi(void *request)
{
    char decoded[64];
    char stored[68];
    char *password;

    memset(decoded, 0, 64);
    memset(stored, 0, 64);
    password = get_request_param(request, "password");
    if (password != NULL)
        FUN_00402bd4(decoded, password); /* no capacity argument */

    apmib_get(0x15e, stored);
    if (strcmp(decoded, stored) == 0)
        printf("[\"SUCCESS\"]");
    else {
        system("echo 0 >/tmp/boa_auth");
        printf("[\"%d\"]", 0x15);
    }
    return 0;
}

Gestore di login vulnerabile

Il decodificatore FUN_00402bd4 riceve solo i puntatori a destinazione e origine. Il suo ciclo fa avanzare il puntatore di destinazione e memorizza fino a tre byte decodificati per ogni quattro simboli Base64. Nessun confronto verifica la destinazione rispetto a decoded + 64.

Ciclo di scrittura del decodificatore Base64 personalizzato

Base64 è la trasformazione di input, non il difetto sottostante. La causa principale è la mancata corrispondenza tra la lunghezza decodificata controllata dall'attaccante e una destinazione a dimensione fissa la cui capacità non viene mai applicata. Per un input normale con padding, quattro caratteri codificati rappresentano fino a tre byte decodificati; i controlli lato server devono quindi calcolare e validare la dimensione decodificata prima di scrivere.

Analisi della corruzione dello stack

FUN_0041a2e0 inizia a 0x0041a2e0 e crea un frame di 0xa8 byte:

root@kitploit:~
0041a2e0  addiu sp,sp,-168
0041a2e4  sw    ra,164(sp)
0041a2e8  sw    s8,160(sp)
0041a2ec  move  s8,sp

La destinazione decodificata inizia a s8+0x1c; s8 salvato e ra salvato si trovano a s8+0xa0 e s8+0xa4:

root@kitploit:~
decoded[64]  s8+0x1c   decoded offset 0
saved s8     s8+0xa0   decoded offset 132
saved ra     s8+0xa4   decoded offset 136

La distanza esatta dell'indirizzo di ritorno è 0xa4 - 0x1c = 0x88, ovvero 136 byte.

Frame di stack e offset del ra salvato

Verifica dinamica

Sovrascrittura dell'indirizzo di ritorno salvato

Un pattern decodificato di 140 byte B ha sostituito l'indirizzo di ritorno salvato a quattro byte:

root@kitploit:~
--- SIGSEGV {si_signo=SIGSEGV, si_code=1, si_addr=0x42424242} ---
qemu: uncaught target signal 11 (Segmentation fault)

Fault all'indirizzo di ritorno selezionato dall'attaccante

Controllo del program counter

Un input separato di 140 byte ha impostato ra salvato a 0x0041a2e0. Il tracing della CPU QEMU ha registrato una normale prima entrata all'handler seguita da una seconda entrata con s8=0x41414141 e ra=0x0041a2e0.

Seconda entrata all'handler controllata

Confine del comando di sola osservazione

Il binario originale contiene una chiamata diretta jal system a 0x0041a3cc. Nella validazione isolata privata, istruzioni esistenti a base fissa hanno caricato un marcatore in a0 e raggiunto quella chiamata. Un programma di osservazione statico è stato montato sopra /bin/sh; ha registrato gli argomenti dell'interprete comandi e non ha eseguito nulla:

root@kitploit:~
argv[0]=</bin/sh>
argv[1]=<-c>
argv[2]=<NC63_RCE_PROOF>
CONTROLLED_MARKER_REACHED
PASS: attacker-controlled a0 reached system() and /bin/sh argv.
PASS: the guard logged the request and executed no command.

Ciò dimostra una primitiva RCE nel percorso isolato del codice di produzione. Non stabilisce un'affidabilità di exploit identica su un router fisico nella sua configurazione di kernel e randomizzazione dello stack distribuita.

Contesto di privilegi e hardening del binario

La configurazione Boa originale specifica User root, Group root e un percorso CGI che contiene /bin e /web/cgi-bin. L'eseguibile di produzione ha base fissa (0x00400000), non ha stack canary né RELRO e dichiara uno stack GNU eseguibile con segmenti RWX.

Configurazione privilegi Boa di produzione

Stato dell'hardening del binario

PoC pubblico sicuro

Lo script incluso è in modalità dry-run per impostazione predefinita e genera solo un corpo di modulo Base64 contenente 140 byte B dopo la decodifica:

root@kitploit:~
python3 poc/poc.py

L'invio richiede un target autorizzato esplicito e --send:

root@kitploit:~
python3 poc/poc.py --target http://192.168.1.1 --send

L'invio del pattern può causare il crash del processo CGI. Usalo solo in un ambiente autorizzato e usa e getta. Il PoC non implementa la catena di validazione RCE privata.

Impatto

Lo sfruttamento riuscito può eseguire codice o comandi selezionati dall'attaccante nel contesto di gestione del router. Nella configurazione Boa originale, tale contesto viene eseguito come root. Le possibili conseguenze includono la divulgazione di configurazione e segreti, manipolazione di DNS/firewall/routing, reindirizzamento del traffico, interruzione del servizio e compromissione completa del dispositivo.

Rimedi

  1. Sostituire il decodificatore personalizzato con un'API che accetti la capacità della destinazione.
  2. Rifiutare input la cui lunghezza decodificata calcolata supera i 63 byte, riservando spazio per un terminatore.
  3. Validare lunghezza e sintassi Base64 lato server prima della decodifica.
  4. Sottoporre a audit ogni chiamante di FUN_00402bd4.
  5. Ricompilare con stack canary, PIE, NX e RELRO.
  6. Eseguire i processi CGI con privilegi minimi.

Indice delle evidenze

Vedere evidence/README.md per screenshot e mappatura delle tracce. Gli estratti Ghidra normalizzati si trovano in attachments/decompiled-functions/.

Cronologia della divulgazione

  • 2026-08-16: scoperta e validazione isolata del binario di produzione completate.
  • Agosto 2026: segnalato a VulnCheck.
  • 2026-08-20: VulnCheck ha assegnato CVE-2026-76070 e autorizzato la divulgazione pubblica.
  • 2026-08-20: pubblicato il pacchetto di divulgazione pubblica.

Riferimenti

  • CVE-2026-76070
  • VulnCheck
  • Pagina di supporto Netis NC63
  • CVE-2026-73673

Nessun router fisico è stato sottoposto a flashing. Nessun vero comando shell, reverse shell, persistenza, connessione esterna, furto di credenziali o operazione distruttiva sul firmware è stato utilizzato.

Scarica lo strumento