CTF/포렌식

[2020CCE] Simple Packet - 포렌식 / Wireshark / XOR

SecurityMan 2022. 10. 26. 11:00

 

2020년에 진행된 국정원 주최 사이버공격방어대회

 

오랫동안 컴퓨터에 당시 문제들을 묵혀놨다가 이제야 풀이 포스팅을 해본다.

 

당시는 거의 이런 대회에 나가본게 처음이라, 시간에 쫒겨서 캡쳐를 제대로 못한 부분이 많다.

 

반응형

 

 

Simple Packet 문제에서는 세 가지 파일이 주어진다.

 

client.py / server.py / simple_packet.pcapng 파일이다.

 

#!python3

from socket import *
import sys

def do_xor(data):
    key = b"\x10\x07\x19"
    return bytearray([data[i] ^ key[i%3] for i in range(len(data))])

if len(sys.argv) != 2:
    print('[-] usage : {} server'.format(sys.argv[0]))
    sys.exit(-1)

host = sys.argv[1]
s = socket(AF_INET, SOCK_STREAM)
s.connect((host, 9999))
userInput = input("input : ")
s.send(do_xor(userInput.encode()))
data = s.recv(1024)
dec = do_xor(data)
print(dec)
s.close()

 

먼저 client.py 패킷의 내용이다.

 

\x10\x07\x19 3바이트를 key 값으로 해서 xor 연산을 하는 함수가 보이고,

 

사용자에게 입력을 받아 xor을 수행한 뒤 서버로 전송하는 모습이다.

 

서버는 9999번 포트를 사용하고 있고,

 

서버에서 받은 응답을 다시 xor 해서 print(dex)로 출력해준다.

 

#!python3
import socketserver

def do_xor(data):
    key = b"\x10\x07\x19"
    return bytearray([data[i] ^ key[i%3] for i in range(len(data))])

def win():
    with open('flag.txt', 'r') as f:
        return f.read()

class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        s = self.request
        data = s.recv(1024)
        ddata = do_xor(data)
        print(b'from client : ', ddata)
        if ddata == b'Hell, World':
            s.send(do_xor(win().encode()))
        s.close()

if __name__ == "__main__":
    HOST, PORT = "0.0.0.0", 9999

    try:
        socketserver.TCPServer.allow_reuse_address = True
        server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
        server.serve_forever()
    except:
        server.server_close()

 

이번엔 server.py 의 내용이다.

 

마찬가지로 \x10\x07\x19 를 xor key 값으로 사용하고 있다.

 

중간에 조건문이 보이는데,

 

client로 부터 받은 데이터가 'Hell, World' 와 일치한다면,

 

win() 함수가 실행되고 있다.

 

win() 함수는 flag.txt 파일의 내용을 읽어 출력시켜주는 역할을 한다.

 

여기서도 서버가 9999포트를 이용하고 있는것이 보인다.

 

 

마지막으로 simple_packet.pcapng 파일이다.

 

pcapng 파일은 Wireshark 라는 도구를 이용해 열어볼 수 있다.

 

 

패킷이 갯수가 그렇게 많지 않아서,

 

천천히 내리면서 살펴보면 9999번 포트와 통신한 기록을 쉽게 찾을 수 있다.

 

 

해당 패킷에서 우클릭 - Follow - TCP Stream 을 눌러주면

 

전송한 내용을 자세히 볼 수 있다.

 

 

이런 데이터를 전송한것이 보이는데,

 

아까 소스코드에서 xor을 하고 있었으니

 

다시한번 xor을 해서 복호화를 해본다.

 

 

Show and save data as 를 Raw 로 선택해서 16진수 값으로 만든 뒤

 

파란색 부분을 복사해준다.

 

 

CyberChef(https://gchq.github.io/CyberChef)에서 복사한 값을 붙혀준 뒤 From Hex, XOR 레시피를 선택하고,

 

XOR 키값에 100719를 넣어주면 플래그를 찾을 수 있다.

반응형