'codegate2018'에 해당하는 글 1건

주니어부 12시간 중 10시간을 뺏어 가고 결국 시간내에는 못 푼 흑흑


우선, 문제 분류는 암호학(Crypto)입니다.



그리고 파일을 받아보면 pcap파일과 py파일이 나오죠


각각의 파일을 알아야 할 것 입니다.

우선 파이썬 코드 부터 봅시다.
from socket import *
from ssl import *
import time

def recv_until(s, string):
    result = ''
    while string not in result:
        result += s.recv(1)
    return result

client_socket=socket(AF_INET, SOCK_STREAM)
tls_client = wrap_socket(client_socket, ssl_version=PROTOCOL_TLSv1_2, cert_reqs=CERT_NONE)

print "[+] Connecting with server.."

tls_client.connect(('ch41l3ng3s.codegate.kr',443))

print "[+] Connect OK"

while 1:
    data = recv_until(tls_client, "Input : ")
    print data
    #message
    user_input = raw_input()
    
    if user_input == "u":
        print "Sorry.. Not support function.."
        exit()
    elif user_input == "d": 
        tls_client.send("6423e47152f145ee5bd1c014fc916e1746d66e8f5796606fd85b9b22ad333101\n")
    elif user_input == "r":
        tls_client.send("34660cfdd38bb91960d799d90e89abe49c1978bad73c16c6ce239bc6e3714796\n")
    elif user_input == "l":
        print "Sorry.. Not support function.."
        exit()
    else:
        print "Invalid input!"
        exit()    

client_socket.shutdown(SHUT_RDWR)
client_socket.close()

우선 SSL통신을 하네요.

그리고 입력값에 따라 값을 보내고요.

하지만 u일 때와 l일 때에는 값을 보내지 않아요.


아마 저 값을 찾아야 플래그를 얻을 수 있을 것 같군요.


이제 pcap파일을 봅시다.

아주 짧은 캡처 파일 이군요. 그리고 모든 패킷이 암호화 되있다는 것을 알 수 있습니다.

저 패킷들을 모두 복호화 하면 답을 알 수 있겠군요!


이제부터 저것들을 복호화하기위한 RSAkey를 얻어 봅시다.


6번 패킷에서 공개키를 포함하고 있는 인증서를 주는 군요. 우선 인증서를 받아 옵시다.


이렇게 해서 확장자를 .der로 바꿔주시면 인증서가 완성됩니다.


인증서는 이렇습니다.


이제 이 인증서에서 공개키를 추출해 냅시다.

openssl을 통해 공개키를 추출했다면 이제 거의 다 온 것입니다.



우리가 필요한 것은 개인키인데 공개키를 받아서 무엇하느냐?

이 공개키를 이용해서 개인키를 얻어 낼 겁니다.


여기서 사용할 것은 RsaCtfTool입니다.

https://github.com/Ganapati/RsaCtfTool

하지만 저는 이것을 그대로 쓰지 않을 것입니다.

이것을 받은 뒤 저희가 할 것은

RsaCtfTool.py를 수정 할 겁니다.


이 툴은 값을 찾는 순간 다른 값을 안 찾고 넘어가게 되는데 값을 찾는 방법 중 db에서 받아오는 것이 존재 합니다. 하지만 저희가 찾는 개인키는 db에 존재하지 않으므로 그 부분을 주석처리 해야합니다. 

이렇게요.

함수를 정의하는 부분과 리턴을 남겨둔 이유는 이 함수를 호출 했을 때 함수가 없으면 오류 나기 때문입니다.


그리고 한 곳 더 고쳐야 할 곳이 있습니다.

소수쌍을 찾아서 푸는 것을 시도 하는 부분이 있는데 이 툴은 그것의 제한시간을 60초 즉 1분으로 해두었습니다. 하지만 1분안에 찾아지는 소수쌍은 얼마 없지요. 그렇기 때문에 이 제한시간도 늘려야 합니다.

이부분을 

이렇게 고쳐 줍시다. 즉 1시간 정도로 넉넉하게 시간을 주는 것이죠.


이제 준비는 끝났습니다.

./RsaCtfTool.py --publickey ~/pubkey.pem --verbose --private

를 입력해서 개인키를 알아 냅시다.


약 5분 정도 기다리면 개인키를 알려줍니다.


이것을 와이어 샤크에 넣어주면!


u일 때와 l일 때의 값을 알게 됩니다. 이제 파이썬 코드를 수정합시다.

from socket import *
from ssl import *
import time

def recv_until(s, string):
    result = ''
    while string not in result:
        result += s.recv(1)
    return result

client_socket=socket(AF_INET, SOCK_STREAM)
tls_client = wrap_socket(client_socket, ssl_version=PROTOCOL_TLSv1_2, cert_reqs=CERT_NONE)

print "[+] Connecting with server.."

tls_client.connect(('ch41l3ng3s.codegate.kr',443))

print "[+] Connect OK"

while 1:
    data = recv_until(tls_client, "Input : ")
    print data
    #message
    user_input = raw_input()
    
    if user_input == "u":
        tls_client.send("9de133535f4a9fe7de66372047d49865d7cdea654909f63a193842f36038d362\n")
    elif user_input == "d": 
        tls_client.send("6423e47152f145ee5bd1c014fc916e1746d66e8f5796606fd85b9b22ad333101\n")
    elif user_input == "r":
        tls_client.send("34660cfdd38bb91960d799d90e89abe49c1978bad73c16c6ce239bc6e3714796\n")
    elif user_input == "l":
        tls_client.send("27692894751dba96ab78121842b9c74b6191fd8c838669a395f65f3db45c03e2\n")
    else:
        print "Invalid input!"
        exit()    

client_socket.shutdown(SHUT_RDWR)
client_socket.close()

이걸 파이썬으로 실행시킨뒤 목적지에 도달하면 플래그가 나오게 됩니다.

'포렌식 관련(네트워크 포함)' 카테고리의 다른 글

2013 Codegate Forensic 100  (0) 2017.12.12
2014 Codegate Forensic 150 풀이  (1) 2017.12.11

WRITTEN BY
Dukup11ch1
무근본, 실력 0, 아는척하기위한 블로그. 저는 귀엽습니다

,