Wargame.kr 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.

이번 포스트에서는 dun worry about vase 문제에 대한 이해와 풀이를 진행해보도록 하겠습니다.


이번 문제는 사실 살짝 쫄아 있었는데, 생각보다 어렵지 않은 문제였습니다.


 

 문제 이해

문제에서 바로 Oracle Padding에 대해 알고 있는지 물어보고 있습니다.

이 문제를 보고 바로 걱정했던 건..


오라클 패팅으로 브루트포싱을 어떻게 할까에 대한 고민이었습니다.


일단 걱정은 접어두고 문제를 살펴봤는데,


문제에서 나타난 Session은 L0g1n이라는 세션명으로, 계속해서 바뀌는 것을 볼 수 있었습니다.

아이디와 패스워드는 guest/guest로 변함이 없는데 왜 변하는지 잠시 고민하다 내놓은 뇌피셜은,

CBC 모드로 암호화할 때 사용하는 IV가 계속 달라지는 것이 아닐까 하는 합리적 의심을 해보았습니다.


일단 변하지 않도록 쿠키값만 슬쩍해서 공격을 수행해보도록 했습니다.




 

 문제 풀이


오라클패팅에 대한 개념을 이해하고, %3D가 두 개가 보이는 것을 확인하고, ID와 PW에 대한 IV가 각각 다르구나로 생각했습니다.


일단 ID값이 5Bytes로 guest이고, PW에 들어간 값도 동일했으니, 암호문인 쿠키값의 길이를 측정해보았습니다.

Base64를 디코딩 후 길이를 재보니 각각 8바이트였습니다.


그렇다면 예상해보면 guest\x03\x03\x03과 같이 패딩이 되어 있을 것이라 생각했습니다.


이후 공격코드를 작성해서 풀이를 진행해보았습니다.


import base64

def bytesBlockXOR(block1, block2, length):
    resBlock = b''

    for idx in range(length):
        resBlock += bytes([block1[idx] ^ block2[idx]])

    return resBlock


ID          = '1h3ooS1xGJs='
PW          = 'G3jfbRJUnj4='

ID_Bytes    = base64.b64decode(ID)
PW_Bytes    = base64.b64decode(PW)

ID_IV       = bytesBlockXOR(b'guest\x03\x03\x03', ID_Bytes, 8)
PW_IV       = bytesBlockXOR(b'guest\x03\x03\x03', PW_Bytes, 8)

print('[+] ID_IV : ', ID_IV)
print('[+] PW_IV : ', PW_IV)


ADMIN_ID_ENC= bytesBlockXOR(b'admin\x03\x03\x03', ID_IV, 8)

print("[+] ADMIN ID ENCRYPTED : %s" % base64.b64encode(ADMIN_ID_ENC))

# 1h3ooS1xGJs%3DG3jfbRJUnj4%3D
# 0AzguzdxGJs=
# 0AzguzdxGJs%3DG3jfbRJUnj4%3D


일단은 ID에 대한 암호문은 구했지만 PW에 대한 암호문은 PW를 모르니....

일단 ID 암호문만 바꿔줘보자 했었는데,


ID 만 바꿔줘도 admin으로 풀리더군요.




+ Recent posts