네트워크/네트워크 보안

CVE-2014-3566 (POODLE)

비니화이팅 2020. 2. 24. 16:22

POODLE(Padding Oracle On Downgraded Legacy Encryption)

Padding Oracle On Downgraded Legacy Encryption 그대로 해석하면 다운 그레이드 된 레거시 암호화의 패딩 오라클(특정 입력을 받아 암호화 작업을 수행하는 시스템)이다.

Downgraded Legacy Encryption는 SSL3.0로 Downgrade, Padding Oracle은 SSL3.0의 블록 암호화의 패딩 검증 취약점이라고 생각하면 된다.

즉, SSL3.0 취약점(블록 암호 암호의 패딩 검증)을 이용한 암호 해독 공격이다.

cve : https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3566

 

 

조건

1) SSL 3.0 CBC 모드 사용

2) SSL 3.0 사용 브라우저(IE 6 등)

3) MITM 공격이 가능

4) js삽입 가능

 

위의 3가지 조건이 만족해야 한다.

 

 

원리

SSL3.0의 취약점을 이용할 것이기 때문에 SSL3.0으로 Downgrade 시킨 후, Padding Oracle Attack을 진행한다.

 

1. Downgraded Legacy Encryption(Downgrade Dance)

SSL 프로토콜의 handshake 과정의 Cilent hello 과정에서는 SSL 버전, 암호 사양 등을 서버로 전송하는데, 해커는 이를 가로채어 SSL3.0으로 Downgrade를 시도한다.

 

1) 클라이언트가 서버로 Client hello시, 해커는 중간에서 해당 패킷을 드랍시킨 후, 서버에게 연결 종료 패킷(TCP FIN, ACK)을 전송한다.

2) 클라이언트는 Client hello로 제시했던 버전 지원이 안된다고 생각하여 한 단계 낮은 버전을 제시한다.

3) 클라이언트가 SSLv3.0을 제시할때까지 해커는 다시 해당 패킷을 드랍시키고, 서버에게 연결 종료 패킷을 보내는 것을 반복한다. 

 

ssl handshake

SSL handshake : https://medium.com/@kasunpdh/ssl-handshake-explained-4dabb87cdce

 

 

2. Padding Oracle(Padding Oracle Attack)

Padding Oracle에 암호문을 넣으면 패딩이 올바른지 여부를 반환하게 되는데, 이를 이용한 공격이다.

 

우선 블록 암호에 대해서 이해하고 넘어가야한다. 블록 암호는 고정 크기의 데이터를 받아 처리하는데, 정해진 고정크기의 블록 크기의 입력값이 들어오지 않을 경우 고정된 블록 크기로 맞추기 위해 뒤에 Padding을 추가한다.

 

예를 들면, PKCS#5 Padding은 블록 사이즈가 8바이트에 맞추어져 있고, 패딩에는 다음과 같이 패딩의 사이즈가 들어간다.

M1 : A A A 0x05	0x05 0x05 0x05 0x05

M2 : A A A A A A 0x02 0x02

M3 : A A A A A A A 0x01

M4 : A A A A A A A A 0x08 0x08 0x08 0x08 0x08 0x08 0x08 0x08

 

아래는 블록 암호의 CBC모드의 암호화 방식이다. 첫 번째 블록은 평문과 IV는 XOR되고, Key를 통해 암호화된다. 그 이후의 블록은 암호화 되기 전 이전의 암호화 결과와 XOR된 후 암호화된다.

(IV는 각 메시지를 고유하게 만드는 역할을 하기 때문에, 같을 경우 출력 결과가 항상 같다.)

블록 암호의 CBC모드 복호화 방식이다. 첫번째 암호문 블록은 key를 통해 복호화된 후, IV와 XOR되고, 그 이후의 블록은 key를 통해 복호화된 후 그 이전의 암호문 블록과 XOR된다.

 

 

Padding Oracle은 사용자로부터 암호화 된 데이터를 가져와 해독한 후 패딩이 올바른지 여부를 확인하는 시스템이다. 앞에서 말했듯이, Padding Oracle Attack은 이 시스템을 이용한 공격이다.

 

응용 시스템에 매개변수로 암호문이 전달되면 응용 시스템은 복호화된 블록의 마지막 바이트의 값과 Padding 의 숫자를 비교한 후 일치 여부에 따라 아래의 세 가지 방 중 한 가지 방법으로 응답하게된다.

1) 유효한 암호문 전달 : 200 OK

2) 유효하지 않은 암호문 전달(=Padding이 올바르지 않음) : 500 Interner server error

3) 유효한 암호문 전달-유효하지 않은 값 : 200 OK + 사용자 지정 오류 메시지

 

예로, 아래와 같이 a 매개변수로 IV와 암호문이 전달된다면  (IV는 12345678, 암호문은 ABCDEFG라고 친다.)

