Malware HTTP Reverse Shell (C#) + Browser JS Terminal + PHP Server

JunkCoder

Moderatore
5 Giugno 2020
1,686
25
1,504
653
Ultima modifica:

HTTP Reverse Shell - Browser JS Terminal​


Screenshot​


test.gif


revshell_panel.png


Introduzione​

Ho voluto fare questo piccolo PoC funzionante per dare un alternativa alle solite reverse shell che necessitano di apertura delle porte del router e i vari no-ip & co. Con questa bastera' hostarla ovunque, anche un hosting free. Non richiede database, l'unico requisito e' della versione PHP >= 5 che darei quasi per scontato. I dati vengono scritti su vari file binari. Direttamente dal browser si puo' cliccare sull'ID sessione per aprire un terminale in JS (basato su jquery terminal) e scrivere comandi. Di solito ci vogliono in media 2 secondi per ottenere una risposta con gli intervalli che ho inserito nel codice.

Pannello di controllo JS​

Tutto nella pagina funziona tramite richieste AJAX in background alla parte in PHP. La lista delle sessioni si aggiorna automaticamente quando se ne arriva una nuova.
Il terminale supporta tutti i comandi (non grafici tipo color) interpretabili dal cmd di windows e quelli presenti sulla macchina remota (o locale) dove la reverse shell in C# e' installata. In piu' supporta la history dei comandi con le freccette della tastiera, il comando clear per pulire il log e il comando exit per chiudere il terminale virtuale e cancellare la history (non chiudera' la reverse shell remota).

Server PHP​

Il server in PHP gestisce tutto, dai comandi da inviare alle risposte in arrivo. Contenuto:
  • admin.php - Contiene il pannello di controllo JS + il gestore delle richieste AJAX​
  • bot.php - Interfaccia per la reverse shell in C#​
  • common.php - Contiene la maggior parte del codice del server, e' condiviso da admin e bot​
  • *.js *.css - File di jQuery e jQuery Terminal per la parte del pannello di controllo​
Alcune parti di PHP sono scritte di fretta, non ottimizzate e brutte. Soprattutto bot.php.

Reverse Shell C#​

Senza dubbio la parte piu' semplice, consiste in soli 2 file .cs, il loop principale aspetta nuovi comandi in arrivo, quando ve n'e' uno, lo esegue tramite la classe Process impostata per non mostrare finestre, cattura l'output, lo impacchetta e lo invia al server, l'unica eccezione e' il comando cd che va gestito in altro modo.

Cosa manca​

Non l'ho voluta rendere funzionale al 100% perche' trattasi di un PoC e se qualcuno ci tiene ad usarla spesso sara' meglio che la migliori perche':
  • Il pannello di amministrazione non e' protetto da password.
  • Non c'e' crittografia (in transito ci potrebbe essere usando un sito https, ma i dati sul server sarebbero comunque in chiaro).
  • Supporto ad IPv6 assente
Totalmente opensource, fatene quello che volete, e' stata una piccola ricerca interessante.

Download:
 
Potresti implementare una funzione che chiude automaticamente il listener quando ottieni la sessione e non permette di ottenere nuove sessioni dallo stesso target. In poche parole se il listener rimane attivo in modo indefinito, rischi che un burlone ti scarica il payload per dossarti la dashboard. Per lanciare l'attacco ci sono due modi, o clicchi tantissime volte sul payload (Windows fra l'altro ha una funzione disattiva di default, che se attivata permette di aprire i file con un solo click invece che due) oppure lanci un .vbs che performa un "click" automatico sul payload ogni secondo. Per il resto OK, sono d'accordo su HTTP transport (mi è capitato solo una volta di esser stato costretto a usare il metodo HTTP, si trattò di un test contro un MS XP in VM. Quest'OS, dato che ha i cert SSL nativi scaduti, non può essere attaccato con una shell che viaggia su HTTPS, accetta traffico solo su HTTP o raw TCP). Bel lavoro bravo 🔥
 
  • Mi piace
Reazioni: JunkCoder
Ultima modifica:
Bravo, bel lavoro
Messaggio unito automaticamente:

@JunkCoder L'ho testata e il processo è in esecuzione anche dopo i 10 secondi ma non compare nessun target su admin.php
Messaggio unito automaticamente:

Ho usato.net framework 4.8 perché il 4.0 non me lo faceva installare
Messaggio unito automaticamente:

Ma mi pare strano perché la compilazione è andata a buon fine e il processo era attivo
 
  • Grazie
