https://shayete.tistory.com/entry/Poodle-padding-oracle-on-downgraded-legacy-encryption

 

Poodle [padding oracle on downgraded legacy encryption]

이걸 전주에서 발표한 지 2달쯤 지난 것 같은데 그 후로 너무 바빠서 지금 포스팅을 하게 되네요.  10월에 잠깐 이슈가 되었던 푸들어택은 POODLE(Padding Oracle On Downgraded Legacy Encryption)의 약자로  ..

shayete.tistory.com

OpenSSL 관련 Poodle 공격 관련해서 공부를 다시 하는 중 입니다.

 

https://vulmon.tistory.com/4

 

CBC(Cipher Block Chaining) Padding oracle Attack

1. 개요 - Oracle? DB가 아닌 "응답에 대한 판독"의 의미 - Padding? (PKCS5 - 8 bytes/block , PKCS7 - 16bytes/block)  평문 데이터를 블록 암호화 하기 위해 고정된 크기의 블록으로 처리를 함에 있어 평문..

vulmon.tistory.com

 

 Downgrade dance 과정은 일단, 클라이언트가 서버에게 client hello에 최신 프로토콜인 TLS 1.2를 보내는 데 중간에 해커가 그 정보를 가로채서 패킷을 드랍시키고 서버에게 현재 연결을 종료시키는 패킷을 보냅니다. 클라이언트 쪽에서는 TLS 1.2가 서버에서 지원이 안되나보다 하고 한단계 낮은 TLS 1.1을 날립니다. 이것도 해커가 가로채서 패킷을 드랍시킵니다. 이렇게 한 단계씩 내리다보면 SSLv3까지 내려오게 되는데 그제서야 해커는 서버에게 이 패킷을 날려서 SSLv3을 사용하도록 유도합니다.

 

 

 

 

* 이 방법 외에도 다운그레이드 하는 방법은 몇 가지 더 되고, 제가 적은 건 다운그레이드 방법의 한 예입니다.

 

 

 

 SSLv3으로 내려가면 패딩오라클 어택을 시도할 수 있습니다. 위 그림은 CBC mode encryption을 나타냈는데 평문 한 블록을 임의의 초기벡터와 xor 연산을 해서 나온 임의의 값을 특정 키값과 블럭암호화를 합니다. 생성된 암호문 1을 다음 평문과 xor하여 또 다른 암호를 2를 만들고.. 이렇게 블록암호화 하면서 암호문을 생성하는 게 cbc encryption인데, 블럭암호화를 하면 패딩값이 무조건 1바이트 이상 나오게 됩니다.

 

 

 예를 들어 표현한 건데 블럭암호화를 하지 않았을 경우와 암호화를 했을 때를 나타내는 표입니다. 1번은 Shayete라는 7바이트 값이 블럭에 들어가 있습니다. 근데 블럭암호를 했을 때 블럭의 마지막 1바이트에 패딩값이 채워지게 됩니다. 마찬가지로 4바이트 값이 들어가 있다면 패딩값 4바이트가 채워지게 되고 블럭에 8바이트 꽉꽉 채워져있으면 그 다음 블럭에 8바이트의 패딩값이 들어갑니다. 8바이트 이상의 값이 있어도 그 다음 블럭에서 똑같이 패딩값이 생성되고요. 이 패딩으로 어떻게 값을 알아낼 수 있냐고요?

 

 

 

 cbc decryption마저 보고 설명드리겠습니다. 복호화는 암호화와 반대로 진행됩니다. 암호문을 특정 키값과 블럭암호화해서 생성된 임의의 값과 임의의 초기벡터를 xor연산해서 평문으로 복호화합니다. 처음의 암호문1로 다음 임의의 값과 xor연산해서 다음 평문을 복호화시키고요. 이 과정이 cbc decryption입니다. 지금까지 encryption, decryption을 설명드렸는데 이걸로 뭘 할 수 있을까요. 패딩값을 이용하는 것과 cbc mode의 구조의 결함을 가지고 공격을 하게 됩니다. 평문을 얻어내려면 초기벡터값과 임의의 값 intermediary값이 필요한데, 

 

 

 

 공격자는 중간에 빼온 값들을 xor 연산해서 intermediary 값을 얻게 되는데 이 과정에서 암호문이 옳다면 서버는 200ok 표시되고 패딩값은 맞는데 잘못된 값을 받았을 경우 200ok custom error를, 그리고 패딩값이 잘못된 값을 받았을 땐 500 에러가 뜹니다. 초기벡터값을 브루트포싱으로 진행하다보면 올바른 intermediary 값을 얻게 되는데 이걸 이용해서 평문을 복호화시킵니다. 위 그림을 보면 예를 들어 패딩값이 1개 있을 때 브루트포싱으로 쭉 돌리다가 초기벡터가 0x36일 때 서버에서 200ok를 보내 패딩값을 알아낸 것을 볼 수 있고 2번째는 패딩값이 4개일 때, 마지막은 패딩값이 8개일 때 올바른 intermediary값을 찾은 걸 볼 수 있습니다.

 

 

 

 패딩오라클의 전체적인 모습을 그림으로 표현해봤습니다. A의 값과 B를 xor하면 intermediary C가 나오게 되는데 이것이 Original 값의 D와 일치하다고 판단하여 평문인 E를 얻게 됩니다. 이런식으로 브루트포스를 진행해서 완벽한 평문을 얻어내는 게 패딩오라클 어택입니다. 

 

 

푸들어택에 대한 대처방안은,

 

 크롬에서는  --ssl-version-min=tls1 을 이용해서 버전이 내려가는 걸 막는 방법이 있습니다. IE에서는 인터넷 옵션에서 ssl3.0으로 내리는 것을 막을 수 있고요. 공용 와이파이를 쓰지 않는 것과 TLS_FALLBACK_SCSV 옵션을 사용하는 방법이 있습니다. 그리고 마소에서 푸들을 막기 위해 임시용 프로그램을 만들어 둔 것 같은데 그것도 방법 중의 하나입니다.

 

--ssl-version-min=tls1 이건 인터넷 검색해보면 여러 군데에서 설명을 해뒀으니 따로 적지 않겠습니다.

 

TLS_FALLBACK_SCSV는 

 

 

만약 프로토콜이 내려가는 것을 감지하면 inappropriate_fallback 경고 메세지를 보내서 다운그레이드를 방지할 수 있는 방법입니다.




'암호학 & 알고리즘' 카테고리의 다른 글

HMAC란?  (0) 2021.07.27
백준 분해합 C  (0) 2021.01.02
Oracle Padding Attack  (0) 2019.11.27
블로그 이미지

wtdsoul

,