Skip to content
This repository was archived by the owner on Apr 19, 2020. It is now read-only.

Commit 600acab

Browse files
committed
WiFi-Pumpkin v0.8.1 Release
1 parent e76f989 commit 600acab

File tree

232 files changed

+30981
-213
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

232 files changed

+30981
-213
lines changed

CHANGELOG

+7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
Version 0.8.1
2+
-------------
3+
- re-design all GUI Menu->view
4+
- added new report logger GUI
5+
- added new sessions for Rogue AP loggers
6+
- added new plugin BDFProxy-ng
7+
18
Version 0.7.8
29
-------------
310
- moved progressBar to statusBar

Core/Main.py

+121-51
Large diffs are not rendered by default.

Core/Utils.py

+50-18
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from struct import pack
33
from time import sleep,asctime,strftime
44
from random import randint
5+
from base64 import b64encode
56
from os import popen,path,walk,system,getpid,stat
67
from subprocess import call,check_output,Popen,PIPE,STDOUT
78
from re import search,compile,VERBOSE,IGNORECASE
@@ -78,14 +79,14 @@ def stop(self):
7879

7980
loggers = {}
8081
'''http://stackoverflow.com/questions/17035077/python-logging-to-multiple-log-files-from-different-classes'''
81-
def setup_logger(logger_name, log_file, level=logging.INFO):
82+
def setup_logger(logger_name, log_file,key, level=logging.INFO):
8283
global loggers
8384
if loggers.get(logger_name):
8485
return loggers.get(logger_name)
8586
else:
8687
logger = logging.getLogger(logger_name)
8788
logger.propagate = False
88-
formatter = logging.Formatter('%(asctime)s : %(message)s')
89+
formatter = logging.Formatter('SessionID[{}] %(asctime)s : %(message)s'.format(key))
8990
fileHandler = logging.FileHandler(log_file, mode='a')
9091
fileHandler.setFormatter(formatter)
9192
logger.setLevel(logging.INFO)
@@ -119,38 +120,62 @@ def htmlContent(title):
119120
]
120121
}
121122
return html
123+
124+
@staticmethod
125+
def get_content_by_session(filelines,sessionID=str):
126+
filterSession = []
127+
sessiongrap = 'SessionID[{}]'.format(sessionID)
128+
for line in filelines:
129+
if sessiongrap in line:
130+
filterSession.append(line)
131+
return ''.join(filterSession)
132+
122133
@staticmethod
123-
def exportHtml(remove_dns2proxy=False,remove_inject=False):
134+
def exportHtml(unchecked={},sessionID='',dataLogger=[],APname=''):
124135
readFile = {
125136
'dhcp': {'Logs/AccessPoint/dhcp.log':[]},
126137
'urls': {'Logs/AccessPoint/urls.log':[]},
138+
'hostapd': {'Logs/AccessPoint/hostapd.log':[]},
139+
'bdfproxy': {'Logs/AccessPoint/bdfproxy.log':[]},
127140
'credentials': {'Logs/AccessPoint/credentials.log':[]},
128-
'requestAP': {'Logs/AccessPoint/requestAP.log':[]},
129141
'dns2proxy': {'Logs/AccessPoint/dns2proxy.log':[]},
130142
'injectionPage': {'Logs/AccessPoint/injectionPage.log':[]},
131143
'dnsspoofAP': {'Logs/AccessPoint/DnsSpoofModuleReq.log':[]},
132-
'phishing': {'Logs/Phishing/Webclone.log':[]},}
133-
if remove_dns2proxy: readFile.pop('dns2proxy')
134-
elif remove_inject: readFile.pop('injectionPage')
135-
for i in readFile.keys():
136-
for j in readFile[i]:
137-
with open(j,'r') as file:
138-
readFile[i][j] = file.read()
144+
'phishing': {'Logs/Phishing/requests.log':[]},}
145+
if unchecked != {}:
146+
for key in unchecked.keys(): readFile.pop(key)
147+
for key in readFile.keys():
148+
for filename in readFile[key]:
149+
with open(filename,'r') as file:
150+
if len(sessionID) != 0:
151+
content = Refactor.get_content_by_session(file.readlines(),sessionID)
152+
readFile[key][filename] = content
153+
else:
154+
readFile[key][filename] = file.read()
139155

