【TryHackMe】Room:Volatilityを解くにあたり困ったこと

## volatilityはどこにある？ 
[Volatility](https://tryhackme.com/room/bpvolatility)
無料のメモリーフォレンジックツールでありインシデント対応で利用されるVolatilityについて学ぶRoomである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/1b2219be-92c8-79c2-e4f7-090b37e0ede8.png)

Task1の本文でKali利用の場合は`apt-get install volatility`でインストールできるとあるが以下のエラーとなりインストールできない。(下はaptだがapt-getでも同様にできなかった)
```
└─$ sudo apt install volatility
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了        
状態情報を読み取っています... 完了        
E: パッケージ volatility が見つかりません

└─$ volatility -h
volatility: コマンドが見つかりません
```

環境は以下のとおり。
```
└─$ lsb_release -a
No LSB modules are available.
Distributor ID: Kali
Description:    Kali GNU/Linux Rolling
Release:        2022.4
Codename:       kali-rolling

└─$ python 
Python 2.7.18 (default, Aug  1 2022, 06:23:55) 
[GCC 12.1.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

└─$ python3
Python 3.10.9 (main, Dec  7 2022, 13:47:07) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
```

このRoomを解くだけなら上のStart AttackBoxボタンをクリックして用意された環境でやればいいのだが自マシンで解けるようにする方法を考える。

ネットで紹介されているいくつかの方法で試してみたがvolatilityをインストールすることはできなかった。
その中で見つけたのが下の２つのチートシート。
**HackTricks:** [Volatility - CheatSheet](https://book.hacktricks.xyz/generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet)
**onfvpBlog:** [Volatility CheatSheet](https://blog.onfvp.com/post/volatility-cheatsheet/)

これらを参考にこのRoomを解いてみる。

## Volatilityでメモリーイメージを調査する
Download Task Filesでメモリーイメージファイルをダウンロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/e1330a13-bfe8-50cc-eda5-c4756e6b6d09.png)

HackTricksのチートシートを参考にバイナリをインストールする。
[Installation](https://book.hacktricks.xyz/generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet#installation)
スクリーンショットにあるようにvolatility3とvolatility2がある。本来はvolatility2は非推奨のようなので入れたくないがこの問題では先に進めないので入れてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/c9dab335-890a-e90c-f5e3-e99672d82562.png)

Method1はバイナリをダウンロードする方法。下のスクリーンショットのファイルをダウンロードすると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/8f87f318-ee29-c715-bd84-a56233081959.png)

volatility_2.6_lin64_standaloneが展開される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/9adf1d8d-38fe-5a8a-40e5-1d1248dd24fe.png)
これを使ってメモリーイメージの情報を調べてみる。
```
└─$ ./volatility_2.6_lin64_standalone -f ../cridex.vmem imageinfo
Volatility Foundation Volatility Framework 2.6
INFO    : volatility.debug    : Determining profile based on KDBG search...
          Suggested Profile(s) : WinXPSP2x86, WinXPSP3x86 (Instantiated with WinXPSP2x86)
                     AS Layer1 : IA32PagedMemoryPae (Kernel AS)
                     AS Layer2 : FileAddressSpace (/home/***/TryHackMe/Volatility/cridex.vmem)
                      PAE type : PAE
                           DTB : 0x2fe000L
                          KDBG : 0x80545ae0L
          Number of Processors : 1
     Image Type (Service Pack) : 3
                KPCR for CPU 0 : 0xffdff000L
             KUSER_SHARED_DATA : 0xffdf0000L
           Image date and time : 2012-07-22 02:45:08 UTC+0000
     Image local date and time : 2012-07-21 22:45:08 -0400
```
これで良さそうだけど問題にある`volatility -f MEMORY_FILE.raw imageinfo`とは違うのでバイナリファイル名をvolatility_2.6_lin64_standaloneからvolatilityに変更して使うと今後紛らわしくなくていい。

