본문 바로가기
☠️ 보안

SSL 취약점을 이용한 공격, Heart bleeds(하트블리드) 실습 (1)

by 비타민찌 2021. 7. 20.
728x90

SSL 취약점을 이용한 공격,

Heart bleeds(하트블리드) 실습

 

 

📍Open SSL 이란?

Open SSL을 다루기 전에, 먼저 SSL을 먼저알아보자.

 

SSL이란 Secure Socket Layer의 약자로,

월드 와이드 웹 브라우저와 웹 서버 간에 데이터를 안전하게 주고받기 위한 전송(4)계층 업계 표준 보안 프로토콜을 의미한다. TLS(과거 명칭, Transprot Layer Security) HTTP 통신을 암호화하는데 사용된다.

 

Open SSL웹브라우저와 서버 간의 통신을 암호화하는 오픈소스 라이브러리라고 보면 된다.

한 마디로 Openssl을 웹서버(Apache,Nginx)에서 자유롭게 사용할 수 있다.

Openssl은 2014년, Heart bleed 버그로 이슈화가 되었다.

 

📍Heart bleeds

이 버그를 발견한 핀란드 보안 업체 ‘코데노미콘’은 이를 대중에게 설명하기 위하여 Heartbleed.com이라는 홈페이지를 개설하고 피를 흘리는 심장과 함께 이 취약점의 이름을 하트블리드(Heartbleed)라고 명명하였다. 이 취약점이 이런 이름으로 칭해지게 된 계기와 취약점 분석, 그리고 방어 방법에 대한 설명을 담았다.

 

😈 Heart bleeds 공격원리

OpenSSL 1.0.1 버전부터 하트비트(Heartbeat)라는 이름의 확장 모듈이 추가되었는데, 이는 TLS(Transport Layer Security) / DTLS(Datagram Transport Layer Security) 프로토콜에서 매번 연결을 재협상하지 않아도 통신연결을 유지하게 해주는 확장 규격이다. 클라이언트가 하트비트를 요청하며 Payload와 해당 Payload의 길이를 보내면 서버 측에서는 하트비트 응답에 내용을 그대로 복사해 되돌려주며 연결을 확인한다. 다음 그림과 같다!

그림 1

위 그림과 같은 상황을 예시로 정리해보면,

먼저 클라이언트가 하트비트 요청으로 ‘HELLO’라는 문자의 Payload와 해당 Payload의 길이 5를 전송한다. 서버는 하트비트 요청 사항을 확인하고 하트비트에 클라이언트에서 온 ‘HELLO’라는 Payload와 Payload의 길이 5를 그대로 담아 응답한다. 이러한 일련의 과정을 주기적으로 반복하며 클라이언트와 서버 사이의 연결을 수립한다.

참고로 이 그림에서 하트비트 교환 중 Payload의 예시로 사용된 메시지 ‘HELLO’는, 단순히 이해하기 쉽도록 설명하기 위하여 표현된 임의의 메시지다. ‘HELLO’를 '당근'이라고 해도 똑같다.

 

아래는 위 예시의 실제 패킷이다.

6글자로 carrot 이라는 문자를 요청하고, 대답을 받는다.

6글자, carrot 이라는 문자를 요청 했다.

 

그리고 "carrot"이라는 응답이 왔다. 정상적이다. 자, 그럼 다음 그림을 보자.

아래 그림은 Payload 길이가 조작된 하트비트 메시지 교환이다.

 

그림 2

하트블리드는 여기서 하트비트 요청 메시지에 포함된 Payload와 Payload의 길이 부분 사이의 일치성을 확인하지 않는다는 점에서 발생하는 보안 이슈이다.

서버에서 하트비트에 대한 응답을 할 때, 메모리에서 요청으로 들어온 Payload를

마찬가지로 요청으로 들어온 Payload의 길이 만큼 빼내어 되돌려준다.

여기서 Payload의 길이의 값을 실제 Payload보다 훨씬 크게 잡으면 메모리에서 Payload의 뒤에 적혀 있는 값을 길이 만큼 모두 응답 패킷에 담아 보내버리는 버그가 발생한다. 아래 그림은 이해를 돕기 위한 간단한 그림이다.

 

다시 그림 2의 예시를 참고로 다시 한 번 정리를 해보면,

클라이언트가 Payload를 ‘HELLO’, Payload의 길이를 25로 지정한 하트비트 메시지를 서버로 전송하였다.

서버는 이 하트비트 메시지를 메모리에 올려 확인한 다음 이에 대한 응답으로 길이가 25인 ‘HELLO’라는 메시지 응답을 한다.