140-
contenthtml,HTML = Refactor.htmlContent('Report Logger'),''
156+
contenthtml,HTML,emptyFile,activated_Files = Refactor.htmlContent('WiFi-Pumpkin Report Logger'),'',[],[]
141157
for i in contenthtml['htmlheader']: HTML += i+"\n"
142-
HTML += '</span><span class="s5">Report Generated at::</span><span class="s0">'+asctime()+'</span>\n'
158+
if dataLogger != []:
159+
HTML += '</span><span class="s2">Session information::</span><span class="s1">\n\n'
160+
HTML += '</span><span class="s5">[*] ESSID AP: {}</span><span class="s0"></span>\n'.format(APname)
161+
HTML += '</span><span class="s5">[*] AP Create at: </span><span class="s0">'+dataLogger[0]+'</span>\n'
162+
HTML += '</span><span class="s5">[*] AP Down at: </span><span class="s0">'+dataLogger[1]+'</span>\n\n'
163+
HTML += '</span><span class="s5">Report Generated at::</span><span class="s0">'+asctime()+'</span>\n\n'
143164
HTML += '</span><span class="s4"><br></span><span class="s1">\n'
144165
for key in readFile.keys():
145-
if Refactor.getSize(readFile[key].keys()[0]) > 0:
166+
if len(readFile[key][readFile[key].keys()[0]]) > 0:
146167
HTML += '</span><span class="s2">-[ {} Logger ]-</span><span class="s1">\n'.format(key)
147168
HTML += readFile[key][readFile[key].keys()[0]]
148169
HTML += '</span><span class="s4"><br><br></span><span class="s1">\n'
170+
activated_Files.append(key)
171+
elif Refactor.getSize(readFile[key].keys()[0]) == 0:
172+
emptyFile.append(key)
149173
HTML += '</span></pre>\n<TABLE CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#C0C0C0" >\
150-
<TR><TD><CENTER>''<FONT FACE="Arial, Helvetica" COLOR="#000000">WiFi-Pumpkin (C) 2015 P0cL4bs Team' \
174+
<TR><TD><CENTER>''<FONT FACE="Arial, Helvetica" COLOR="#000000">WiFi-Pumpkin (C) 2015-2016 P0cL4bs Team' \
151175
'</FONT></center></TD></TR></TABLE></body>\n</html>\n'
152176

153-
Load_ = {'HTML': HTML,'Files':[readFile[x].keys()[0] for x in readFile.keys()]}
177+
Load_ = {'HTML': HTML,'Files':[readFile[x].keys()[0] for x in readFile.keys()],
178+
'activated_Files':activated_Files,'empty_files': emptyFile}
154179
return Load_
155180

156181
@staticmethod
@@ -266,6 +291,13 @@ def getSize(filename):
266291
st = stat(filename)
267292
return st.st_size
268293

269-
class waiter(threading.Thread):
294+
@staticmethod
295+
def generateSessionID():
296+
return str(b64encode(str(random.randint(0,100000))))
297+
298+
class waiterSleepThread(QThread):
299+
quit = pyqtSignal(object)
300+
def __int__(self,parent=None):
301+
super(waiter, self).__init__(self,parent)
270302
def run(self):
271-
sleep(10)
303+
sleep(10),self.quit.emit(True)

Core/config/app/config.ini

+5-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ dhcp_server=iscdhcpserver
1515
channel=11
1616
APname=PumpAP
1717
interfaceAP=wlxc83a35cef744
18+
sessions={}
1819

1920
[dhcp]
2021
classtype=A
@@ -64,15 +65,18 @@ range=10.0.0.20/10.0.0.50
6465

6566
[dockarea]
6667
advanced=false
67-
dock_phishing=false
6868
dock_credencials=true
6969
dock_urlmonitor=true
70+
dock_bdfproxy=false
71+
dock_dns2proxy=false
7072

7173
[plugins]
7274
noproxy=false
7375
netcreds_plugin=true
7476
dns2proxy_plugin=true
7577
sergioproxy_plugin=false
78+
bdfproxy_plugin=false
79+
bdfproxy_patch_config=Plugins/BDFProxy-ng/bdfproxy.cfg
7680

7781
[iptables]
7882
iptablespolicy1=iptables --policy INPUT ACCEPT