## 別の方法
Method2はビルドしてインストールする方法。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/4eff1782-7bc2-4152-caa7-9f8b6a05e1b0.png)
この方法ではバイナリファイルはできなかったのでvol.pyを使って問題を解く。
```
└─$ ls
AUTHORS.txt    LEGAL.txt    Makefile    build    pyinstaller       setup.py  volatility
CHANGELOG.txt  LICENSE.txt  PKG-INFO    contrib  pyinstaller.spec  tools     volatility.egg-info
CREDITS.txt    MANIFEST.in  README.txt  dist     resources         vol.py
```
onfvpBlogのチートシートのコマンドを実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/4488e7e5-093e-7dd0-d178-b999e0b0a9f1.png)

```
└─$ python vol.py -f ../cridex.vmem imageinfo
Volatility Foundation Volatility Framework 2.6.1
INFO    : volatility.debug    : Determining profile based on KDBG search...
          Suggested Profile(s) : WinXPSP2x86, WinXPSP3x86 (Instantiated with WinXPSP2x86)
                     AS Layer1 : IA32PagedMemoryPae (Kernel AS)
                     AS Layer2 : FileAddressSpace (/home/***/TryHackMe/Volatility/cridex.vmem)
                      PAE type : PAE
                           DTB : 0x2fe000L
                          KDBG : 0x80545ae0L
          Number of Processors : 1
     Image Type (Service Pack) : 3
                KPCR for CPU 0 : 0xffdff000L
             KUSER_SHARED_DATA : 0xffdf0000L
           Image date and time : 2012-07-22 02:45:08 UTC+0000
     Image local date and time : 2012-07-21 22:45:08 -0400
```

これで良さそうだけどこれも問題にある`volatility -f MEMORY_FILE.raw imageinfo`の"volatility"部分を頭の中で"python vol.py"にマッピングしてコマンドを発行することを忘れずに。

## Method2の問題点
この方法で解いていったときにapihooksでエラーになってしまった。
エラーの原因は`*** Failed to import volatility.plugins.malware.apihooks (NameError: name 'distorm3' is not defined)`とあるように'distorm3'がないためだった。

`└─$ pip install distorm3`でインストールするだけなのだが自マシンではpipはpython3にしているのでpython3の環境に入ってしまいNGだったので`└─$ pip2 install distorm3`でインストールすることに注意。ただしpython2-devがない場合WheelのビルドでPython.hがないエラーになってしまうのでこれも入れておく。

```
└─$ sudo apt install python2-dev
└─$ pip2 install wheel
└─$ pip2 install distorm3
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality.                                                                  
Collecting distorm3
  Using cached distorm3-3.5.2.tar.gz (138 kB)
Building wheels for collected packages: distorm3
  Building wheel for distorm3 (setup.py) ... done
  Created wheel for distorm3: filename=distorm3-3.5.2-cp27-cp27mu-linux_x86_64.whl size=104343 sha256=02a7def7ed6e23e672fbdcb01c40a57b55d1420721a9604bfdc1ffd43f4852ce
  Stored in directory: /home/***/.cache/pip/wheels/83/31/73/653b4e3e3bbb8db3495ba943e3192fbd9f8f3015fae69886dd
Successfully built distorm3
Installing collected packages: distorm3
Successfully installed distorm3-3.5.2
```

これでapihooksが使えるようになる。
```
└─$ python vol.py -f ../cridex.vmem apihooks
```

## 結論
通常使用ならMethod1のバイナリーをダウンロードして使用する方法が手軽なのでおすすめ。
機能を拡張して利用していくならMethod2のvol.pyを使用する方法やvolatility3のコマンドを使用するのがよいと思われる。

## おまけ
ちなみにVolatilityは年末のAdventでも取り上げられていたのでご参考までに。
[Task 16 [Day 11] Memory Forensics Not all gifts are nice](https://tryhackme.com/room/adventofcyber4)