'Oracle'에 해당되는 글 1건

  1. 2010.10.13 ASP.NET Padding Oracle Attack! (2)

2010.10.13 14:05 Web

매우 많이 참조 , 및 그림 출처 : 



위 두 사이트들은 Padding Oracle Attack에 대해 상당히 자세히 , 깔끔하게 설명해주고 있습니다. 

현 포스팅은 제가 위 사이트에서 이해한 방식을 정리한 것임을 밝혀둡니다.



몇 주 전, ASP.NET의 취약점이 알려지면서 전세계 사람들의 이목을 모았습니다 [ 저는 몰랐다는게 에러 =,.= ]

beist님의 글을 보고 비로소 알았죠


<그림1. beist 님이 뽑은 올해 최고의 버그>

ASP.NET이 얼마나 많이 쓰이고 있는지 알고 계시다면 beist 님의 말이 와닿을 겁니다.

웹 상에 떠돌아다니는 수 많은 페이지가 바로 맛있는 먹잇감으로 변하는 순간이니까요.

골라 먹는 재미가 있을 정도로 많다 그말입니다.


<그림2. 취약 사이트를 골라드실 수 있어요 :D>

보안 뉴스에도 뜨고 이제 어느 정도 알만한 사람들은 다 아는 그런 상태가 되었습니다.

MS에서도 부랴부랴 보안 패치를 내놓았고, 현재 대형 사이트 정도는 패치가 된 상태입니다.

자세한 MS 보안 공지 사항은 아래를 참조하세요.


현재 상황을 알아보았으니, 이제는 어떻게 이런 취약점이 공격에 성공하는지 알아볼 차례입니다.

사실 이번 공격은 02년도에 이미 알려진 기법을 응용한거라고 하더군요.

아무튼 이번 공격명부터 살펴보겠습니다.

ASP.NET Oracle Padding Attack 

사실 처음 들었을 때 , ASP.NET과 오라클 [ DB ] 간의 상호 연동 중 취약점이 발견된 것인줄 알았습니다.

사실 그렇게 되면 타겟팅 범위가 상당히 줄어들어버리기 때문에 

왜 다들 그렇게 큰일이라고 하는지 몰랐죠.

하지만 여기서 오라클은 DB 관리 시스템이 아니라

<그림3. 많은 이들의 사랑을 받고 있는 DB 관리 시스템 중 하나. oracle >

이 분입니다.


<그림4. oracle 의 정체는 이렇..?>

.......

매트릭스에서 오라클이 맡은 역할을 생각해보면 전혀 상관 없는건 아닙니다.

아니, 애초에 워쇼스키 형제는 이때문에 오라클이라는 이름을 가져온거겠죠.

바로 이겁니다.



신탁 기계 [ oracle machine ] . 판정 문제를 연구하는데 사용하는 추상 기계로... 


ASP.NET oracle Padding Attack 란

Padding 이 올바르게 되었는지를 Oracle 을 통해 판단하여 ASP.NET을 공격하는 그런 방법인겁니다

앞으로 나올 내용까지 생각해서 말씀드리자면 여기서 신탁이라는 건 그냥 응답입니다. 네 별거 없죠.

ASP.NET 시스템에서는 Padding 이 올바르게 되었는지 여부에 따라 응답이 다르게 오게 됩니다.

이것으로 판단을 해서 공격을 성공시키는거죠.

어때요. 참 쉽죠?

사실 이 공격을 구체화시켜보면 밥 아저씨가 그림 그리듯이 마냥 쉬운건 아닙니다


<그림5. 어때요. 참 쉽죠?>



[+]Padding Oracle Attack의 공격 원리


서두가 너무 길어졌네요.

공격 방법에 대해 알아봅시다.

제가 앞서 언급했다 시피, 이 공격의 핵심은 Padding과 서버에서 오는 응답에 있습니다.

ASP.NET의 경우 암,복호화 Block 암호화 기술을 사용하게 되고 , 이 Block 암호화 기술들은

Block 단위로 연산이 이루어지기 때문에, Size가 부족하면 그 만큼 채워넣으며 이를 Padding 이라 합니다.

우리가 앞으로 살펴보고자 하는 예제는 3DES 암호화를 이용하고 있습니다