하지만 ‘HELLO’는 5글자밖에 되지 않으므로 메모리의 ‘HELLO’를 초과하여,

뒤에 이어지는 값까지 모두 포함한 25글자 길이의 메시지를 전송해버린다.

 

다음 이미지는 아까의 carrot을 255글자로 대답하라는 요청을 보내고 돌아온 대답이다.

 

carrot 뒤에 추가적인 메모리 내용도 돌아왔다.

 

이러한 문제로 이 버그를 악용할 경우 메모리에 할당될 수 있는 아이디, 비밀번호, 사용자 개인 자료 등의 각종 정보가 외부로 노출될 수 있는 치명적인 취약점이 될 수 있다. 이 사태를 하트비트에서 발생한 보안 이슈를 이용하기 때문에 ‘하트블리드(Heartbleed, 심장출혈)’라는 명칭으로 불리게 되었다.

 

 

 

📍실습 환경

 

📍CentOS 6.5 취약 환경 세팅

 

1. 네크워크 설정

dfclient

 

 

2. 다음을 터미널 창에 붙여넣기 후, 엔터 !

cat <<-'EOF' > /etc/yum.repos.d/CentOS-Base.repo
[C6.10-base]
name=CentOS-6.10 - Base
baseurl=http://vault.centos.org/6.10/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
enabled=1
metadata_expire=never

[C6.10-updates]
name=CentOS-6.10 - Updates
baseurl=http://vault.centos.org/6.10/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
enabled=1
metadata_expire=never

[C6.10-extras]
name=CentOS-6.10 - Extras
baseurl=http://vault.centos.org/6.10/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
enabled=1
metadata_expire=never

[C6.10-contrib]
name=CentOS-6.10 - Contrib
baseurl=http://vault.centos.org/6.10/contrib/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
enabled=0
metadata_expire=never

[C6.10-centosplus]
name=CentOS-6.10 - CentOSPlus
baseurl=http://vault.centos.org/6.10/centosplus/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
enabled=0
metadata_expire=never
EOF

 

더 이상 CentOs6에 yum repository가 지원하지 않아서, 다른 레포지터리로 변경하는 작업.

해당 작업을 완료하면, 이제 yum을 사용할 수 있다.

 

yum install -y httpd httpd-tools mod_ssl

 

위 3가지를 설치하면, 자동으로 취약한 버전의 openssl이 설치된다.

 

설정:

우선 최상위 루트(어디든 상관 없음.)에 ssl 이라는 폴더를 생성하고, 다음 명령어를 입력한다.

다음은 https의 인증서 생성 명령어이다.

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /ssl/webserver.key -out /ssl/webserver.crt

* -x509: 공개키 인증서와 인증 알고리즘 표준.

* -newkey rsa:2048 : 키 길이를 2048로, 암호 알고리즘 방식은 rsa로 된 키 생성.

 

그리고 다음과 같이 인증서 설정 해준다.

여기서 작성한 정보는 이렇게 인증서로 만들어진다.

 

 

이제 이 인증서를 우리 웹서버가 사용할 수 있게 설정해준다.

 

우선 방화벽이 우리가 생성한 인증서 파일을 차단해 버리기 때문에 방화벽을 끈다.

setenforce 0 //로컬 방화벽. 파일 검사하는 애
service iptables stop //네트워크 방화벽. 포트 차단.

 

 

그리고 다음과 같은 경로에 위치한 ssl.conf 파일을 수정한다.

vi /etc/httpd/conf.d/ssl.conf

105번, 112번 라인을 위와 같이 수정한다.

 

웹서버 설정이 완료되면, 웹서버를 재시작 한다.

service httpd restart

 

여기까지 세팅이 끝났고, 잘 되었는지 확인해본다.

netstat -anlp | grep :443

 

그럼 이제 kali 로 공격할 차례.

아래 사이트로 가서, 파이썬 파일을 다운로드 받는다.

https://www.exploit-db.com/exploits/32745

 

아래 명령어를 입력해도 된다.

 wget https://www.exploit-db.com/download/32745.py

 

다운로드 후 아래 명령어를 입력한다.

python heartbleed.py 192.168.100.138 5000
                          [ 타깃 IP ] 몇 바이트의 메모리를 훔쳐볼 것인지?

여기까지 이렇게 타깃의 메모리를 훔쳐볼 수 있는 것을 확인했다.

그럼 이것을 이용해 어떤 것을 할 수 있는지 알아보자.

 

 

[ 다음 글 ] 에서 실습이 이어집니다.

728x90

댓글