ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 국가암호공모전 2017 (II-A)분야 5번 문제
    문제 풀이/2017 국가암호공모전 2020. 3. 10. 22:01

    Oracle Padding Attack(OPA)는 해킹, 보안을 공부하는 사람이라면 대부분 알고 있을 것입니다. 너무 유명해서 이 공격에 대한 한국어 기술 문서도 많이 만들어졌던 것으로 기억하는데요,

    이 공격 자체가 유명해졌던 시기가 대략 2014-2015년으로 기억하는데(틀릴 수 있습니다).. 너무 오래돼서 최근에는 아마 ctf나 해킹 대회에서는 잘 출제가 되지 않겠지만 해킹에 대한 일종의 기본기를 쌓을 수 있는 공격이라고 생각합니다. 게다가 이 문제가 나온게 2017년 이었으니 말이죠...크흠

    기본적으로 공격자가 보내는 요청에 따라서 서버가 다른 응답을 보낸다는 개념 + 암호학에서 자주 쓰이는 패딩의 개념 등을 이해할 수 있어서 참 좋은 문제였던 것 같습니다.

     

    이제 아래에 대회때 제출했던 답안을 적어보도록 하겠습니다.

     

    ------------------------------

    문제 1) 다음의 패딩 오라클 공격 시도와 서버 응답을 참고하여 서버로 전송되는 "CEF5EBBC009C8B27444B33818D969AD5EF68F202594EC5756CE81682F7543221" 의 평문을 알아내기 위한 패딩 오라클 공격 원리와 과정을 쓰시오.

     

    패딩 오라클 공격이 무엇인지에 대해 먼저 알아보자.

    이 공격의 핵심은, (암호문을 복호화한) 평문의 패딩이 올바르게 되었는지 여부에 따라 서버의 응답이 모두 다른 점을 이용하는 것이다.

    그렇다면 여기에서 말하는 (PKCS#7) 패딩은 무엇인가? 암호학에서의 패딩이란 블록 암호화에서 부족한 부분들을 채워주기 위해 사용된다. 평문의 길이를 8로 나눈 나머지를 n이라 하자. 그러면 8-n개만큼 hex(8-n)를 패딩으로 사용한다.

     

    8 바이트 블록 암호화를 통해 예시를 들 수 있다.

    평문이 영문 5글자가 되면, 나머지 3바이트를 \x03으로 채워야 한다.

    평문 예시 : peach\x03\x03\x03

    평문이 영문 3글자가 되면, 나머지 5바이트를 \x05으로 채워야 한다.

    평문 예시 : key\x05\x05\x05\x05\x05

     

    문제에서는 IV와 Ciphertext가 주어지고, 이 Ciphertext는 모든 상황에서 "EF68F202594EC5756CE81682F7543221"로 바뀌지 않는다.

    공격자 입장에서는 ctest17.com 웹 서버에서 어떤 key를 이용해 AES 암호화와 복호화를 시행하는지 알 수 없지만, 오라클 패딩 공격을 시행해서 Ciphertext와 key를 이용해 만들어지는 Intermediary Value를 알아낼 수 있다.

    그러므로 문제에서 주어진 암호 블록이 유일하고 동시에 우리가 intermediary value와 initialization vector를 알고 있기 때문에, 실제 평문 값을 알아낼 수 있다.

     

    이제 실제 패딩 오라클 공격에서의 200 OK가 나타날 조건에 대해서 알아보자.

    200 OK가 나오려면, Input을 AES 복호화해서 나온 Intermediary Value와 Initialization Vector를 XOR 연산을 시행했을 때 나오는 Decrypted Value의 패딩이 반드시 맞아야 한다.

     

    이제 첫 번째 공격의 Intermediary Value와 Initialization Vector를 확인해보자.

    Vector : 000000000000000000000000000000d1 이다.

    패딩이 1바이트라고 가정했을 때, Initialization Vector의 마지막 바이트와 Intermediary Value의 마지막 바이트를 XOR 연산하게 되면 \x01이 나와야 한다.

    즉 Intermediary Value의 마지막 바이트는 \xd0 이 된다.

     

    그리고 2,3,4,5 번째 공격 각각의 Initialization Vector의 마지막 바이트는 \xdd, \xde, \xdf, \xc0이 된다. 이를 아까 구한 Intermediary Value와 XOR 연산을 하게 되면 각각 13,14,15,16이 되어서 각각 13,14,15,16 바이트의 패딩이 된다는 것을 알 수 있다. 이로써 Intermediary Value의 마지막 바이트가 \xd0이 되는것이 확실해진다.

    그리고 이를 이용해 Intermediary Value의 모든 값을 마지막 공격을 통해 알아낼 수 있다. 그 과정은 다음과 같다.

    1. Initialization Vector '8EAAB4E85CC9A00E6F6A189498838FC0'와 알려지지 않은 Intermediary Value 16 byte를 XOR 연산하게 되면 \x10 이 16 byte가 나오게 된다.

    2. 여기서 나온 intermediary value와 문제에서 주어진 IV, 즉 'CEF5EBBC009C8B27444B33818D969AD5'를 XOR 하게 되면 평문을 구할 수 있게 된다.

     

    문제 2) 공격을 통해 알아낸 평문 문자열을 쓰시오.

     

    위의 공격 과정을 통하여 평문 문자열(plaintext)를 구할 수 있다.

    공격을 수행하여 얻은 문자열은 'POODLE;9;1;\x05\x05\x05\x05\x05' 이다. 다음의 문자열에서 패딩을 제거하면 최종적으로 ‘POODLE;9;1;’이 Plaintext임을 알 수 있다.

    ----------------------------

     

    감사합니다.

    댓글

Designed by Tistory.