자세한 설명은 생략... 이 아니라 다음을 참조하세요



보시면 Block Size 는 64bit , 즉 8 byte 입니다.

이 점 유의하면서 계속 보도록 하죠.

1 Block의 내용이 부족하다면 이를 채워 넣고 , 이 채워넣는 과정을 Padding 이라고 한다고 했습니다.

PKCS#5 에는 이와 같은 Padding 규약이 언급 되어있는데요.

바로 남은 N byte 를 N 으로 채운다는 것입니다.

다음 그림을 보면 이해가 쉽겠네요.



<그림6. PKCS#5에 명시된 Padding 규칙>

공격도 이 규칙을 따라 진행됩니다.

String의 길이는 저장이 되지 않기 때문에 이는 가변적으로 변할 수 있습니다.

N이 N개만큼만 있으면 OK 라 이거죠.

여기서 확인하는게 서버로부터의 응답입니다..

Padding이 올바르면 200 ,



 올바르지 않다면 500 을 리턴합니다.



Padding Oracle Attack의 의미가 이제 와닿나요?

Padding 값을 Brute Forcing 하면서 200 응답을 내는 지점을 찾으면 됩니다.





[+]Padding Oracle Attack의 목적정의



예제 평문과 암호화된 값, 암호화 방식은 다음을 참고하세요.

<그림7. CBC 모드의 3 DES 암호화 모습>

그러니까 전체 암호화된 값은 다음과 같은 형태로 우리들에게 제공 됩니다.


http://sampleapp/home.jsp?UID=7B216A6951170FF851D6CC68FC9537858795A28ED4AAC6

우리에게 주어지는건 3Block 짜리 24Byte 뿐입니다. 

그림7에서 나타난 것과 달리 평문도 , Intermediary Value 값도 알지 못합니다. 

이 공격에서 우리가 목적으로 하는 것은 무엇이죠?

바로 원하는 값을 암호화 시키거나 평문을 구하는 것입니다.

이러한 목적을 위해서 Intermediary Value 값을 구하는 것은 필수 불가결 합니다.

고로 Intermediary Value 값을 구하는게 우리에게 가장 선행되는 일이라는 거죠.

이 값을 구해야 우리가 원하는 값으로 암호화 하는게 가능하겠구요.





[+]Padding Oracle Attack을 통해 
 Intermediary Value 구하기



 여기서 조금 전에 설명드렸던 Padding 의 성질을 이용하면 다음과 같은 IV 값을 얻을 수 있습니다. 

<그림8. Padding 된 1Byte 값을 통해 Intermediary Value 1 Byte 를 알아낸 모습>

길이가 7Byte인 Block은 0x01으로 1Byte 만큼 Padding 됩니다.

우리는 IV 값을 모르지만 Brute Forcing 을 통해 HTTP 응답코드가 200이 나올 때 까지 집어 넣어 확인 할 수 있죠.

이렇게 확인한 값이 0x3c라 이겁니다.

위 그림에서는 Intermediary Value 값이 나와있지만, 사실 우리는 Triple DES 의 Key 값을 모르는 상태이기 때문에 

Intermediary Value 값을 구할 수 없었고, Padding Oracle Attack 을 통해서 비로소 구할 수 있었던 거죠.

서버에서는 평문의 길이를 기억하고 있지 않으며, 오직 Padding 값이 규칙에 따라 채워넣어져 있는 것인지 만을 체크합니다.

그래서 다음과 같이 8byte 모두 Padding 되어 있는 경우를 가정하여 Intermediary Value 8 byte 값을 모두 구할 수 있는 겁니다.

<그림 8. 8byte 가 Padding 되어 있다고 가정하여 Intermediary Value 8 byte를 모두 구한 모습>





[+] 
 Intermediary Value 로 원하는 문자열 암호화 하기 


앞서 말씀드렸다 시피 우리는 Key 값을 모르기 때문에 3 DES 를 통해 원하는 문자열을 통해 암호화 할 수 없습니다.

하지만 이미 암호화된 문자열을 IV로 조작함으로써, 원하는 대로 복호화 되도록 설정 할 수 있죠.



<그림9. IV 값을 조작하여 원하는 값을 암호화 한 모습>