http://test.com/?a=1122334455667788A0A1A2A3A4A5A6A7

 

1) 공격자는 Padding을 일치시켜 200 OK 응답을 받아내기 위해 IV값을 00000000로 초기화하여 서버에게 다음과 같은 매개변수를 넣어 요청을 보낸다.

이때 서버는 전달받은 매개변수를 복호화한 블록의 Padding을 확인하지만, Padding이 유효하지 않아 500 응답을 보낸다.

http://test.com/?a=0000000000000000A0A1A2A3A4A5A6A7

 

Encrypted Input 0xA0 0xA1 0xA2 0xA3 0xA4 0xA5 0xA6 0xA7
TRIPLE DES

Intermediary

Value

0xB0 0xB1 0xB2 0xB3 0xB4 0xB5 0xB6 0XB7
XOR
IV 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Decrypted Value 0xB0 0xB1 0xB2 0xB3 0xB4 0xB5 0xB6 0XB7

 

2) 공격자는 다시 200 OK 응답을 받아내기 위해 IV값의 마지막 바이트를 00000001로 증가하여 서버에게 다음과 같은 매개변수를 넣어 요청을 보낸다.

이때 서버는 전달받은 매개변수를 복호화한 블록의 Padding을 확인하지만, 마찬가지로 Padding이 유효하지 않아 500 응답을 보낸다.

http://test.com/?a=0000000000000001A0A1A2A3A4A5A6A7

 

Encrypted Input 0xA0 0xA1 0xA2 0xA3 0xA4 0xA5 0xA6 0xA7
TRIPLE DES

Intermediary

Value

0xB0 0xB1 0xB2 0xB3 0xB4 0xB5 0xB6 0XB7
XOR
IV 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01
Decrypted Value 0xB0 0xB1 0xB2 0xB3 0xB4 0xB5 0xB6 0XB6

 

3) 위와 같이 공격자는 유효한 Padding이 될 때까지 IV값의 마지막 바이트를 증가시켜 200 OK 응답을 받아낸다. 그러면 공격자는 XOR을 이용하여 해당 블록의 8번째 바이트의 Intermediary value가 0xB7인 것을 알아낼 수 있다.

http://test.com/?a=00000000000000B6A0A1A2A3A4A5A6A7

 

Encrypted Input 0xA0 0xA1 0xA2 0xA3 0xA4 0xA5 0xA6 0xA7
TRIPLE DES

Intermediary

Value

0xB0 0xB1 0xB2 0xB3 0xB4 0xB5 0xB6 0XB7
XOR
IV 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xB6
Decrypted Value 0xB0 0xB1 0xB2 0xB3 0xB4 0xB5 0xB6 0X01

 

4) 공격자는 8번째 바이트의 Intermediary value를 알아냈으므로 이번에는 7번째의 Intermediay value가 0XB6인 것을 아래와 같이 알아낸다.

http://test.com/?a=000000000000B4B5A0A1A2A3A4A5A6A7

 

Encrypted Input 0xA0 0xA1 0xA2 0xA3 0xA4 0xA5 0xA6 0xA7
TRIPLE DES

Intermediary

Value

0xB0 0xB1 0xB2 0xB3 0xB4 0xB5 0xB6 0XB7
XOR
IV 0x00 0x00 0x00 0x00 0x00 0x00 0xB4 0xB5
Decrypted Value 0xB0 0xB1 0xB2 0xB3 0xB4 0xB5 0X02 0X02

 

5) 위와 같이 반복하여 공격자는 모든 바이트의 Intermediary value가 B0B1B2B3B4B5B6B7인 것을 알아내고, CBC모드의 역으로 복호화를 수행하여 복호화된 값을 얻어낼 수 있다.

http://test.com/?a=B8B9BABCBBBDBEBFB6A0A1A2A3A4A5A6A7

 

Encrypted Input 0xA0 0xA1 0xA2 0xA3 0xA4 0xA5 0xA6 0xA7
TRIPLE DES

Intermediary

Value

0xB0 0xB1 0xB2 0xB3 0xB4 0xB5 0xB6 0XB7
XOR
IV 0xB8 0xB9 0xBA 0xBB 0xBC 0xBD 0xBE 0xBF
Decrypted Value 0x08 0x08 0x08 0x08 0x08 0x08 0x08 0x08

 

참고 : https://blog.gdssecurity.com/labs/2010/9/14/automated-padding-oracle-attacks-with-padbuster.html

 

 

Nmap

nmap -sV -O -p 443 --script ssl-poodle [IP address]

결과로 ssl-poodle부분이 VULNERABLE인 것을 확인하면 된다.

 

참고 : https://nmap.org/nsedoc/scripts/ssl-poodle.html

 

 

PoC

https://github.com/mpgn/poodle-PoC

https://github.com/EiNSTeiN-/poodle