Write-up

[CSAW 2017] Missed Registration writeup

ch4rli3kop 2017. 10. 2. 12:04
반응형

문제의 파일을 살펴보자.

위와 같은 .pcap 파일을 얻을 수 있다. 와이어샤크를 실행하여 패킷파일을 읽게 해보면, 정상적인 패킷 캡처 파일임을 알 수 있다.

일단 패킷을 살펴보자.


총 3885개의 패킷이 있고 TCP , HTTP 두가지 종류의 프로토콜을 이용하여 통신이 이뤄지고 있음을 확인할 수 있었다.

와이어샤크의 conversation 기능을 사용하여 패킷들을 살펴보았다. TCP 탭에서 TCP 로 이루어진 통신들을 볼 수 있는데, 이 통신들의 내용을 Follow Stream을 이용하여 살펴보았다. ( 위에서 HTTP 프로토콜을 사용한 흔적이 여기서 보이지 않는 것은 HTTP, TELNET, FTP, SMTP, SSH 등의 프로토콜들이 모두 TCP/IP 중 TCP 프로토콜 위에 만들어진 네트워크 프로토콜이기 때문인 것 같다. )

모든 패킷들이 다음의 형태를 띄고 있다. 여기서 붉은 색의 영역은 첫 번째 호스트로부터의 트래픽이고, 청색의 영역이 두 번째 호스트로부터의 트래픽이다. 이 패킷 파일은 클라이언트들인 첫 번째 호스트들과  서버인 두 번째 호스트 간의 통신을 캡처한 파일인 것 같다.

청색의 영역은 서버가 클라이언트들에게 보내는 트래픽으로 시간만 다를 뿐, 그 외의 부분은 모두 같다. 따라서, 우리가 여기서 눈여겨 보아야할 곳은 붉은 색 영역이다. 아스키코드의 값들로 충분히 표현가능한 글자만을 사용하여 url 인코딩이 되어있어도 읽는 데에는 지장이 없지만, 일단 인코딩이 되어있는 것을 알았으니 디코딩을 해주자.

트래픽에 이름, 학교, 전공과 같은 정보들과 라틴어 문자열이 있다. 처음 접근할 때 이 라틴어 문자열에 힌트가 숨겨져 있나 했지만, 별 특별한 내용들은 없었다. 

그렇지만, 이런 정보들의 뒷 부분을 봐보자. 헥스 값들이 가장 먼저 눈에 띄는데, 두 개의 사진을 비교해보면 뒷 부분이 뭔가 다른 것을 발견할 수 있다. 첫 번째 패킷을 살펴보면, &n=헥스 값, &x=헥스 값이 존재하는데, 두 번째 패킷을 살펴보면, &n=만 존재한다. 이 패킷 캡처 파일에는 이런 두가지 형태의 패킷들이 존재한다. 

일단 &x= 에 대한 마음 속에 싹 트는 의구심을 가지고, 뒤에 존재하는 헥스 값이 무엇을 나타낼 지 한번 생각해보자. 헥스 값이라 하면, 파일의 헥스 값을 나타내는 것일 수도 있고, 헥스 값으로 인코딩된 다른 형태의 값일 수도 있다. 

헥스 값을 디코딩해보았지만, 특별한 것을 발견할 수 없었다. 저 헥스만을 추출하여 파일을 생성해 보았지만, 정상적인 파일이 아니였다. 물론 그 사실은 일반적인 파일 시그니처를 가지지 않는다는 것에서부터 알 수 있다. 파일이 짧기도 하여, 혹시나 전체 패킷들에 있는 헥스 값들이 모아져 파일을 생성하는 것은 아닐까 하고 접근할 수 있다. 정상적인 파일인지 아닌지는 보통 파일 시그니처를 통하여 확인할 수 있기 때문에, 맨 첫 번째 패킷 혹은 마지막 패킷(마지막 패킷의 헥스 값부터 파일의 헥스 값을 이루는 경우가 있을까봐)을 살펴보았다.

그런데, 첫 번째 패킷의 의심을 가지고 있던 x 부분에서 bmp 파일의 시그니처를 확인할 수 있었다. 이로써 헥스 값이 파일의 헥스 값을 나타내는 것이 아닐까하는 가설에 힘이 더해졌다. 다음할 작업은 이 패킷 캡처 파일에서 확인할 수 있는 모든 &x= 뒤의 헥스 값들을 모아 하나의 파일로 만드는 것이다.

이 작업을 수행하기 위해 dpkt라는 툴을 처음 써보았다. 난생 처음 접하여, 어떻게 사용하는 것인지 잘 몰랐지만 예제를 보며, 실제로 테스트해보면서 조금씩 익힌 것 같다. (dpkt 툴 사용에 대한 포스팅은 차후에 올릴 예정이다.)


import dpkt
f=open("./cap.pcap")
pcap=dpkt.pcap.Reader(f)
result=open("flag.bmp","w")
flag=""

print "[ ] Making Flag ****"

for timeStamp, packetData in pcap:
if packetData.find("&x=")!=-1:      # find는결과 값이 없을 경우 -1을 출력
flag=flag+packetData[packetData.find("&x=")+3:].decode('hex')

print "[*] Complete!"

result.write(flag)


다음과 같이 짠 py 파일을 실행시키면



다음과 같이 bmp 파일이 생성된 것을 확인할 수 있다. 이 파일을 열어보면,


플래그 값을 얻을 수 있다.


후기 : dpkt 툴 사용법을 익히게 되었는데, 그동안 너무 gui 환경의 와이어샤크에만 의존했던거 같다.(그나마도 잘하는 건 아니지만) 아무튼 cli 기반의 툴들이 더 강력하던데, 그런 사용법들을 더 많이 익혀야겠다.


반응형