쉬움 난이도였던 패킷 포렌식 문제
하지만 개인적으로 어려웠다.
자기들이 가지고 있는 기계에서 이상한 통신을 발견했다고 한다.
strangetrafficchallenge.pcap 파일이 주어지고, 다른 문제랑 다르게 힌트도 있다.
힌트를 열어보면 alt,esc,1,2,3,4,5,6,7,8,9,0,-,=,backspace,tab,q,w, ... 라고 적혀있다.
Wireshark로 pacp 파일을 열어볼 수 있다.
이번 대회에서 ICMP 부터 TCP 이번엔 UDP 까지 패킷들이 참 다양하게 나오는거 같다.
(ICMP : https://hackingstudypad.tistory.com/75)
(TCP : https://hackingstudypad.tistory.com/76)
패킷은 총 56개로 많이 없는편이다.
하나씩 살펴보다 보면 중요한 차이가 보이는데
패킷의 맨 끝자리 값이 계속 바뀐다는것이다.
예를들어 1번 패킷의 경우 맨 끝자리가 31인 반면
2번 패킷은 맨 끝자리가 35이다.
중간에 있는 값들도 다르긴 하지만 그건 시간이기 때문에 크게 중요하게 생각하지 않았다.
일단 전체 패킷에서 데이터를 모아보기로 했다.
일단 데이터를 추출하기 위해서 tshark를 이용한다.
tshark는 Wireshark의 커맨드라인 버전이라고 생각하면 된다.
tshark는 칼리 리눅스를 설치하면 안에 내장되어 있다.(https://hackingstudypad.tistory.com/58)
tshark 명령어로 실행 가능하며
-r 옵션으로 불러올 패킷 파일을 지정해준다.
-T 옵션은 텍스트 출력형식을 지정하는데 fields 형식으로 지정해준다.
-e 옵션은 표시하고자 하는 필드를 지정할 수 있다. -T 옵션과 같이 쓰이는데 data.data 필드를 지정했다.
필드 이름은 Wireshark에서 확인할 수 있다.
추출하고 싶은 부분을 선택하면, 프로그램 맨 아래쪽에 저런식으로 필드명이 출력된다.
추출하면 UDP 패킷이다보니 위에 보이는것처럼 hex값 그대로 출력이 된다.
조금 가공이 필요하다.
리다이렉션(>)을 통해서 data파일에 추출한 값들을 저장시켜 준다.
그러면 data파일에 이렇게 출력값들이 저장되게 된다.
이제부터 본격적으로 코딩을 하면 된다.
f = open('data', 'r')
string = ''
for i in range(1,56):
line = f.readline()
line = line[51:52] + line[53:54]
string += line + ' '
print(string)
open으로 data파일을 열어서 f에 저장한다.
f.readline() 으로 한줄씩 읽어들어와 맨 뒤에 있는 값을 추출한다.
hex값으로 되어있기때문에 저런식으로 추출하는데
첫번째 줄을 예로 들면 576564204d61722032332031333a30323a31312032303232203331 라는 값이 있는데
맨 뒤에 있는 33 31은 ascii 코드로 각각 '3' '1'을 의미한다.
line[51:52] + line[53:54] 은 맨 뒤에 두 hex값에서 이렇게 숫자를 추출하기 위해 사용한 것이다.
위 코드를 실행시키면 이렇게 숫자들이 출력되게 된다.
그런데 지금 출력된 이 숫자들은 아무리 봐도 ascii 코드가 아닌것 같았다.
무슨 새로운 암호인가.. 고민하다가 맨 앞에서 봤던 힌트를 떠올렸는데
alt,esc,1,2,3,4,5,6,7,8,9,0,-,=,backspace,tab,q,w, ...
맨 앞에 alt는 뭔지 모르겠고 그걸 제외하고 esc부터 보면 키보드 배열을 한줄로 써놓은거 같았다.
왼쪽 위부터 esc, 1, 2, 3, 4, ~~ backspace 까지
그리고 tab 부터 q, w, e ,r ~~ 이런식으로 나열한 것이다.
그래서 키보드 배열 순서에 따라서 넘버링을 해줬다.
esc는 1번, 1키는 2번, 2키는 3번 ... 이런식으로 말이다.
f = open('data', 'r')
keycode = {
"1": "esc",
"2": "1",
"3": "2",
"4": "3",
"5": "4",
"6": "5",
"7": "6",
"8": "7",
"9": "8",
"10": "9",
"11": "0",
"12": "-",
"13": "=",
"14": "backspace",
"15": "tab",
"16": "q",
"17": "w",
"18": "e",
"19": "r",
"20": "t",
"21": "y",
"22": "u",
"23": "i",
"24": "o",
"25": "p",
"26": "[",
"27": "]",
"28": "enter",
"29": "caps",
"30": "a",
"31": "s",
"32": "d",
"33": "f",
"34": "g",
"35": "h",
"36": "j",
"37": "k",
"38": "l",
"39": ";",
"40": "'",
"41": "#",
"42": "shift",
"43": "\\",
"44": "z",
"45": "x",
"46": "c",
"47": "v",
"48": "b",
"49": "n",
"50": "m",
"51": ",",
"52": ".",
"53": "/",
"54": "ctrl",
"55": "win",
"56": "alt",
"57": " ",
"58": "alt",
"59": "win",
"60": "menu",
"61": "ctrl",
}
string = ''
for i in range(1,56):
line = f.readline()
line = line[51:52] + line[53:54]
string += keycode[line]
print(string)
코드를 이렇게 수정했다.
keycode라는 dict를 하나 만들어서 키보드의 왼쪽 위부터
오른쪽 아래까지 순서대로 쭉 넘버링을 했다.
해당 코드를 실행시키면 플래그를 획득할 수 있다.
정제되지 않은 상태로 출력되는데 'shift[' 와 'shift]' 는 각각 '{' 과 '}'로 치환해주면 된다.
'CTF > 포렌식' 카테고리의 다른 글
[TGHACK] poke - 포렌식 / 스테가노그래피 / stego-lsb (74) | 2022.04.14 |
---|---|
[TGHACK] s2s messaging - 포렌식 / Wireshark (42) | 2022.04.14 |
[Space Heroes CTF] Interstellar Mystery - 포렌식 / Strings (32) | 2022.04.09 |
[Space Heroes CTF] Buzz's Secret Watch (Part 1) - 포렌식 / Binary (56) | 2022.04.08 |
[Space Heroes CTF] Future Stego - 포렌식 / 스테가노그래피 / steghide (40) | 2022.04.07 |