Forensic

[Forensic] USB 패킷 분석 (wireshark) / What did I write??? - Network

Papya_j 2024. 7. 29. 22:46

capture.pcapng
1.31MB

 

스터디에서 자체 제공하는 파일이다. 이 파일을 분석해서 What did I write??? 를 알아보겠다.


* pcapng

처음 보는 파일 확장자명이 등장했다. pcap의 다른 버전이라 생각돼서 이거 먼저 찾아보았다.

pcapng (PACP Next Generation)

 

기존의 pcap을 발전시킨 파일 형식이다. 기존 pcap과 비교하여 패킷 캡처를 한 인터페이스 정보, 주석, 이름 확인 정보 등 더 많은 메타데이터가 추가되었다.

 

파일의 시그니처도 기존 pcap과 다르다. 기존의 pcap 파일의 시그니처가 D4 C3 B2 A1 이라면, pcapng 파일의 시그니처는 0A 0D 0D 0A 이다.

 

 출처 : https://chp747.tistory.com/55

 

HxD로 분석해보아도 file header signature가 0x0A0D0D0A인 것을 확인할 수 있다.

 

Wireshark로도 충분히 열리고 pcap으로의 변환도 가능한 파일 확장자명이라고 한다.


[Write Up]

Wireshark 프로그램을 통해 파일을 열어보았다. host와 다른 IP가 서로 통신하면서 주고받은 패킷이 보였는데 Protocol이 특이했다. USB 혹은 USBHUB로 나타나 있어서 일반적으로 알던 여타 다른 pcap파일과는 차이점을 보였다.

+ (통계 -> 대화) 로 가서 확인해봐도 따로 뜨는 정보들이 없다. / 따라가기 조차 클릭이 불가능했다.

 

USB에 대한 패킷 분석 방법이 따로 있을 것 같다. 


[USB 패킷 분석]

USB protocol?

로컬 컴퓨터와 USB 사이의 통신 내용을 패킷으로 잡을 때 사용되는 것.

 

  • USB(Universial Serial Bus) 는 각각 디바이스들끼리 직접 소통을 할 수 없다.
  • 그래서 클라이언트 드라이버는 통신을 주고 받기 위해 URB(USB request block)을 사용한다.
  • URB 는 요청과 해당 내용에 관한 정보를 담고 있는 구조체 형식으로 구성되어 있다.
  • USB 패킷 필드는 Sync Field, Packet Identifier Field, Address Field, Endpoint Field, Data Field로 구성된다.

USB protocol에서 사용되는 통신 유형

 

1. Control Transfer : 호스트가 장치에 명령을 전송하거나, 장치 설정 정보 요청 시 사용 (장치 초기 설정)

2. Interrup Transfer : 소량의 데이터를 자주 보내야 할 때 사용 (키보드, 마우스)

3. Bulk Transfer : 대용량 데이터 전송에 사용 (프린트, 대용량 데이터)

4. Isochronous Transfer : 데이터의 실시간 전송에 사용 (음악, 영상 스트리밍)


처음부터 분석해보겠다.

맨 처음에 USB 장치가 연결되면  USB transfer type : URB_CONTROL 로 되어 있는 것을 확인할 수 있다.

Host가 가장 먼저 연결된 장치에 설정 정보를 보내라는 Request가 실행된다.이후 Response가 실행되어 장치가 Host에게 정보를 전송한다. 이러한 일련의 과정이 URB_CONTROL 타입에서 실행되며 이는 초기 설정 단계이고 장치와 Host가 송수신을 할 준비를 하는 과정임을 알 수 있다.

 

이 후 다음 7번째 패킷을 보면 위 사진에서 나타난 것 처럼 URB_INTERUPT in 부분에서 USB URB 패킷에 "Leftover Capture Data : 8000" 이 있는 것을 확인할 수 있다. 이 캡쳐 데이터로 어떤 데이터가 전송되고 있는지를 확인할 수 있다.

 

이를 봤을 때 USBHUB를 통해 송수신에 관련된 Request와 Response를 진행한다.

USB protocl을 통해 실질적으로 Capture Data에 관련된 데이터 내용을 전달받는 다는 사실을 확인할 수 있었다.

 

따로 Capture Data 부분만 필터시켜서 찾아보겠다.

'usb.capdata' 부분만 필터시켜 찾아보니 해당 101의 길이를 가진 Capture Data가 존재하는 것을 알 수 있다.

그러나 Capture Data만 봤을 때 유의미한 결과가 나오지 않았다. 01 04만 있거나 01 04 00 2b만 있어서 이것이 무엇인지조차도 모르겠고, 유의미하다고 판단되지 않았다.

 

