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

Commit cc55b63

Browse files
committed
WiFi-Pumpkin v0.8.5
1 parent bd7fba6 commit cc55b63

Some content is hidden

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

54 files changed

+1667
-2000
lines changed

CHANGELOG

+13
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
Version 0.8.5
2+
-------------
3+
- added new plugin TCP-Proxy
4+
- added capture image HTTP request (Tab ImageCap)
5+
- added new HTTP-request widgets get info from Headers requests
6+
- added new columm (url) on HTTP-Authentication
7+
- added now WF allow to start without internet connection
8+
- added option that exclude USB card on start
9+
- added support to use 2 wireless cards #211
10+
- remove netcreds plugin thks for all DanMcInerney
11+
- added Python DNS Server improvements #165
12+
- added new style in progressbar on home
13+
114
Version 0.8.4
215
-------------
316
- added new plugin Pumpkin-Proxy (mitmproxy API)

README.md

+54-1
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,13 @@ refer to the wiki for [Installation](https://github.com/P0cL4bs/WiFi-Pumpkin/wik
4040
* Karma Attacks (support hostapd-mana)
4141
* LLMNR, NBT-NS and MDNS poisoner (Responder)
4242
* Pumpkin-Proxy (ProxyServer (mitmproxy API))
43+
* Capture images on the fly
44+
* TCP-Proxy
45+
4346

4447
### Plugins
4548
| Plugin | Description |
4649
|:-----------|:------------|
47-
[net-creds](https://github.com/DanMcInerney/net-creds) | Sniff passwords and hashes from an interface or pcap file
4850
[dns2proxy](https://github.com/LeonardoNve/dns2proxy) | This tools offer a different features for post-explotation once you change the DNS server to a Victim.
4951
[sslstrip2](https://github.com/LeonardoNve/sslstrip2) | Sslstrip is a MITM tool that implements Moxie Marlinspike's SSL stripping attacks based version fork @LeonardoNve/@xtr4nge.
5052
[sergio-proxy](https://github.com/supernothing/sergio-proxy) | Sergio Proxy (a Super Effective Recorder of Gathered Inputs and Outputs) is an HTTP proxy that was written in Python for the Twisted framework.
@@ -114,6 +116,57 @@ class Nameplugin(PluginTemplate):
114116
#### About plugins
115117
[plugins](https://github.com/P0cL4bs/WiFi-Pumpkin/wiki/Plugins) on the wiki
116118

119+
#### TCP/UDP Proxy
120+
A proxy that you can place between in a TCP stream. It filters the request and response streams with ([scapy](http://www.secdev.org/projects/scapy/) module) and actively modify packets of a TCP protocol that gets intercepted by WiFi-Pumpkin. this plugin uses modules to view or modify the intercepted data that possibly easiest implementation of a module, just add your custom module on "plugins/analyzers/" automatically will be listed on TCP/UDP Proxy tab.
121+
122+
``` python
123+
from scapy.all import *
124+
from scapy_http import http # for layer HTTP
125+
from default import PSniffer # base plugin class
126+
127+
class ExamplePlugin(PSniffer):
128+
_activated = False
129+
_instance = None
130+
meta = {
131+
'Name' : 'Example',
132+
'Version' : '1.0',
133+
'Description' : 'Brief description of the new plugin',
134+
'Author' : 'your name',
135+
}
136+
def __init__(self):
137+
for key,value in self.meta.items():
138+
self.__dict__[key] = value
139+
140+
@staticmethod
141+
def getInstance():
142+
if ExamplePlugin._instance is None:
143+
ExamplePlugin._instance = ExamplePlugin()
144+
return ExamplePlugin._instance
145+
146+
def filterPackets(self,pkt): # (pkt) object in order to modify the data on the fly
147+
if pkt.haslayer(http.HTTPRequest): # filter only http request
148+
149+
http_layer = pkt.getlayer(http.HTTPRequest) # get http fields as dict type
150+
ip_layer = pkt.getlayer(IP)# get ip headers fields as dict type
151+
152+
print http_layer.fields['Method'] # show method http request
153+
# show all item in Header request http
154+
for item in http_layer.fields['Headers']:
155+
print('{} : {}'.format(item,http_layer.fields['Headers'][item]))
156+
157+
print ip_layer.fields['src'] # show source ip address
158+
print ip_layer.fields['dst'] # show destiny ip address
159+
160+
print http_layer # show item type dict
161+
print ip_layer # show item type dict
162+
163+
return self.output.emit({'name_module':{'IP': ip_layer.fields,
164+
'Headers': http_layer.fields}})
165+
166+
```
167+
#### About TCP/UDP Proxy
168+
[TCP/UDPProxy](https://github.com/P0cL4bs/WiFi-Pumpkin/wiki/TCP-UDPProxy) on the wiki
169+
117170
### Screenshots
118171
[Screenshot](https://github.com/P0cL4bs/WiFi-Pumpkin/wiki/Screenshots) on the wiki
119172

core/config/app/config.ini

+7-3
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,14 @@ hostapd_custom=false
1414
statusAP=false
1515
dhcpd_server=false
1616
pydhcp_server=true
17+
pydns_server=true
18+
dnsproxy_server=false
1719
channel=11
1820
ssid=PumpAP
1921
interfaceAP=None
2022
sessions={}
2123
persistNetwokManager=false
24+
checkConnectionWifi=true
2225
check_support_ap_mode=true
2326
enable_Security=false
2427
WPA_SharedKey=1234567890
@@ -73,16 +76,17 @@ range=10.0.0.20/10.0.0.50
7376

7477
[dockarea]
7578
advanced=true
76-
dock_credencials=false
79+
dock_credencials=true
7780
dock_urlmonitor=true
7881
dock_bdfproxy=false
7982
dock_dns2proxy=false
8083
dock_responder=false
81-
dock_PumpkinProxy=true
84+
dock_PumpkinProxy=false
85+
dock_tcpproxy=true
8286

8387
[plugins]
8488
noproxy=false
85-
netcreds_plugin=true
89+
tcpproxy_plugin=true
8690
dns2proxy_plugin=false
8791
sergioproxy_plugin=false
8892
bdfproxy_plugin=false

core/config/app/tcpproxy.ini

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[plugins]
2+
emails=true
3+
ftp=true
4+
hexdump=true
5+
imageCap=true
6+
httpCap=true
7+
summary=true
8+
kerberos=true
9+
NTLMSSP=true

core/config/commits/Lcommits.cfg

+15
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,19 @@
11
master:
2+
[
3+
{ Version: '0.8.5'}
4+
{ changelog : 'added new plugin TCP-Proxy' },
5+
{ changelog : 'added capture image HTTP request (Tab ImageCap)' },
6+
{ changelog : 'added new HTTP-request widgets get info from Headers requests' },
7+
{ changelog : 'added new columm (url) on HTTP-Authentication' },
8+
{ changelog : 'added now WF allow to start without internet connection' },
9+
{ changelog : 'added option that exclude USB card on start' },
10+
{ changelog : 'added support to use 2 wireless cards #211' },
11+
{ changelog : 'remove netcreds plugin thks for all DanMcInerney' },
12+
{ changelog : 'added Python DNS Server improvements #165' },
13+
{ changelog : 'added new style in progressbar on home' },
14+
]
15+
16+
WiFiPumpkin084:
217
[
318
{ Version: '0.8.4'}
419
{ changelog : 'added new plugin Pumpkin-Proxy (mitmproxy API)' },

core/config/hostapd/hostapd+.conf

-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ driver=nl80211
1717
#ignore_broadcast_ssid=0 #AP will broadcast SSID
1818
#macaddr_acl=0 #not use MAC address allow/deny list
1919
#auth_algs=1 #Shared Key Authentication
20-
#ignore_broadcast_ssid=0 #AP will broadcast SSID
2120

2221
### hostapd event logger configuration
2322
#logger_syslog=127

core/helpers/about.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def __init__(self,parent = None):
3838
self.formMode.addRow(QLabel('<a href="https://github.com/mitmproxy/mitmproxy"><strong>@mitmproxy</strong></a>'))
3939
self.formMode.addRow(QLabel('ProxyServer tranparent HTTP proxy <br>'))
4040
self.formMode.addRow(QLabel('<a href="https://github.com/TimSchumi"><strong>@TimSchumi</strong></a>'))
41-
self.formMode.addRow(QLabel('Debian package build for WiFi-Pumpkin <br>'))
41+
self.formMode.addRow(QLabel('Debian package build and password improvements <br>'))
4242
self.formMode.addRow(QLabel('<a href="https://github.com/psychomario"><strong>@psychomario</strong></a>'))
4343
self.formMode.addRow(QLabel('<a href="https://github.com/psychomario/PyPXE">PyPXE</a> class implements a DHCP Server<br>'))
4444
self.formMode.addRow(QLabel('<a href="https://github.com/xtr4nge"><strong>@xtr4nge</strong></a>'))
@@ -52,8 +52,6 @@ def __init__(self,parent = None):
5252
self.formMode.addRow(QLabel('Plugin <a href="https://github.com/lgandx/Responder"> Responder</a><br>'))
5353
self.formMode.addRow(QLabel('<a href="https://github.com/supernothing"><strong>Ben Schmidt @supernothing</strong></a>'))
5454
self.formMode.addRow(QLabel('Plugin <a href="https://github.com/supernothing/sergio-proxy">SergioProxy</a> - bypass HSTS<br>'))
55-
self.formMode.addRow(QLabel('<a href="https://github.com/DanMcInerney"><strong>Dan McInerney @danhmcinerney</strong></a>'))
56-
self.formMode.addRow(QLabel('Plugin <a href="https://github.com/DanMcInerney/net-creds">Netcreds</a> - Sniffs sensitive data<br>'))
5755
self.formMode.addRow(QLabel('<a href="http://www.yasinuludag.com/darkorange.stylesheet"><strong>Yasin Uludag</strong></a>'))
5856
self.formMode.addRow(QLabel('theme1.qss - Qt dark orange stylesheet<br>'))
5957
self.formMode.addRow(QLabel('<a href="https://github.com/ColinDuquesnoy/QDarkStyleSheet"><strong>Colin Duquesnoy @ColinDuquesnoy</strong></a>'))
@@ -118,7 +116,7 @@ def Qui_update(self):
118116
self.formAbout.addRow(QLabel('Feedback:'))
119117
self.formAbout.addRow(QLabel(self.emails[0]))
120118
self.formAbout.addRow(QLabel(self.emails[1]+'<br>'))
121-
self.formAbout.addRow(QLabel('Copyright 2015-2016, '+self.author[:-14]))
119+
self.formAbout.addRow(QLabel('Copyright 2015-2017, '+self.author[:-14]))
122120
self.gnu = QLabel('<a href="link">License: GNU General Public License Version</a><br>')
123121
self.gnu.linkActivated.connect(self.link)
124122
self.formAbout.addRow(self.gnu)

core/helpers/report.py

+30-2
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@
44
from PyQt4.QtWebKit import QWebView
55
except Exception:
66
QWebView_checker = False
7+
from os import getcwd,listdir
8+
from shutil import copyfile
9+
from os import path,mkdir
710

811
"""
912
Description:
1013
This program is a module for wifi-pumpkin.py. Report FIles Logger PDF or HTML
1114
1215
Copyright:
13-
Copyright (C) 2015-2016 Marcos Nesster P0cl4bs Team
16+
Copyright (C) 2015-2017 Marcos Nesster P0cl4bs Team
1417
This program is free software: you can redistribute it and/or modify
1518
it under the terms of the GNU General Public License as published by
1619
the Free Software Foundation, either version 3 of the License, or
@@ -62,13 +65,35 @@ def convertIt(self,printer):
6265
self.ExportPDF.print_(printer)
6366
QMessageBox.information(self, 'WiFi Pumpkin Report PDF', 'file PDF has been generated successfully.')
6467

68+
def getImagesCapturedSession(self,session):
69+
''' find images by session for export '''
70+
list_images = []
71+
if session == '':
72+
for image in listdir('logs/ImagesCap/'):
73+
list_images.append('{}/logs/ImagesCap/{}'.format(getcwd(),image))
74+
return list_images
75+
for image in listdir('logs/ImagesCap'):
76+
if session in image:
77+
list_images.append('{}/logs/ImagesCap/{}'.format(getcwd(),image))
78+
return list_images
79+
80+
def ExportImagesCaptured(self,filename):
81+
''' get images captured on session and copy to folter images_captured '''
82+
if len(filename[0]) != 0:
83+
pathdir = path.dirname(str(filename[0]))+'/images_captured/'
84+
if self.files_images != []:
85+
if not path.exists(pathdir):
86+
mkdir(pathdir)
87+
for file in self.files_images:
88+
copyfile(file,pathdir+path.basename(file))
89+
6590
def exportFilesSystem(self):
6691
# export HTML or pdf file
6792
all_unchecked = self.get_all_items_Unchecked()
6893
if not self.checkHTML.isChecked() and not self.checkPDF.isChecked():
6994
return QMessageBox.warning(self, 'WiFi Pumpkin Options',
7095
'You have to select a <strong>option</strong> file type for export.')
71-
if len(all_unchecked.keys()) == 9:
96+
if len(all_unchecked.keys()) == Refactor.exportHtml(all_unchecked,'')['Count']:
7297
return QMessageBox.warning(self, 'WiFi Pumpkin empty session',
7398
'logger:ERROR Could not find log files.')
7499

@@ -80,6 +105,7 @@ def exportFilesSystem(self):
80105
[self.sessions[key]['started'],self.sessions[key]['stoped']],apname)
81106
sessions_activated = key
82107
break
108+
self.files_images = self.getImagesCapturedSession(sessions_activated)
83109
if sessions_activated == '':
84110
contents = Refactor.exportHtml(all_unchecked,sessions_activated)
85111

@@ -102,6 +128,8 @@ def exportFilesSystem(self):
102128
printer.setOutputFileName(filename[0])
103129
self.convertIt(printer)
104130

131+
self.ExportImagesCaptured(filename)
132+
105133
@pyqtSlot(QModelIndex)
106134
def combo_clicked(self, session):
107135
# get activated logger files

core/helpers/update.py

+24-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
This program is a module for wifi-pumpkin.py. GUI update from github
1212
1313
Copyright:
14-
Copyright (C) 2015 Marcos Nesster P0cl4bs Team
14+
Copyright (C) 2015-2017 Marcos Nesster P0cl4bs Team
1515
This program is free software: you can redistribute it and/or modify
1616
it under the terms of the GNU General Public License as published by
1717
the Free Software Foundation, either version 3 of the License, or
@@ -174,10 +174,33 @@ def __init__(self, parent=None, total=0):
174174
font=QFont('White Rabbit')
175175
font.setPointSize(5)
176176
self.setFont(font)
177+
self.effect = QGraphicsOpacityEffect(self)
178+
self.setGraphicsEffect(self.effect)
179+
self.animationIn = QPropertyAnimation(self.effect, 'opacity')
180+
self.animationIn.setDuration(300)
181+
self.animationIn.setStartValue(0)
182+
self.animationIn.setEndValue(1.0)
183+
self.animationIn.start()
177184
self._active = False
178185
self.setAlignment(Qt.AlignCenter)
179186
self._text = None
180187

188+
def hideProcessbar(self):
189+
self.animationOut = QPropertyAnimation(self.effect, 'opacity')
190+
self.animationOut.setDuration(300)
191+
self.animationOut.setStartValue(1.0)
192+
self.animationOut.setEndValue(0)
193+
self.animationOut.start()
194+
self.animationOut.finished.connect(self.hide)
195+
196+
def showProcessBar(self):
197+
self.animationIn = QPropertyAnimation(self.effect, 'opacity')
198+
self.animationIn.setDuration(300)
199+
self.animationIn.setStartValue(0)
200+
self.animationIn.setEndValue(1.0)
201+
self.animationIn.start()
202+
self.show()
203+
181204
def setText(self, text):
182205
self._text = text
183206

0 commit comments

Comments
 (0)