Reazioni: JunkCoder
Grazie per il feedback, si è vero è possibile aprire svariate istanze della shell, il modo più rapido per evitarlo aprendolo più volte è quello di implementare un System.Threading.Mutex in Main, nella parte client C#. Questo perché il pannello del command and control è in PHP quindi non posso chiudere il listener, anche perché non voglio perdermi eventuali sessioni da altri PC. Oltre al sistema a istanza singola lato client c'è poco da fare, considera che per tutti i RAT comuni è possibile reversarli, forgiare pc info farlocche, intasare il C&C di sessioni con dati random... L'ho fatto io stesso per fare impazzire qualche script kiddie che voleva infettarmi, a volte ho anche trovato flaw DoS che facevano esaurire la RAM al server con 5 pacchetti da pochi byte.

Il sistema supporta già HTTPS, ma senza pinning e senza accettare certificati self-signed: se lo compili con un url che inizia per https:// e l'host ha un certificato valido (anche free tipo Lets Encrypt, ma sempre CA-trusted) allora già può essere usato senza modifiche, anche se suggerisco di implementare almeno la password al pannello di admin.

Lascio degli step per chi volesse implementare pinning di certificati self-signed:
  • Assegnare ServicePointManager.ServerCertificateValidationCallback nella Main, prima del while
  • La callback che assegnerete dovrà usare il parametro di tipo X509Certificate per verificare che sia quello embedded, se si ritorna true
Questa cosa può funzionare anche su Win XP, a patto che il .NET Framework 4.0 sia installato, diciamo che per XP sarebbe meglio fare il downgrade a 2.0 o meglio ancora fare tutto nativo, anche se prende molto più tempo dovendo implementare esplicitamente un client TLS che richiede di supportare tutta una serie di cipher e si rischia di avere un handshake TLS troppo unico e quindi rilevato come IoC.

Ma del resto questa non vuole essere meterpreter, non ha nessun comando speciale, migrazione o persistenza. Questa è una PoC per avere un terminale reverse-shell interattivo dentro al browser, il che consente di usare proxy, vpn, tor eccetera per collegarsi, non avendo obbligo di tenere porte aperte sulla tua rete, quando basta una 80 o 443 su un hosting di PHP o un VPS.
 
Messaggio unito automaticamente:

@JunkCoder L'ho testata e il processo è in esecuzione anche dopo i 10 secondi ma non compare nessun target su admin.php

Per cercare di capire dove può essere il problema, ti porgo queste domande: Hai aggiornato la costante url nel file Program.cs per farla puntare alla pagina bot.php del tuo webserver? Che webserver hai usato (sia come vendor che se remoto, LAN o locale)? Stai usando HTTPS (SSL/TLS)?

Messaggio unito automaticamente:

Ho usato.net framework 4.8 perché il 4.0 non me lo faceva installare
Messaggio unito automaticamente:

Ma mi pare strano perché la compilazione è andata a buon fine e il processo era attivo

Framework 4.0 era solo per renderlo compatibile con versioni più vecchie di Windows, molte delle quali lo hanno già installato di default, ma va benissimo anche 4.8
 
Ultima modifica:
Allora ho usato infinity free con http, ma non andava allora ho provato xampp in local Ed é andato.
Messaggio unito automaticamente:

@JunkCoder Non va con nessun hosting free
 
Allora ho usato infinity free con http, ma non andava allora ho provato xampp in local Ed é andato.
Messaggio unito automaticamente:

@JunkCoder Non va con nessun hosting free

Il fatto è che quando usi un hosting free non sai quello che sta combinando, magari c'è cloudflare, un filtro di altro genere (anche ignorante basato sull'user agent) che manda una challenge javascript alla reverse shell come fosse un browser invece di inviare e ricevere i comandi come previsto. Basta anche che inietta uno script di statistiche o di ads nella pagina per spaccare tutto l'output ovviamente: non è una normale pagina web.

Ma... forse invece è più banale di quanto penso e non hai i permessi di scrittura nella cartella data, dove il server conserva comandi e output.
 
Ultima modifica:
Ok creo la cartella data
Messaggio unito automaticamente:

@JunkCoder creando la cartella data e mettendogli chmod 777 non va comunque anche se su xampp va
 
Ultima modifica:
Ok creo la cartella data
Messaggio unito automaticamente:

@JunkCoder creando la cartella data e mettendogli chmod 777 non va comunque anche se su xampp va

Per chi avesse problemi simili è stato risolto in privato, e si, l'hosting free iniettava codice html e javascript proprio per fare la challenge browser di cui parlavo prima.

PS: chi sospetta un problema simile navighi a bot.php tramite browser, se premendo Ctrl+U vedete anche un solo carattere il vostro hosting vi sta prendendo in giro, dovrebbe essere una pagina totalmente vuota quando la richiesta è di tipo GET (come una visita normale da browser).