Skip to content

Commit 796514b

Browse files
authored
Add files via upload
1 parent 15598b7 commit 796514b

1 file changed

Lines changed: 173 additions & 0 deletions

File tree

eviltwin-iface-consolidation.patch

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
diff --git a/wifite/attack/eviltwin.py b/wifite/attack/eviltwin.py
2+
index 66c5e78..528b48d 100755
3+
--- a/wifite/attack/eviltwin.py
4+
+++ b/wifite/attack/eviltwin.py
5+
@@ -68,8 +68,22 @@ class EvilTwin(Attack):
6+
# Interface assignment for dual interface support
7+
self.interface_assignment = None
8+
9+
- self.interface_ap = interface_ap or Configuration.interface
10+
- self.interface_deauth = interface_deauth or Configuration.interface
11+
+ # Resolve interface assignments with precedence:
12+
+ # 1. Explicit constructor args (highest)
13+
+ # 2. Configuration.interface_primary / interface_secondary (CLI)
14+
+ # 3. Configuration.interface (the default scan interface)
15+
+ # In dual mode, _run_dual_interface() will re-derive these from the
16+
+ # InterfaceAssignment built by _get_interface_assignment().
17+
+ self.interface_ap = (
18+
+ interface_ap
19+
+ or Configuration.interface_primary
20+
+ or Configuration.interface
21+
+ )
22+
+ self.interface_deauth = (
23+
+ interface_deauth
24+
+ or Configuration.interface_secondary
25+
+ or Configuration.interface
26+
+ )
27+
28+
# Attack state management
29+
self.state = AttackState.INITIALIZING
30+
@@ -159,10 +173,23 @@ class EvilTwin(Attack):
31+
from ..util.interface_manager import InterfaceManager
32+
33+
try:
34+
- # Check if manual interfaces are specified in configuration
35+
- if Configuration.interface_primary and Configuration.interface_secondary:
36+
+ has_primary = bool(Configuration.interface_primary)
37+
+ has_secondary = bool(Configuration.interface_secondary)
38+
+
39+
+ # Warn on partial specification — secondary alone makes no sense
40+
+ # for Evil Twin, since the AP needs the primary interface.
41+
+ if has_secondary and not has_primary:
42+
+ log_warning('EvilTwin',
43+
+ 'interface_secondary is set without interface_primary; '
44+
+ 'cannot use dual interface mode for Evil Twin')
45+
+ Color.pl('{!} {O}Warning: secondary interface specified without primary; '
46+
+ 'falling back to single interface mode{W}')
47+
+ return None
48+
+
49+
+ # Both interfaces specified → dual interface mode
50+
+ if has_primary and has_secondary:
51+
log_info('EvilTwin', 'Using manually specified interfaces')
52+
-
53+
+
54+
# Get interface info for validation
55+
available_interfaces = InterfaceManager.get_available_interfaces()
56+
primary_info = next((iface for iface in available_interfaces
57+
@@ -199,6 +226,13 @@ class EvilTwin(Attack):
58+
59+
log_info('EvilTwin', f'Manual assignment validated: {assignment.get_assignment_summary()}')
60+
return assignment
61+
+
62+
+ # Only primary specified → single interface mode using primary as
63+
+ # the AP/deauth iface (already resolved in __init__).
64+
+ if has_primary and not has_secondary:
65+
+ log_info('EvilTwin',
66+
+ f'Only primary interface specified ({Configuration.interface_primary}); '
67+
+ 'running single interface mode')
68+
69+
# Check if assignment is already available (from wifite instance)
70+
# This would be set by the main wifite flow
71+
diff --git a/wifite/config/__init__.py b/wifite/config/__init__.py
72+
index cc980f7..b43a7ac 100644
73+
--- a/wifite/config/__init__.py
74+
+++ b/wifite/config/__init__.py
75+
@@ -73,8 +73,6 @@ class Configuration:
76+
use_eviltwin = None
77+
# Evil Twin settings
78+
eviltwin_port = None
79+
- eviltwin_deauth_iface = None
80+
- eviltwin_fakeap_iface = None
81+
eviltwin_deauth_interval = None
82+
eviltwin_template = None
83+
eviltwin_channel = None
84+
diff --git a/wifite/config/defaults.py b/wifite/config/defaults.py
85+
index d87d8a4..a1fac73 100644
86+
--- a/wifite/config/defaults.py
87+
+++ b/wifite/config/defaults.py
88+
@@ -51,8 +51,6 @@ def initialize_defaults(cls):
89+
# EvilTwin variables
90+
cls.use_eviltwin = False
91+
cls.eviltwin_port = 80
92+
- cls.eviltwin_deauth_iface = None
93+
- cls.eviltwin_fakeap_iface = None
94+
cls.eviltwin_deauth_interval = 5
95+
cls.eviltwin_template = 'generic'
96+
cls.eviltwin_channel = None
97+
diff --git a/wifite/config/parsers/eviltwin.py b/wifite/config/parsers/eviltwin.py
98+
index 2e68eb8..a297db2 100644
99+
--- a/wifite/config/parsers/eviltwin.py
100+
+++ b/wifite/config/parsers/eviltwin.py
101+
@@ -14,15 +14,37 @@ def parse_eviltwin_args(cls, args):
102+
# Display interface capabilities info
103+
display_eviltwin_interface_info(cls)
104+
105+
- if hasattr(args, 'eviltwin_deauth_iface') and args.eviltwin_deauth_iface:
106+
- cls._validate_interface_name(args.eviltwin_deauth_iface)
107+
- cls.eviltwin_deauth_iface = args.eviltwin_deauth_iface
108+
- Color.pl('{+} {C}option:{W} Evil Twin deauth interface: {G}%s{W}' % args.eviltwin_deauth_iface)
109+
-
110+
+ # --eviltwin-fakeap-iface is an Evil Twin-scoped alias for --interface-primary.
111+
+ # Both populate Configuration.interface_primary; specifying both with different
112+
+ # values is a configuration error.
113+
if hasattr(args, 'eviltwin_fakeap_iface') and args.eviltwin_fakeap_iface:
114+
cls._validate_interface_name(args.eviltwin_fakeap_iface)
115+
- cls.eviltwin_fakeap_iface = args.eviltwin_fakeap_iface
116+
- Color.pl('{+} {C}option:{W} Evil Twin fake AP interface: {G}%s{W}' % args.eviltwin_fakeap_iface)
117+
+ other = getattr(args, 'interface_primary', None)
118+
+ if other and other != args.eviltwin_fakeap_iface:
119+
+ Color.pl('{!} {R}Error: --eviltwin-fakeap-iface ({O}%s{R}) conflicts with '
120+
+ '--interface-primary ({O}%s{R}){W}'
121+
+ % (args.eviltwin_fakeap_iface, other))
122+
+ raise ValueError('Conflicting interface specifications: '
123+
+ '--eviltwin-fakeap-iface vs --interface-primary')
124+
+ cls.interface_primary = args.eviltwin_fakeap_iface
125+
+ cls.dual_interface_enabled = True
126+
+ Color.pl('{+} {C}option:{W} Evil Twin fake AP interface: {G}%s{W}'
127+
+ % args.eviltwin_fakeap_iface)
128+
+
129+
+ # --eviltwin-deauth-iface is an Evil Twin-scoped alias for --interface-secondary.
130+
+ if hasattr(args, 'eviltwin_deauth_iface') and args.eviltwin_deauth_iface:
131+
+ cls._validate_interface_name(args.eviltwin_deauth_iface)
132+
+ other = getattr(args, 'interface_secondary', None)
133+
+ if other and other != args.eviltwin_deauth_iface:
134+
+ Color.pl('{!} {R}Error: --eviltwin-deauth-iface ({O}%s{R}) conflicts with '
135+
+ '--interface-secondary ({O}%s{R}){W}'
136+
+ % (args.eviltwin_deauth_iface, other))
137+
+ raise ValueError('Conflicting interface specifications: '
138+
+ '--eviltwin-deauth-iface vs --interface-secondary')
139+
+ cls.interface_secondary = args.eviltwin_deauth_iface
140+
+ cls.dual_interface_enabled = True
141+
+ Color.pl('{+} {C}option:{W} Evil Twin deauth interface: {G}%s{W}'
142+
+ % args.eviltwin_deauth_iface)
143+
144+
if hasattr(args, 'eviltwin_port') and args.eviltwin_port:
145+
cls.eviltwin_port = args.eviltwin_port
146+
diff --git a/wifite/config/validators.py b/wifite/config/validators.py
147+
index 94cd375..525194c 100644
148+
--- a/wifite/config/validators.py
149+
+++ b/wifite/config/validators.py
150+
@@ -48,17 +48,19 @@ def validate_eviltwin_config(cls):
151+
Color.pl('{!} - Alfa AWUS036ACH (Realtek RTL8812AU)')
152+
raise RuntimeError('No AP-capable interfaces available for Evil Twin attack')
153+
154+
- # If fake AP interface is specified, validate it
155+
- if cls.eviltwin_fakeap_iface:
156+
+ # If a primary interface was specified (via --interface-primary or
157+
+ # --eviltwin-fakeap-iface), validate it supports AP mode. Both flags
158+
+ # populate the same Configuration.interface_primary field.
159+
+ if cls.interface_primary:
160+
found = False
161+
for caps in ap_interfaces:
162+
- if caps.interface == cls.eviltwin_fakeap_iface:
163+
+ if caps.interface == cls.interface_primary:
164+
found = True
165+
break
166+
167+
if not found:
168+
Color.pl('{!} {R}Error: Specified interface {O}%s{R} does not support AP mode{W}'
169+
- % cls.eviltwin_fakeap_iface)
170+
+ % cls.interface_primary)
171+
Color.pl('{!} {O}Available AP-capable interfaces:{W}')
172+
for caps in ap_interfaces:
173+
Color.pl('{!} - {G}%s{W}' % caps.interface)

0 commit comments

Comments
 (0)