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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2025-32023 — CVE-2025-32023 / PlaidCTF 2025 "Zerodeo"에 대한 PoC 및 익스플로잇 | Kitploit
도구/GitHubGitHub/leesh3288/cve-2025-32023
Memory ForensicsVulnerability AnalysisExploitationReverse EngineeringCTFPayload DevelopmentBinary Exploitation
GitHubleesh3288/cve-2025-32023

CVE-2025-32023

CVE-2025-32023 / PlaidCTF 2025 "Zerodeo"에 대한 PoC 및 익스플로잇

저장소 보기
216401년 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2025-32023

CVE-2025-32023에 대한 PoC 및 Exploit (GHSA-rp2m-q4j6-gr43) / PlaidCTF 2025 "Zerodeo"

재현 / 패치

redis:7.4.2-alpine3.21@sha256:02419de7eddf55aa5bcf49efb74e88fa8d931b4d77c07eff8a6b2144472b6952에 대해 테스트했습니다.

Redis 2.8 이상 버전에 영향을 미칩니다. 8.0.3, 7.4.5, 7.2.10, 6.2.19에서 패치되었습니다. redis/redis@5018874 참조.

버그

Redis의 HyperLogLog는 고유한 커스텀 인코딩을 가진 또 하나의 문자열일 뿐입니다. 희소 HLL 인코딩을 반복 처리하려면 각 희소 표현의 런 길이를 더해야 하는데, 잘못된 HLL을 대상으로 할 경우 int i에 누적되는 총 길이가 오버플로하여 음수 값이 될 수 있습니다. 이로 인해 공격자는 HLL 구조체의 음수 오프셋에 덮어쓸 수 있으며, HLL 구조체가 어디서 비롯되었는지에 따라 스택/힙에 대한 out-of-bounds 쓰기가 발생할 수 있습니다(예: hllMerge()는 스택에 할당된 구조체를, hllSparseToDense()는 힙에 할당된 구조체를 받습니다).

아래 패치 스니펫을 참조하세요:

root@kitploit:~
 int hllMerge(uint8_t *max, robj *hll) {
     struct hllhdr *hdr = hll->ptr;
     int i;

     if (hdr->encoding == HLL_DENSE) {
         hllMergeDense(max, hdr->registers);
      } else {
         uint8_t *p = hll->ptr, *end = p + sdslen(hll->ptr);
         long runlen, regval;
+        int valid = 1;
 
         p += HLL_HDR_SIZE;
         i = 0;
         while(p < end) {
             if (HLL_SPARSE_IS_ZERO(p)) {
                 runlen = HLL_SPARSE_ZERO_LEN(p);
+                if ((runlen + i) > HLL_REGISTERS) { /* Overflow. */
+                    valid = 0;
+                    break;
+                }
                 i += runlen;
                 p++;
             } else if (HLL_SPARSE_IS_XZERO(p)) {
                 runlen = HLL_SPARSE_XZERO_LEN(p);
+                if ((runlen + i) > HLL_REGISTERS) { /* Overflow. */
+                    valid = 0;
+                    break;
+                }
                 i += runlen;
                 p += 2;
             } else {
                 runlen = HLL_SPARSE_VAL_LEN(p);
                 regval = HLL_SPARSE_VAL_VALUE(p);
-                if ((runlen + i) > HLL_REGISTERS) break; /* Overflow. */
+                if ((runlen + i) > HLL_REGISTERS) { /* Overflow. */
+                    valid = 0;
+                    break;
+                }
                 while(runlen--) {
                     if (regval > max[i]) max[i] = regval;
                     i++;
                }
                 p++;
             }
         }
-        if (i != HLL_REGISTERS) return C_ERR;
+        if (!valid || i != HLL_REGISTERS) return C_ERR;
     }
     return C_OK;
 }

익스플로잇

익스플로잇은 표준적인 Redis pwnable 방식입니다:

  1. jemalloc 힙에서 sds 객체를 변조하여 길이를 크게 만듭니다.
  2. embstr 객체를 스프레이하여 가짜 모듈 객체로 변조합니다.
  3. 변조된 sds 객체를 사용해 힙을 덤프하여 대상 embstr 객체를 찾고 주소를 누출합니다.
  4. 대상 embstr 객체에 가짜 모듈 객체를 생성합니다.
  5. 가짜 모듈 객체를 삭제하여 소멸자(destructor)를 트리거하고 RCE를 얻습니다.
도구 다운로드