pwnable.kr [crypto1]

대충 해석을 해보니 AES-CBC로 암호화 되어있다고 한다. 그래서 스니핑으로 부터 안전하다고 하는데

쨌든 admin으로 로그인을 하는게 목표인듯하다.

우선 AES-CBC 암호화가 무엇인지 알아보았다.

 

참고링크 

https://blog.naver.com/sanainfo/221517009223

 

AES 암호화 알고리즘 (ECB, CBC, CFB, OFB, CTR)

블록 암호화에서의 운영 모드 이미지의 출처는 위키피디아 입니다. (http://en.wikipedia.org/wiki/Block_...

blog.naver.com

AES(Advanced Encryption Standard)

AES 알고리즘은 암호화와 복호화 과정에서 같은 키를 사용하는 대칭키 암호화 방식이다.

다양한 종류가 있는데 이 중 CBC는 다음과 같다.

 

CBC(Cipher Bloc Chaining) 모드

-보안성이 높은 방법이며 가장 많이 사용된다고 한다.

-각 블록은 XOR연산을 통해 이전 암호문과 연산되고 첫번째 암호문에 대해서는 IV(Initial Vector)가 암호문 대신 사용된다

-여기서 이 IV가 제2의 키가 될 수 있다.

-암호문이 블록의 배수가 되기 때문에 복호화 후 평문을 얻기 위해서 패딩을 해야만 한다.

-암호화가 병렬처리가 아닌 순차적으로 수행되어야 한다.

 

제공하고 있는 파이썬 코드가 두가지 있는데 client와 server이다.

 

먼저 client.py를 살펴보았다.

# guest / 8b465d23cb778d3636bf6c4c5e30d031675fd95cec7afea497d36146783fd3a1

guest의 아이디와 비밀번호 인듯하다.

 

id-pw-cookie의 포맷으로 패킷이 전달되고 있는것 같다.

그렇다면 guest의 경우에는

geust-8b465d23cb778d3636bf6c4c5e30d031675fd95cec7afea497d36146783fd3a1-cookie값

의 형식으로 전달될 것이다.

 

이 부분을 살펴보면 admin의 비밀번호를 맞추게 되면 flag를 얻을 수 있을 것 같다.

그리고 sanitize부분을 보면 아이디와 비밀번호는 모두 숫자와 영어 소문자,-,_로만 구성되고 있음을 알 수 있다.

 

이제 server.py를 살펴보겠다.

아까 전달된 패킷은 다시 -를 기준으로 분리되고 쿠키가 맞지 않으면 실패.

hashlib.sha256() : 파이썬을 이용해 sha256로 암호화를 한다.

sha256이 무엇인지는 검색이용.

참고링크

https://yeowool0217.tistory.com/536

 

파이썬으로 문자열 SHA256로 암호화 하기

SHA256이란? SHA256는 상당수 블록체인에서 가장 많이 채택하여 사용 중입니다. SHA256은 256비트로 구성되어있으며 64자리 문자열을 반환합니다. (2의 256 제곱만큼 경우의 수가 만들어집니다.) 경우의

yeowool0217.tistory.com

 

즉 admin의 pw는 admin+쿠키값을 hashlib.sha256을 이용해 암호화한 값이다.

이제 쿠키값을 찾아야 할것 같다.

 

쿠키값을 어떻게 알아내야 할까 일단 패킷 부분을 다시 분석해 보았는데

예를 들어 아이디가 testid고 패스워드가 testpassword고 쿠키를 cookie라고 가정해보겠다

16바이트 단위로 암호화 되고 있으므로

t e s t i d - t e s t p a s s w

o r d - c o o k i e 0x0 0x0 0x0 0x0 0x0 0x0

이렇게 두 블럭으로 나누어서 전달 될 것이다.

 

그렇다면 뒷쪽에 나오는 쿠키 값을 하나씩 알아내는 수 밖에 없을 듯 하다.

아이디를 15글자를 주고 패스워드 없이 전달하면 마지막 하나는 쿠키값이 올 것이다.

 

직접 하나씩 할 수는 없으므로

pwntools 모듈을 이용 해야 했는데 참고링크

https://security-nanglam.tistory.com/155

 

[python] pwntools 모듈 정리

[pwntools] pwntools 설치 - cmd[관리자 권한] 에서 pip install pwntools라고 입력해서 설치를 하면 된다. - 만약 설치가 안된다면 pip 환경변수 설정이 안되있는 것이므로 환경변수를 설정하자. [python]환경변

security-nanglam.tistory.com

 

 

사실 여기서 부터 파이썬이 돌아가다가 자꾸 멈추는 오류가 발생했는데 이유를 모르겠어서 우선 작성한 파이썬 코드를 첨부한다.

from pwn import * 
import hashlib 
context.log_level='error'
real_cookie = ''

def find_cookie(block):
    global real_cookie
    count = 13
    for i in range(0, 14):
        p = remote('pwnable.kr', 9006)
        p.recvuntil('Input your ID\n')
        p.sendline('-' * (count - i))
        p.recvuntil('Input your PW\n')
        p.sendline('')
        p.recvuntil('sending encrypted data (')
        #암호문은 블록의 배수가 되므로 + block 사이즈 만큼 바이트 읽어오기
        result1 = p.recv(16 * 2 * block)
        p.close()
        flag = False #마지막 블록을 찾기 위한 flag
        for c in '1234567890abcdefghijklmnopqrstuvwxyz-_':
            p = remote('pwnable.kr', 9006)
            p.recvuntil('Input your ID\n')
            p.sendline('-' * (count - i))
            #pw자리에 -쿠키값을 넣어줌으로써 포맷이 -로 분리되는 점을 이용
            p.recvuntil('Input your PW\n')
            p.sendline('-' + real_cookie + c)
            p.recvuntil('sending encrypted data (')
            #비교를 위한 result2
            result2 = p.recv(16 * 2 * block)
            p.close()

            if(result1 == result2):
                #쿠키값을 찾게 됨
                print ('find : ', c)
                real_cookie = real_cookie + c
                flag = True
                break

        if flag == False: #flag가 False이면 패딩에 의해서 마지막 블록임을 알 수 있음
            return False

    return True



block = 1
while True:
    print ('start block', block)
    if(find_cookie(block) == False):
        break
    
    block = block + 1


print ('cookie vlaue = ', real_cookie)

'문제풀이 > 보안 writeup' 카테고리의 다른 글

xcz.kr prob22  (0) 2021.09.06
ctf-d network DefCoN#21 #2  (0) 2021.08.27
SuNiNaTaS(써니나타스) 6번  (0) 2021.08.26
SuNiNaTaS(써니나타스) 14번  (0) 2021.08.20
hackerschool ftz : trainer 3  (0) 2021.07.30
myoskin