CTF/포렌식

[2020CCE] Keyboord - 포렌식 / Wireshark / Python

SecurityMan 2022. 10. 20. 11:00


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

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

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

 

반응형

 

 

Keyboord 문제에서는 keyboord.pcap 라는 이름의 파일이 제공된다.

 

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

 

 

Wireshark로 열어보면 이련 화면이 나온다.

 

Protocol 에 USB 라고 적혀있고,

 

문제 제목이 Keyboord 인것으로 유추해 볼 때

 

이 패킷은 USB 키보드를 사용한 통신 흔적인것을 알 수 있다.

 

 

 

와이어샤크로 USB 키보드 데이터를 분석할 때 눈여겨 봐야하는 부분은

 

Info 부분이 URB_INTERRUPT in 이라고 되어있는 패킷이다.

 

이 패킷을 보면 맨 뒷쪽에 usb.capdata 라는 부분이 있는데,

 

여기 있는 8바이트가 실제 USB 키보드를 사용해 키를 눌렀을 때 전달되는 데이터이다.

 

00 00 11 00 00 00 00 00

 

지금 위의 사진에는 이런 값이 들어있는데,

 

세번째 값만 자세히 보면 된다.

 

세번째 값은 0x11로 되어있는데, 이 부분이 바로 Keycode 이다.

 

 

0x11 은 알파벳 N을 의미하므로,

 

사용자가 N을 키보드로 입력했다는것을 알 수 있다.

 

이제 모든 패킷에서 usb.capdata 를 추출해서,

 

각 데이터가 어떤 keycode를 담고있는지 확인하면 된다.

 

 

힘들게 코드 짤 필요없이 

 

이미 누군가가 다 만들어 놓았다.

 

git clone https://github.com/TeamRocketIst/ctf-usb-keyboard-parser 명령어로 다운로드 가능하다.

 

 

ctf-usb-keyboard-parser 도구를 사용하려면 먼저 데이터를 추출해야 한다.

 

tshark 명령어를 이용해 쉽게 추출이 가능하다.

 

-r 옵션으로 불러올 패킷 파일을 지정해준다.

-T 옵션은 텍스트 출력형식을 지정하는데 fields 형식으로 지정해준다.

-e 옵션은 표시하고자 하는 필드를 지정할 수 있다.

 

추출한 데이터를 sed 명령어를 이용해 도구가 파싱하기 쉬운 형태로 만들어준다.

 

명령어 아래쪽에 실행 결과가 보인다.

 

 

> 를 이용해 keyboarddata 라는 이름의로 출력결과를 저장해줬다.

 

 

python3 usbkeyboard.py keyboarddata 형태로 입력해서 도구를 실행시킬 수 있다.

 

아래쪽에 결과가 바로 출력되는데,

 

뭔가 완벽하게 나오지 않는 모습이다.

 

하지만 문제푸는데는 크게 지장없다.

 

중요한 부분은 잡아낼 수 있으면 된다.

 

c언어로 되어있는 코드를 자세히 살펴보면

 

rawData 라는 배열에 16진수 값들을 저장하고 있고,

 

for 문을 이용해서 i 를 0부터 36까지 증가시키면서 rawData 배열의 요소들과 xor( ^ ) 을 하고있다.

 

간단하게 파이썬을 이용해서 똑같이 구현해주면 된다.

 

rawData = [0x63, 0x62, 0x67, 0x31, 0x34, 0x37, 0x36, 0x7c,0x63, 0x6c, 0x73, 0x69, 0x63, 0x62, 0x7c, 0x6b, 0x4f, 0x61, 0x73, 0x70, 0x7f, 0x70, 0x62, 0x48, 0x7d, 0x78, 0x69, 0x62, 0x43, 0x42, 0x41, 0x46, 0x45, 0x40, 0x4a, 0x02, 0x59]

flag = ''

for i in range(37):
	tmp = rawData[i] ^ i
	flag += chr(tmp)
	
print(flag)

 

이렇게 python을 이용해 간단하게 만들어 줄 수 있다.

 

 

코드를 실행시키면 플래그가 출력된다.

반응형