단서를 하나 더 획득할 수 있었다. bString에 USB GAMING MOUSE가 적힌 것을 보았다. 마우스를 가지고 어떤 작업을 했구나를 알 수 있었다.

 

 

여기 이후로 막혔다. 어떻게 해야할지 감도 안와서 많이 찾아보았다.


https://jeongzero.oopy.io/fad066a1-fe95-487e-a826-003aee42a0cc

 

usb 프로토콜 분석

1. USB란?

jeongzero.oopy.io

USB에 대한 정리 사이트이다. 진짜 자세하게 모든게 다 정리되어 있어서 참고를 많이 했다.

글을 참고하던 도중 HID라는 것을 발견하게 되었다.

HID (Human Interface Device)

Human Interface Device란 컴퓨터 주변 기기 중 사용자 인터페이스를 담당하는 것을 뜻한다. 대부분은 인간으로부터 입력을 받으며, 일부는 출력 기능을 갖추기도 한다. 한편 HID라는 용어는 대개 USB의 장치 규격 중 하나인 USB 인간 인터페이스 장치 유형을 가리킨다.

 

출처 : wikipedia

HID 또한 Interrupt Transfer 타입이며 키보드, 마우스, 조이스틱 등등이 있다는 것을 알게 되었다.

 

와이어샤크 상단 바에서 (편집 -> 설정 -> 모양 -> 열) 에 들어가서 하단에 + 버튼을 누르고 우리가 살펴볼 Leftover Capture Data에 더불어 HID data를 추가시켰다.

* 필드에 정확한 값을 넣어야 됨. 필드값에 대응되는 것을 나타내기 때문.

해당 와이어샤크의 공식 홈페이지에 들어가면 원하는 Discription에 따른 Field name을 얻을 수 있다.

-> usb.capdata : https://www.wireshark.org/docs/dfref/u/usb.html

-> usbhid.data : https://www.wireshark.org/docs/dfref/u/usbhid.html

 

이후 필터를 usbhid.data 로 설정한 후 그에 해당되는 data만 살펴 보았다.

맨 처음 적용된 패킷은 76번째 패킷에 대한 정보이다. 이 후 나오는건 다 10000번대이기 때문에 이건 좀 다른 형식의 HID임을 알 수 있었다. ctrl, shift, alt 등의 정보들이 있는 것으로 보아 키보드임을 알 수 있었다.

 

이후 나타나는 패킷들은 전부 마우스에 해당되었다.

Button 1~5까지는 각각 마우스의 클릭 버튼이었는데 각각 1 : 왼쪽 클릭 / 2 : 오른쪽 클릭 / 3 : 마우스 휠 / 4, 5 : 커스텀 인 것으로 추측할 수 있었다.

위 패킷은 왼쪽 클릭을 유지한 상태로 X축과 Y축으로의 이동을 나타낸 것이다.

 

사용한 필터 command : usbhid.data && frame.len == 71

 

이 부분에서 X Axis, Y Axis만 따로 추출하여 쭉 이었을 때 하나의 이미지가 나오지 않을까 추측해볼 수 있었다.

 

Wireshark 상단바에 (파일 -> 지정된 패킷 내보내기) 후 filter했던 것만 Displayed가 되어있기 때문에 이대로 저장해보았다.

 

여기서 추출한 파일을 어떻게 정리해서 이미지화 시킬지에 대해 찾아보았다.

+ 찾아보니 tshark를 이용해야 된다고 한다.


* 실패

tshark -r HIDpacket_cat.pcapng -T fields -e usbhid.data > HID.txt

 

했더니 빈 화면만 출력된다. 이유를 도저히 모르겠어서 추출한 패킷을 다시 wireshark로 열어보았다.

 

확인해보니 Data Type이 Leftover Capture Data로 변한걸 확인할 수 있었다. (이유가 뭐지?)

그래서 이를 반영해서 다시 추출해야 했다.


다시 돌아와서

tshark -r HIDpacket_cat.pcapng -T fields -e usb.capdata > HID.txt

를 실행시켰다. (WSL Linux환경에서)

 

이러한 폴더가 나왔는데 여기서 우리가 필요한 마우스 움직임만 취한 후에 이를 이미지화 시켜야 했다.

 

그림을 그릴 때는 파이썬 환경에서 colab 사이트를 사용했으며 pygame모듈을 사용하여 gpt에게 코드를 짜달라고 얘기했다.

 

처음 코드를 실행시켰을 때 위처럼 나온다. 전혀 알 수 없는 선들이 나왔는데 생각해보니 Little Endian을 고려하지 않았음을 인지했다.

 

+ 주의할 점이 몇가지를 더 생각해보았다.

 

