이번에 풀어볼 문제는 what did I write ???입니다. 이 문제도 풀고 나서 플래그를 보니 N0PSctf라는 ctf 대회에 출제된 문제였습니다.
문제 패킷 파일을 wireshark를 이용해서 열어보니 USB와 USBHUB라는 프로토콜로 된 패킷 파일입니다. 패킷 파일을 열어보니 host에서 request를 보내고, 다시 host로 response를 보내는 것을 반복하고 있습니다. 그 뒤에는 URB_INTERRUPT in이라는 패킷이 수천개씩 전송되었습니다. URB_INTERRUPT in이라는 패킷 중 길이가 71인 것에는 HID DATA라는 필드가 있고 길이가 101인 것들에는 Leftover Capture Data라는 필드가 있는데, 이 필드들이 USB 장치에서 보내는 정보를 담고 있는 것 같습니다.
USB와 USBHUB 프로토콜에 대해 정리해보지는 않았지만, USB 프로토콜은 USB로 연결된 장치들에서 보내는 정보들을 다루는 프로토콜 같고, USBHUB 프로토콜은 USB 허브에 연결된 USB들을 관리하는 프로토콜로 보입니다.
wireshark의 공식 홈페이지에서 usbhub 프로토콜과 usb 프로토콜에서 사용되는 값에 대해 정리한 내용을 찾아볼 수 있었습니다. wireshark의 필터 기능을 사용하면 해당 값들만 따로 필터링해서 볼 수 있는 것 같습니다. usb.capdata, usbhid.data 필터링을 적용해 Leftover Capture Data와 HID Data값을 따로 표시하겠습니다.
참고 https://www.wireshark.org/docs/dfref/u/usbhub.html, https://www.wireshark.org/docs/dfref/u/usb.html, https://www.wireshark.org/docs/dfref/u/usbhid.html
HID Data 값은 3.11.1에서 host로 보낸 패킷의 내용 중 7바이트로 이루어져 있고, Leftover Capture Data 값은 3.6.1에서 host로 보낸 패킷 내용 중 37바이트로 이루어진 데이터인것을 확인했습니다. 이 데이터가 무슨 내용을 담고 있는지를 알기 위해 어떤 USB 장치가 연결된건지 확인해야 할 것 같습니다.
USBHUB 프로토콜에서 패킷을 전송할 때마다 USB 허브에서 사용하는 Source가 달라지는데, 새로운 USB 장치를 허브에 연결하고 연결을 해제하는 과정인 것처럼 보입니다. 패킷 중 device라는 키워드가 포함된 패킷을 두 개 발견했는데, 첫번째로 나타난 패킷은 Malformed Packet이라며 데이터 내용를 확인할 수 없었고, 두번째로 나타난 패킷에서는 Device Descriptor라는 내용을 확인할 수 있었습니다. USB를 허브에 연결했는데 제대로 연결되지 않아서 허브에서 연결을 해제했다가 새로 연결하는 과정에서 나타난 패킷으로 추측했습니다.
Device Descriptor 값을 자세히 살펴보면, 0x30fa라는 제조사에서 만든 0x1440 번호의 제품인 것으로 보입니다. 이 값이 어떤 제품에 해당하는 번호인지 알기 위해 구글에 검색해보니 wuxi instant microelectronics co. ltd라는 커스텀 키보드와 마우스를 만드는 회사에서 제조한 제품으로 보이지만 커스텀 제품인 것인지 제품번호로는 정확히 어떤 제품인지 알 수 없었습니다.
참고
제조사 번호, 제품 번호로 USB 장치 찾기 https://the-sz.com/products/usbid/index.php?v=0x30FA&p=0x1440&n=
제조사 번호(VID)로 제조사 찾기 https://www.usb.org/sites/default/files/vendor_ids121720_3.pdf
제품 번호로 제품 찾기 https://usb-ids.gowdy.us/read/UD/
다음으로는 usb 장치에 대해 더 자세한 정보를 얻기 위해 패킷을 하나씩 읽어보던 중 CONFIGURATION이라는 패킷에 길이가 긴 데이터가 있는 것을 발견해 읽어봤습니다. 먼저 configuration descriptor의 내용을 보니 2개의 인터페이스를 가지고 있다고 하고, 아래에 interface descriptor, hid descriptor, endpoint descriptor가 각각 두개씩 있는 것을 보니 이 usb 장치는 마우스와 키보드를 하나의 usb 포트에서 연결해 사용하는 장치인 것으로 추측됩니다.
첫번째 인터페이스는 binterfaceprotocol 값이 mouse(0x02)라고 되어 있는것을 보아 마우스 장치고, 두번째 인터페이스는 binterfaceprotocol 값이 설명 없이 0x01로 나와있었습니다. 검색해보니 0x01은 기본 설정으로 키보드나 조이스틱 등 장치에서 사용하는 값이라고 합니다.
참고 https://blog.naver.com/jay_korea/30033163575
그리고 나서 아래의 String 패킷 정보를 확인하니 USB GAMING MOUSE, INSTANT라는 두 개의 문자열을 확인할 수 있었고, HID Report 라는 패킷에서는 마우스와 키보드 두 개의 장치가 연결되어 있다는 것을 알 수 있었습니다.
https://jeongzero.oopy.io/fad066a1-fe95-487e-a826-003aee42a0cc에서 USB 프로토콜에 대해 정리해주신 내용을 읽고 나서 문제 파일의 패킷 내용을 어느정도는 파악할 수 있었습니다. 문제 패킷 파일에서 연결된 USB 장치는 HID(human interface device)로 저장 장치 종류의 USB 장치가 아니라 마우스, 키보드, 조이스틱 등 컴퓨터에 입출력을 조작하는데 쓰이는 장치입니다. 앞서 살펴본 내용처럼 device descriptor는 configuration, interface, endpoint에 대한 descriptor를 가지고 있고, 각각에 해당하는 정보들을 담고 있습니다. usb 프로토콜로 데이터를 전송하는 방식은 bulk, interrupt, isochronous, control 타입이 있는데 문제에서는 interrupt 방식으로 데이터를 전송합니다. 이는 interrupt 방식이 주기적으로 데이터를 보내며 딜레이를 최소화하는 방식이라 마우스나 키보드 등에 쓰이기 때문입니다.
urb_interrupt in이라는 패킷의 내용을 차례로 보니 Leftover Capture Data 값은 설명이 나와있지 않지만 HID data 값은 wireshark에서 설명이 나와있어 무슨 내용인지 알 수 있었습니다. 첫번째 HID data의 내용을 보니 버튼 1~5까지가 눌려있지 않고, 마우스 포인터가 x축으로 -1, y축으로 -1만큼 움직였다는 것을 알 수 있습니다. 게이밍 마우스의 일반적인 구조를 생각해 보았을 때 버튼 1은 왼쪽 클릭, 버튼 2는 오른쪽 클릭, 버튼 3은 휠, 버튼 4와 버튼 5는 커스텀 버튼인것으로 보입니다.
계속해서 HID data의 내용만을 보기 위해 usbhid.data 필터링을 적용해 값을 확인하겠습니다. 마우스 포인터만 움직이고 버튼 조작은 하고 있지 않다가, 715번 패킷부터는 마우스의 왼쪽 버튼을 클릭한 채로 마우스 포인터를 움직이는 모습입니다. 그림판 등 프로그램 위에 마우스로 글씨를 쓰고 있는 것으로 추정됩니다.
그 후 wireshark의 패킷 텍스트로 내보내기 기능을 이용해 usbhid.data로 필터링한 데이터만 내보내고, HID Data 값만 추출한 뒤에 챗지피티의 도움을 빌려 파이썬의 pygame 모듈을 이용해 hid data에 들어있는 데이터 내용을 그림으로 옮기니 플래그를 얻을 수 있었습니다.
이번 문제를 풀면서 usb 프로토콜을 분석해봤는데 wireshark 없었으면 어떻게 풀었을까 싶습니다. 지난 문제들은 그래도 들어본 프로토콜에 대한 문제라 괜찮았는데 USB 프로토콜에 관해서 처음부터 알아보느라 지금까지 풀어본 문제 중에 제일 어렵게 느껴졌습니다. wireshark에서 패킷 정보를 자동으로 분석해서 알려주는 기능이 참 유용하고 강력하다고 생각이 듭니다. 문제를 풀면서 usb hub 프로토콜에 대해서, 그리고 Leftover Capture Data 값이 뭐였는지는 추측만 해보고 실제로 어떻게 작동하는건지 알아보지는 않았는데 시간 날때 찾아서 공부해봐야겠습니다.
'정보보안 > Forensics' 카테고리의 다른 글
[forensicscontest.com] infected (SKS 포렌식 스터디 week2) (0) | 2024.07.31 |
---|---|
[forensicscontest.com] evidence04 (SKS 포렌식 스터디 week2) (0) | 2024.07.30 |
OSI 7계층/네트워크 프로토콜 정리 (0) | 2024.07.25 |
[forensicscontest.com] evidence03 (SKS 포렌식 스터디 week2) (0) | 2024.07.24 |
[forensicscontest.com] evidence02 (SKS 포렌식 스터디 week2) (1) | 2024.07.24 |