여기서 유의할 점은 Block 암호화 방식을 사용하기 때문에, N-1 Block 이 N번째 Block에 영향을 준다는 점입니다.


<그림 10. CBC 모드의 복호화 방법>


그러니까 원하는 문자열을 암호화 하기 위해서는 가장 마지막 Block 부터 조작을 해나가야 한다는 겁니다.






[+] 
 
Padding Oracle Attack 예제 영상 




첫번째 영상은 암호화 되어 있는 ScriptResource 인자 값에 Web.config를 암호화 시킨 값을 집어 넣어 Web.config 파일을 

받아 볼 수 있는 장면을 담았습니다.



다음은 좀 더 실질적인 공격 모습을 담고 있는 영상입니다.

특정 사이트의 쿠키 구조를 파악한 뒤에 관리자 권한을 나타내는 문자열을 암호화 시켜 인증을 통과한 후, webshell을 올려 

시스템 권한을 얻어 낸 모습입니다.

정말 흥미롭군요!


[+] 
 
Padding Oracle Attack 방어 방법  

공격 방식을 생각해보면 방어방법이 아주 까다로운건 아니라는걸 알고 계실겁니다.
말그대로 판단을 못내리도록 하면 되죠. 잘못된 신탁 [ oracle ]을 내려주면 되는 겁니다.
이 방법으로 제시된 것이 
ResponseRedirect 기능을 사용하여 custom error페이지로 Redirect 하는 방법과
응답 시간에 랜덤한 시간 텀을 두고 응답하는 겁니다.
응답 시간에 랜덤한 시간 텀을 두는게 어딜 봐서 Padding 공격을 막느냐 하는 의문을 가지실 수 있는데
제가 언급한 전자의 방법을 쓰더라도, 응답 시간을 체크하면 이를 구분 할 수 있기 때문에
후자의 방법도 함께 써야 한다는 겁니다. 

이렇게 응답시간을 체크하여 구분 짓는 것은 Side channel attack 에서 Timming attack 에 속합니다.
brute forcing 하거나 알고리즘의 이론적인 취약점이 아닌
응답에 걸리는 시간, 파워 소비량 등을 계산하여 취약한 점을 발견해 내는 것을 side channel attack 이라 하며
이에 대한 자세한 설명은 다음을 참고하시길 바랍니다.
실제로 Troy hunt 가 이에 대한 실험을 했고, 결과는 다음과 같습니다.

<그림11. 응답 코드에 따른 반응 시간>
빨간색이 올바르지 않은 Padding 을 했을때, 파란색이 올바른 Padding 을 했을 때의 응답을 나타냅니다.
또한, 각 응답마다 랜덤한 시간만큼을 추가하는 조치가 취해지면 결과는 다음과 같이 변합니다.

<그림12. 랜덤한 텀을 준 후의 응답 시간>
자세한 결과는  Troyhunt의 포스팅을 참조하시길 바랍니다. 좋은 자료들이 많네요

[+] 
 마치며 


이런 분이 많을 거 같아 3줄 요약 하자면
1. Padding 이 올바른지 여부를 HTTP 응답 코드로 알 수 있음.
2. 응답 코드를 통해 맞을 때 까지 brute force , 알아낸 
 Intermediary Value 로 원하는 문자열 암호화
3. 응답 코드를 Redirect 하고 응답 시간을 조절함으로써 방어 가능.



혹시 자신이 관리하는 페이지가 취약한지 알고 싶으신분은

다음 사이트를 이용해서 확인하시길 바랍니다.

http://paddingoracletest.com/



참조 , 및 그림 출처 : 





'Web' 카테고리의 다른 글

Why grid of webhard is so bad?  (3) 2012.09.21
What is Tor?  (2) 2011.02.27
ASP.NET Padding Oracle Attack!  (2) 2010.10.13
I`m on a Chrome!  (0) 2010.09.13
웹브라우저의 춘추전국시대?  (0) 2010.09.13
Catching temporary I.E Files -IE 임시 파일 가로 채기  (5) 2010.08.24
Posted by LinkC
이전버튼 1 이전버튼

블로그 이미지
LinkC

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

공지사항

Yesterday35
Today4
Total331,024

달력

 « |  » 2019.8
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

최근에 받은 트랙백

글 보관함


. .