## 개요 --- 쉘백으로 알려진 이 아티팩트는 포렌식 수사 과정에 있어 사용자가 어떤 폴더에 접근했는지 확인할 때 주로 사용된다. 별도의 파일의 형태로 존재하는 것이 아닌, 레지스트리에 기반하여 존재하는 아티팩트이다. 따라서 레지스트리와 관련된 글을 읽고 온다면 도움이 될 것이다(~~[[Registry]]~~). 정확히는 윈도우 탐색창(Windows Explorer)과 사용자가 상호작용하는 내용에 대한 정보를 저장한다. 자세한 내용은 [[Shellbag]] 절에서 설명하도록 하겠다. 먼저 실제 케이스를 분석하는데 있어 단순 폴더 액세스에 대한 정보만을 얻어서 어떤 의미를 가질 수 있는지 잘 다가오지 않을 수 있다. 이번 글에서는 쉘백 아티팩트에 대한 자세한 이해를 통해 실제 분석에서 어떤 방식으로 사용될 수 있는지 알아보려 한다. > [!NOTE] Windows Version에 따른 차이는 없나요? > > 쉘백 아티팩트는 윈도우 XP 이전의 버전들에서도 사용되는 기능이다. 쉘백 데이터가 저장되는 경로는 각 운영체제 버젼별로 상이할 수 는 있지만, 데이터가 저장되는 개념과 기능 자체는 모든 버전에 적용할 수 있기 때문에 작성 시점에서 가장 널리 사용되는 Windows 10 관점에서 작성해 볼 예정이다. > ## 경로 ``` C:\Users\%UserName%\NTUSER.DAT (Registry Hive File) ㄴ\\Software\Microsoft\Windows\Shell\BagMru ㄴ\\Software\Microsoft\Windows\Shell\Bags C:\Users\%UserName%\USRCLASS.DAT ㄴ\\Software\Microsoft\Windows\Shell\BagMru ㄴ\\Software\Microsoft\Windows\Shell\Bags ``` User와 상호작용한 데이터이기 때문에 `NTUSER.DAT` 파일에 데이터가 저장된다. 저장된 정보를 열람하기 위해서는 `win+R` 키를 이용해 레지스트리 편집기(regedit)를 통해 키 값을 확인하거나, 다른 레지스트리 뷰어 프로그램을 이용하면 된다. 전체 디렉토리 구조와 기본 폴더에 어떤 종류의 데이터가 어떤 키값을 이용해 저장되는 지 확인할 수 있다. ![[%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2023-02-20_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_3.41.49.png]] shellbag data directory structure ![[%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2023-02-20_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_3.32.06.png]] ![[%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2023-02-20_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_3.30.16.png]] ## 데이터 포렌식 분석에 있어서 어떤 정보가 저장되는지도 중요하지만 언제, 사용자가 어떤 행위를 했을 때 저장되는지 역시 중요하다고 생각한다. 먼저 어떤 상황에서 쉘백 데이터가 생성 및 수정되는지 알아볼 예정이다. 언제 데이터가 생성되는지 파악한 다음에는 어떤 데이터가 저장되며 이를 어떤 관점에서 활용할 수 있는지 자세히 알아보겠다. ### 데이터 생성(수정) 규칙 - 윈도우 탐색기 창을 이용한 폴더 탐색 행위 - 윈도우 탐색기로 폴더를 열람하는 경우 (View) - 윈도우 탐색기로 폴더를 생성하는 경우 (Create) - 윈도우 탐색기로 폴더를 복사, 이동하는 경우 (Modify) - 윈도우 탐색기로 폴더를 삭제하는 경우 (Delete) - 윈도우 탐색기 위치, 크기를 변경하는 경우 - 파일 혹은 폴더의 속성을 윈도우 탐색기를 이용해 변경하는 경우 - GetOpenFileName API의 호출 - 윈도우 탐색기로 보기 설정을 변경하는 경우 - 정렬 순서 변경 ![[%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2023-02-20_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_4.35.22.png]] - 레이아웃 변경 ![[%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2023-02-20_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_4.31.00.png]] ### BagMRU BagMRU 하위에는 숫자로 된 폴더 구조를 확인할 수 있다. 최상위 디렉토리인 BagMRU는 Desktop 폴더를 의미한다. BagMRU 키 가 Desktop 폴더를 의미하고, 하위의 값들은 모두 Desktop 하위의 디렉토리가 아닌가? 생각할 수도 있는데 정확히 말하면 아니다. Shell Type이 Directory인 쉘백은 Desktop 하위의 디렉토리가 맞으며, 계층화된 대로 절대 경로를 구성할 수 있다. 하지만 Shell Type이 Root Folder 인 경우 새로운 루트 경로를 지정하는 것으로, 해당 경로를 시작점으로 하여 절대 경로를 구성하면 된다. > [!Question] BagMRU 하위 키 개수는 무한히 생성되나요?? > > 어느정도 예상했겠지만 물론 아니다. > 실험을 통해 확인해본 결과 0번부터 499번까지 총 500개의 숫자로 이루어진 하위 키가 생성된다. 이 때 바이너리 형태로 구성된 데이터를 Shell Item 이라고 하는데, Shell Item으로부터 어떻게 해당 정보를 파악할 수 있는지 그 구조를 파악해 보도록 하자. > [!Tip] 꿀 팁 > > 항상 느끼는거지만 아티팩트 구조체나 파일시스템 관련 구조체와 관련된 값은 Joachim Metz 라는 사람이 앵간하면 다 작성해놓은 자료가 있다. > 참고하면서 공부하면 편하다. 밑에 작성한 구조체도 아래 링크를 참조하여 작성한 것이다. > > (그대로 배낀건 아니고 추가로 몇개 실험해서 작성해 놓은 것들이 있으니 본인도 궁금한게 있다면 기존에 있던 자료에 덧붙여 실험하여 알아내 보도록 하자) > > [!info] libfwsi/Windows Shell Item format.asciidoc at main · libyal/libfwsi > Library to access the Windows Shell Item format. Contribute to libyal/libfwsi development by creating an account on GitHub. > [https://github.com/libyal/libfwsi/blob/main/documentation/Windows%20Shell%20Item%20format.asciidoc](https://github.com/libyal/libfwsi/blob/main/documentation/Windows%20Shell%20Item%20format.asciidoc) 쉘 아이템 구조체는 디렉토리 유형 지정자 값에 따라 다르게 구성된다. 통일된 유형이 아니기 때문에 각 지정자별로 모두 구조체를 분석해야 한다. 이번 글에서는 주로 사용될 만한 지정자중 디렉토리에 대한 정보를 갖는 최상위 쉘 아이템만 그 구조를 다루어 볼 예정이다. (나머지 지정자들은 추후 필요에 따라 업로드 예정이다) **일반적인 구조** |Offset|Size|Description| |---|---|---| |0x00|0x02|Shell Item 크기| |0x02|0x01|디렉토리 유형 지정자 <br>- 0x00 : Unknown <br>- 0x01 : Unknown <br>- 0x14 : 가상화 디렉토리 (WSL, 제어판 등등) <br>- 0x17 : Unknown <br>- 0x1E : CLSID_ShellDesktop <br>- 0x1F : 최상위 디렉토리 쉘 아이템 <br>- 0x2X : Volume 쉘 아이템 <br>- 0x3X : 파일 엔트리 쉘 아이템 <br>- 0x4X : 네트워크 위치 쉘 아이템 <br>- 0x52 : 압축 폴더 쉘 아이템 <br>- 0x61 : URI 쉘 아이템 <br>- 0x70 : Control Panel Task ( 실제 실험에서는 Control Panel 관련은 0x14로 나왔으니 참고)| |0x03|-|실질적인 데이터, 디렉토리 지정 유형자에 따라 가변적인 형태를 보임| |-|-|[ItemID](https://learn.microsoft.com/en-us/windows/win32/api/shtypes/ns-shtypes-itemidlist)(16bit)의 List 0x0000으로 끝을 구분| **최상위 디렉토리 쉘 아이템(0x14)** 파일 탐색기 열면 기본적으로 생성되어 있는 디렉토리들(문서, 내 컴퓨터, 휴지통, 등등…)에 대한 쉘백이다. |Offset|Size|Description| |---|---|---| |0x00|0x02|쉘 아이템 크기| |0x02|0x01|디렉토리 유형 지정자 ( 0x14)| |0x03|0x01|정렬 인덱스 <br> <br>- 0x00 : Internet Explorer <br>- 0x42 : Libraries <br>- 0x44 : Users <br>- 0x48 : My Documents <br>- 0x50 : My Computer <br>- 0x58 : My Network Places/Network <br>- 0x60 : Recycle Bin <br>- 0x68 : Internet Explorer <br>- 0x70 : Unknown <br>- 0x80 : My Games| |0x04|0x10|[쉘 디렉토리 구분자](https://github.com/libyal/libfwsi/wiki/Shell-Folder-identifiers)| - **기타 키값** - MRUListEx 접근 순서를 의미하는 필드 값이다. 4바이트 단위로 표시되며 마지막 4바이트는 0xFFFFFFFF로 구성된다. - NodeSlot 하나의 MRU에 주어지는 키 값이다. Bags 하위의 키값과 대응되는 값이다. - NodeSlots 최상위 디렉토리인 BagMRU 디렉토리에만 존재하는 키 값이다. 0x02가 반복되는 형상을 띄고 이외의 값을 가지는 경우를 보지 못했다. 값 자체에 의미가 있는 것은 아니고 0x02의 갯수가 유의미한 데이터다. 반복되는 것은 하위의 디렉토리가 생성 될 때(쉘백이 수정/생성될 때) 0x02 값이 추가되는 것을 확인했다. ### Bags Bags 하위의 키들은 BagMRU와는 달리 Leaf Node Key(최하위 키)에만 속성 값이 저장된다. 디렉토리 구조는 어떻게 저장되고, 키값이 의미하는 정보는 무엇인지 알아보자. 쉘백 아티팩트에서 디렉토리 구조는 하나의 Bag 이다. 즉 Bag 폴더 하위의 모든 Key(Folder)는 각각 다른 디렉토리를 의미하며, 해당 SubKey 안에 저장된 값들이 우리가 습득하는 메타데이터 값인 것이다. 각각의 Bag의 경우 생성되는 유형이 두가지이며 하나는 일반적인 윈도우 탐색기 창을 이용하는 “Shell” 방식이고, 다른 하나는 파일이나 디렉토리 등을 열거나 저장할 때 나타나는 다이얼로그 창을 통해 생성되는 “ComDlg” 방식이 있다. 각 유형에 따라 Bags 하위에 디렉토리가 Shell혹은 ComDlg로 생성된다. - **키값** - **ColInfo** 이름에서도 유추할 수 있듯 탐색기에서 폴더를 볼 때 상세 정보에 대한 값이다. 아래 사진처럼 윈도우 탐색기에서는 볼수 있는 세부 정보를 선택할 수 있는데 해당 키 값에서는 모든 상세 정보를 담고 있지는 않으며, 상세 정보들 중 보기 설정된 값만 표시된다. ![[Untitled 26.png]] - **FFlags** 기본 값으로 `1092616193(0x41200001)` 의 값을 가지고 있었다. 직접 실험해서 값을 변경해 보고자 했을 때, 아이콘 정렬과 같은 보기 설정을 건드렸을 때 해당 값이 변했다. FFlag 값에 대한 테이블을 찾지는 못했다. 추후에 찾으면 업데이트 할 예정이다. ![[Untitled 27.png]] - **GroupByDirection** 1(`0x00000001`)인 경우 오름차순, -1(`0xffffffff`)인 경우 내림차순 정렬을 의미한다. - **GroupByKey:FMTID** GUID 형식을 가지는 값이다. 초기값과 같이 아무 설정이 되어있지 않은 경우 모든 값이 0으로 설정되어 있다. 직접 실험해서 값을 변경해 보고자 했을 때, “분류 방법” 에 대한 설정을 건드리는 경우 그 값이 변했다. GroupByKey 값에 대한 테이블을 찾지는 못했다. 추후에 찾으면 업데이트 할 예정이다. ![[Untitled 28.png]] - **GroupByKey:PID** Hex 값으로 구성된 값이며, GroupByKey:FMTID 의 경우 설정에 대한 결과값이 저장된다면, GroupByKey:PID의 경우 PID 형식으로 어떤 설정으로 분류하는지 저장된다. PID 값에 따른 분류 기준은 다음 사진과 같다. ![[Untitled 29.png]] 엄청나게 많은 값이 있지만, 기본 값으로 표시되는 항목을 정리했다. | PID | Description | | ---- | -------------------------- | | 0x04 | 유형 | | 0x05 | 태그 | | 0x0A | 이름 | | 0x0C | 크기 | | 0x0D | 날짜 | | 0x0E | 수정한 날짜(Modified Time) | | 0x0F | 만든 날짜(Creation Time) | - **GroupView** GroupByKey 자체랑 이름이 겹치기 때문에 비슷하다. 분류 방법에 대한 Flag 값이 저장되는 필드이다. 아무 값도 지정하지 않는 경우 `0x00000000`의 값을 가진다. 특정 방법이 선택된다면 `0xFFFFFFFF`값을 가진다. - **IconSize** 지정된 아이콘 크기에 대한 값이다. 일반적으로 아이콘 크기는 다음과 같은 값을 가진다. 각 아이콘 별로 픽셀 크기가 지정되어 있다. 각 아이콘 크기에 대응되는 픽셀 값은 표에서 확인해볼 수 있다. |Icon|Size| |---|---| |아주 큰 아이콘|256| |큰 아이콘|96| |보통 아이콘|48| |작은 아이콘|16| |간단히|16| |자세히|16| |타일|48| |내용|32| ![[Untitled 30.png]] - **LogicalViewMode** 위에서 확인할 수 있는 보기 방법에 대한 ID 값이다. 보기 모드에 따른 값을 가진다. (자세한 값은 생략한다) - **Mode** 위에서 확인할 수 있는 보기 방법에 대한 ID 값이다. 보기 모드에 따른 값을 가진다. (자세한 값은 생략한다) - **Rev** Rev 라는 단어 자체가 Revision 횟수를 의미하는 값이다. 즉 각 폴더에 대한 쉘백이 수정되거나 업데이트 되었을 때 Rev 값이 변경된다. (하지만 실제 데이터로 실험했을 때 쉘백이 업데이트 됨에 따라 Rev 키 값이 변하는 경우를 찾아보지 못했다.) - **Sort** 정렬과 관련된 값이다. 오름차순의 경우 최하위 바이트가 `0x00000001`으로 설정되며 내림차순의 경우 `0xffffffff`으로 설정된다. GroupByDirection 값을 어느정도 포함한다고 생각하면 된다. - **Vid** ViewID로 보기 모드에 따른 GUID 값이다. `보기(V)` 옵션 내의 값을 선택하는 경우 각 선택별로 GUID 값이 부여도니다. 사실상 다른 값에서도 체크하는데 Cross-Check 하는데 필요한 값 정도로 생각하면 될 것 같다. ## 분석 도구 > [!info] ShellBags Explorer | SANS Institute > Download ShellBags Explorer, built by SANS Instructor Eric Zimmerman, a GUI for browsing shellbags data. > [https://www.sans.org/tools/shellbags-explorer/](https://www.sans.org/tools/shellbags-explorer/) ## 결론 쉘백 아티팩트에 대한 많은 것을 다뤄본 글이었다. 지금까지 작성한 글 중 가장 오랜 기간동안 작성한 글이기도 하다. 생각보다 별것 없을줄 알았던 쉘백 아티팩트 내에 저장되는 정보가 다양하며, 저장되는 방식 또한 생소하게 느껴질 수 있다. 이번 글을 통해 쉘백 아티팩트를 분석하는 법을 다뤄보았으며, 어떤 방식으로 저장되는지 알아볼 수 있었다. 저장되는 정보가 많고 그 구조가 복잡하기 때문에 실질적으로 레지스트리 값만을 통해 어떤 결과를 도출하는 것은 매우 어렵다고 판단되며 분석 도구에 의존할 확률이 높지만 도구가 없는 상황에서도 대략적인 구조를 알아 놓는다면 필요한 정보는 얻어낼 수 있으니 그 구조를 숙지하고 있는 것이 중요해 보인다. 도구를 통해 분석했을 때 별로 도출되는 정보가 없어 사소히 여겼던 아티팩트였지만 이번 글을 통해 꽤나 많은 내용이 저장된다는 것을 느낄 수 있었다. 그래도 사용자 행위를 분석하는데 있어 필요한 정보는 특정 폴더에 접근했다는 절대 경로를 얻어내는 것 만이 중요할 것 같다.