Core/config/commits/Lcommits.cfg

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
11
master:
2+
[
3+
{ Version: '0.8.1'}
4+
{ changelog : 're-design all GUI Menu->view' },
5+
{ changelog : 'added new report logger GUI' },
6+
{ changelog : 'added new sessions for Rogue AP loggers' },
7+
{ changelog : 'added new plugin BDFProxy-ng' },
8+
]
9+
10+
WiFiPumpkin078:
211
[
312
{ Version: '0.7.8'}
413
{ changelog : 'moved ProgressBar to StatusBar' },
@@ -18,7 +27,7 @@ master:
1827
{ changelog : 'added support Parrot 3.0.1 to use AP with wireless connection #69' },
1928
]
2029

21-
WiFiPumpkin:
30+
WiFiPumpkinv075:
2231
[
2332
{ Version: '0.7.5'}
2433
{ changelog : 'fixed size QTableWidget on modules' },

Core/helpers/about.py

+9-6
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,20 @@ def __init__(self,parent = None):
3636

3737
self.formMode = QFormLayout()
3838
self.formMode.addRow(QLabel('<a href="https://github.com/xtr4nge"><strong>@xtr4nge</strong></a>'))
39-
self.formMode.addRow(QLabel('Sslstrip2 based version fork<br><br>'))
39+
self.formMode.addRow(QLabel('PLugin <a href="https://github.com/xtr4nge/sslstrip">Sslstrip</a> fork inject code<br>'))
4040
self.formMode.addRow(QLabel('<a href="https://github.com/LeonardoNve"><strong>@LeonardoNve</strong></a>'))
41-
self.formMode.addRow(QLabel('Plugin SSLstrip version fork,Plugin dns2proxy<br><br>'))
41+
self.formMode.addRow(QLabel('Plugin <a href="https://github.com/LeonardoNve/sslstrip2">SSLstrip2</a> version fork'))
42+
self.formMode.addRow(QLabel('Plugin <a href="https://github.com/LeonardoNve/dns2proxy">Dns2proxy</a> Offensive DNS server <br>'))
43+
self.formMode.addRow(QLabel('<a href="https://github.com/davinerd"><strong>@davinerd</strong></a>'))
44+
self.formMode.addRow(QLabel('Plugin <a href="https://github.com/davinerd/BDFProxy-ng"> BDFProxy-ng</a> version fork <br>'))
4245
self.formMode.addRow(QLabel('<a href="https://github.com/supernothing"><strong>Ben Schmidt @supernothing</strong></a>'))
43-
self.formMode.addRow(QLabel('Plugin Sergio Proxy - bypass HSTS<br><br>'))
46+
self.formMode.addRow(QLabel('Plugin <a href="https://github.com/supernothing/sergio-proxy">SergioProxy</a> - bypass HSTS<br>'))
4447
self.formMode.addRow(QLabel('<a href="https://github.com/DanMcInerney"><strong>Dan McInerney @danhmcinerney</strong></a>'))
45-
self.formMode.addRow(QLabel('Plugin Netcreds - Sniffs sensitive data<br><br>'))
48+
self.formMode.addRow(QLabel('Plugin <a href="https://github.com/DanMcInerney/net-creds">Netcreds</a> - Sniffs sensitive data<br>'))
4649
self.formMode.addRow(QLabel('<a href="http://www.yasinuludag.com/darkorange.stylesheet"><strong>Yasin Uludag</strong></a>'))
47-
self.formMode.addRow(QLabel('theme1.qss - Qt dark orange stylesheet<br><br>'))
50+
self.formMode.addRow(QLabel('theme1.qss - Qt dark orange stylesheet<br>'))
4851
self.formMode.addRow(QLabel('<a href="https://github.com/ColinDuquesnoy/QDarkStyleSheet"><strong>Colin Duquesnoy @ColinDuquesnoy</strong></a>'))
49-
self.formMode.addRow(QLabel('theme2.qss - Qt dark blue stylesheet<br><br>'))
52+
self.formMode.addRow(QLabel('theme2.qss - Qt dark blue stylesheet<br>'))
5053
self.mainLayout.addRow(self.formMode)
5154

5255
self.layout = QHBoxLayout()

Core/helpers/report.py

+173
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
from Core.loaders.Stealth.PackagesUI import *
2+
from PyQt4.QtWebKit import QWebView
3+
4+
"""
5+
Description:
6+
This program is a module for wifi-pumpkin.py. Report FIles Logger PDF or HTML
7+
8+
Copyright:
9+
Copyright (C) 2015-2016 Marcos Nesster P0cl4bs Team
10+
This program is free software: you can redistribute it and/or modify
11+
it under the terms of the GNU General Public License as published by
12+
the Free Software Foundation, either version 3 of the License, or
13+
(at your option) any later version.
14+
15+
This program is distributed in the hope that it will be useful,
16+
but WITHOUT ANY WARRANTY; without even the implied warranty of
17+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18+
GNU General Public License for more details.
19+
20+
You should have received a copy of the GNU General Public License
21+
along with this program. If not, see <http://www.gnu.org/licenses/>
22+
"""
23+
24+
class frm_ReportLogger(PumpkinModule):
25+
''' called report logger in files '''
26+
def __init__(self,sessions,parent = None):
27+
super(frm_ReportLogger, self).__init__(parent)
28+
self.setWindowTitle('WiFi-Pumpkin - Report Logger')
29+
self.loadtheme(self.configure.XmlThemeSelected())
30+
self.setGeometry(0,0,320,400)
31+
self.Main = QVBoxLayout()
32+
self.sessions = sessions
33+
self.center()
34+
self.GUI()
35+
36+
def addcheckListView_loggerFIles(self,unchecked,key,enable=None,checked=None,session=''):
37+
# add in listview all logger files
38+
empty = Refactor.exportHtml(unchecked,sessionID=session)[key]
39+
for loggerfile in empty:
40+
item = QStandardItem(loggerfile)
41+
check = Qt.Checked if checked == True else Qt.Unchecked
42+
item.setCheckState(check)
43+
item.setEnabled(enable)
44+
item.setCheckable(True)
45+
self.model.appendRow(item)
46+
47+
def get_all_items_Unchecked(self):
48+
# get all items desabled from row
49+
all_items_row = {}
50+
for index in range(self.model.rowCount()):
51+
item = self.model.item(index)
52+
if item.isCheckable() and item.checkState() == Qt.Unchecked:
53+
all_items_row[str(item.text())] = False
54+
return all_items_row
55+
56+
def convertIt(self,printer):
57+
# generate file pdf
58+
self.ExportPDF.print_(printer)
59+
QMessageBox.information(self, 'WiFi Pumpkin Report PDF', 'file PDF has been generated with success.')
60+
61+
def exportFilesSystem(self):
62+
# export HTML or pdf file
63+
all_unchecked = self.get_all_items_Unchecked()
64+
if not self.checkHTML.isChecked() and not self.checkPDF.isChecked():
65+
return QMessageBox.warning(self, 'WiFi Pumpkin Options',
66+
'You have to select a <strong>option</strong> file type for export.')
67+
if len(all_unchecked.keys()) == 9:
68+
return QMessageBox.warning(self, 'WiFi Pumpkin empty session',
69+
'logger:ERROR Could not find log files.')
70+
71+
sessions_activated = ''
72+
apname = self.configure.Settings.get_setting('accesspoint','APname')
73+
for key in self.sessions.keys():
74+
if str(self.CB_Data_Logger.currentText()) == self.sessions[key]['started']:
75+
contents = Refactor.exportHtml(all_unchecked,key,
76+
[self.sessions[key]['started'],self.sessions[key]['stoped']],apname)
77+
sessions_activated = key
78+
break
79+
if sessions_activated == '':
80+
contents = Refactor.exportHtml(all_unchecked,sessions_activated)
81+
82+
if self.checkHTML.isChecked():
83+
filename = QFileDialog.getSaveFileNameAndFilter(self,
84+
'Save File Logger as HTML','report.html','HTML (*.html)')
85+
if len(filename[0]) != 0:
86+
with open(str(filename[0]),'w') as filehtml:
87+
filehtml.write(contents['HTML']),filehtml.close()
88+
QMessageBox.information(self, 'WiFi Pumpkin Report HTML', 'file has been saved with success.')
89+
90+
elif self.checkPDF.isChecked():
91+
filename = QFileDialog.getSaveFileNameAndFilter(self,
92+
'Save File Logger as PDF','report.pdf','PDF (*.pdf)')
93+
if len(filename[0]) != 0:
94+
self.ExportPDF.setHtml(contents['HTML'])
95+
printer = QPrinter()
96+
printer.setPageSize(QPrinter.A4)
97+
printer.setOutputFormat(QPrinter.PdfFormat)
98+
printer.setOutputFileName(filename[0])
99+
self.convertIt(printer)
100+
101+
@pyqtSlot(QModelIndex)
102+
def combo_clicked(self, session):
103+
# get activated logger files
104+
self.model.clear()
105+
sessions_activated = ''
106+
for key in self.sessions.keys():
107+
if session == self.sessions[key]['started']:
108+
self.labelStart.setText(self.sessions[key]['started'])
109+
self.labelStop.setText(self.sessions[key]['stoped'])
110+
sessions_activated = key
111+
break
112+
all_unchecked = self.get_all_items_Unchecked()
113+
self.addcheckListView_loggerFIles(all_unchecked,'activated_Files',enable=True,
114+
checked=True,session=sessions_activated)
115+
self.addcheckListView_loggerFIles(all_unchecked,'empty_files',enable=False,
116+
checked=False,session=sessions_activated)
117+
118+
def GUI(self):
119+
self.frm0 = QFormLayout()
120+
self.model = QStandardItemModel()
121+
self.viewlogger = QListView()
122+
self.widget = QWidget()
123+
self.layout = QVBoxLayout(self.widget)
124+
125+
self.ExportPDF = QWebView()
126+
127+
# check all files logger empty or round
128+
self.viewlogger.setModel(self.model)
129+
self.layout.addLayout(self.frm0)
130+
131+
# group file type
132+
self.GroupBoxFile = QGroupBox()
133+
self.layoutGroupFile = QVBoxLayout()
134+
self.GroupBoxFile.setLayout(self.layoutGroupFile)
135+
self.GroupBoxFile.setTitle('Options:')
136+
self.checkHTML = QRadioButton('HTML')
137+
self.checkPDF = QRadioButton('PDF')
138+
self.layoutGroupFile.addWidget(self.checkHTML)
139+
self.layoutGroupFile.addWidget(self.checkPDF)
140+
141+
# group informations
142+
self.GroupBoxINFO = QGroupBox()
143+
self.layoutGroupINFO = QFormLayout()
144+
self.GroupBoxINFO.setLayout(self.layoutGroupINFO)
145+
self.GroupBoxINFO.setTitle('Information:')
146+
self.labelStart = QLabel()
147+
self.labelStop = QLabel()
148+
self.layoutGroupINFO.addRow('started AP at:',self.labelStart)
149+
self.layoutGroupINFO.addRow('stoped AP at:',self.labelStop)
150+
151+
# get all session data add combobox
152+
self.CB_Data_Logger = QComboBox(self)
153+
all_sessions = []
154+
for key in self.sessions.keys():
155+
all_sessions.append(self.sessions[key]['started'])
156+
all_sessions.append('select All logger file...')
157+
self.CB_Data_Logger.addItems(all_sessions)
158+
self.connect(self.CB_Data_Logger, SIGNAL('activated(QString)'), self.combo_clicked)
159+
index = self.CB_Data_Logger.findText(all_sessions[len(all_sessions)-2], Qt.MatchFixedString)
160+
self.CB_Data_Logger.setCurrentIndex(index)
161+
self.combo_clicked(self.CB_Data_Logger.currentText())
162+
163+
self.btnSave = QPushButton('Export')
164+
self.btnSave.clicked.connect(self.exportFilesSystem)
165+
166+
self.frm0.addRow('Session:',self.CB_Data_Logger)
167+
self.frm0.addRow(self.GroupBoxINFO)
168+
self.frm0.addRow(self.viewlogger)
169+
self.frm0.addRow(self.GroupBoxFile)
170+
self.frm0.addRow(self.btnSave)
171+
172+
self.Main.addWidget(self.widget)
173+
self.setLayout(self.Main)

Core/helpers/update.py

+2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ def __init__(self,version,parent = None):
3131
super(frm_githubUpdate, self).__init__(parent)
3232
self.setWindowTitle("WiFi-Pumpkin Software Update")
3333
self.loadtheme(self.configure.XmlThemeSelected())
34+
self.checkHasCommits = False
3435
self.version = version
3536
self.UrlDownloadCommits = \
3637
'https://raw.githubusercontent.com/P0cL4bs/WiFi-Pumpkin/master/Core/config/commits/Lcommits.cfg'
@@ -133,6 +134,7 @@ def RcheckCommits(self,commits):
133134
self.LCommits.addItem(item)
134135
self.btnCheck.setEnabled(True)
135136
self.btnUpdate.setEnabled(True)
137+
self.checkHasCommits = True
136138
elif 'alive::' in commits:
137139
self.pb.update_bar(10)
138140
elif '::updated' in commits:

0 commit comments

Comments
 (0)