1. 마우스가 클릭이 되었는지 안되었는지

2. 어느 방향으로 움직였는지

3. Little Endian 방식인지

위 그림을 봐도 Button 1이 작동했을 때 1로 바뀌면서 DOWN으로 되지만 작동하지 않았을 때는 0으로 설정된다.

 

 

실패작 중 하나였다. 선들이 쭉 이어진 것을 보았을 때 클릭을 했고 안했고를 고려하지 않았음을 깨달았고 다시 gpt를 통해 코드 수정을 했다.

 

 

그 결과 정상적으로 출력되는 것을 알 수 있었다.

 

✨ 정답 : NOPS{mOUs3_dR4w1Ng}

[파이썬 코드 블럭] - colab

import pygame
import sys
from matplotlib import pyplot as plt
from PIL import Image

# Function to parse a single HID data line in Little Endian format
def parse_hid_line(line):
    x_axis = int(line[6:8] + line[4:6], 16)
    y_axis = int(line[10:12] + line[8:10], 16)
    
    # Converting to signed values if necessary
    if x_axis > 32767:  # Check if x_axis is in the upper half of 16-bit range
        x_axis -= 65536  # Convert to signed 16-bit integer
    if y_axis > 32767:  # Check if y_axis is in the upper half of 16-bit range
        y_axis -= 65536  # Convert to signed 16-bit integer
    
    return x_axis, y_axis

# Function to check if the HID data represents a mouse click (Button 1 down)
def is_mouse_click(line):
    return line[0:2] == "01" and line[3] == "1"  # Assuming "01" in the beginning and bit 0 indicates Button 1 down

# Read the HID data from the file
file_path = '/content/HID.txt'  # Update the path to your file
with open(file_path, 'r') as file:
    hid_data = file.readlines()

# Process the data
movements = []
click_positions = []
is_drawing = False
for line in hid_data:
    if len(line.strip()) >= 12:
        x_movement, y_movement = parse_hid_line(line.strip())
        if is_mouse_click(line.strip()):  # Check for click
            is_drawing = True
        else:
            is_drawing = False
        
        movements.append((x_movement, y_movement, is_drawing))

# Convert movements to a cumulative position list
width, height = 3200, 2400
positions = [(width // 2, height // 2)]
for move in movements:
    new_position = (positions[-1][0] + move[0], positions[-1][1] + move[1])
    positions.append(new_position)
    if move[2]:  # Only add to click_positions if drawing
        click_positions.append(new_position)

# Initialize pygame
pygame.init()
window = pygame.Surface((width, height))

# Colors
background_color = (255, 255, 255)
line_color = (0, 0, 255)

# Clear the screen
window.fill(background_color)

# Draw the movements
for i in range(len(positions) - 1):
    if movements[i][2]:  # Draw only if it was a drawing movement
        pygame.draw.line(window, line_color, positions[i], positions[i + 1], 2)

# Save the pygame surface as an image file
pygame.image.save(window, "/content/mouse_movements.png")

# Quit pygame
pygame.quit()

# Display the saved image using matplotlib
img = Image.open("/content/mouse_movements.png")
plt.figure(figsize=(20, 15))
plt.imshow(img)
plt.axis('off')
plt.show()

<소감>

상당히 어려웠다. USB protocol이라는 것 자체가 난감했고, 새로운 개념들을 많이 찾아보고 알아야 했다.

Wireshark의 기능 또한 상당하다는 것을 알게 되었다.

HID에 대해서도 알게 되었고, filter를 적용시키는 능력도 올라간 것 같다.

 

다만 아직 이해를 못한 부분이 여럿 존재했다. Leftover Capture Data는 어떤 것을 의미하는지, Protocol 간의 type에 있어서 어떤 연결이 있었는지 등에 대해서는 이해가 아직 부족했다.

 

아직 공부할 부분이 많이 있다는 것을 깨달았고 나중에 더 자세히 살펴봐야겠다는 생각이 들었다.

 

<의문점 및 더 봐야할 것 같은 점>

- Leftover Capture Data가 의미하는 것은?

- 실제로 많은 Packet이 존재하는데 장치가 연결이 되는 과정들은 어떻게 보는지?

- 어떤 과정으로 연결되었는지?

- 각 Transfer에 해당되는 것들이 실제 패킷에서 어떤 역할을 했는지?

- 이미지화 시킬 때 왜 Little Endian으로 해야되는지?

 

 

참고

https://whitesnake1004.tistory.com/686

https://chp747.tistory.com/55

https://note-ing.tistory.com/24

https://leehojune.tistory.com/9 (같은 스터디를 하시는 분인데 너무 잘 설명해놓으셔서 큰 도움이 됐다. 감사드립니다.)