DFIR用のツール「Velociraptor」を使用してみる

#Velociraptor とは
アーティファクトを収集し、指定したサーバにアップロードする
👉[公式サイト](https://www.velocidex.com/)
開発者SANSの講師っぽい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/c3754dd3-4109-b57b-7470-290707f0bbde.png)

## 一般的なデジタルフォレンジックの一例
保全した端末でアーティファクトを収集するツールを実行し、HDD/SSD等の外部記憶媒体または、クラウドストレージにコピーし、調査用のPCで解析を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/f16bcef6-24fb-1f21-c046-1fc15333d7be.png)


## Velociraptor の場合
予め生成したコンフィグをもとに実行ファイルを保全PC内で実行し、Velociraptorサーバで操作を行うことで<font color="red">パースされたアーティファクト</font>がアップロードされる
解析作業を行う人はWEB GUI上で操作を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/1420dd0b-88a7-8a16-ba45-c219db12ac92.png)


## ライセンス
👉[GNU Affero General Public License](https://github.com/Velocidex/velociraptor/blob/master/LICENSE)
商業利用できそう
👉[AGPL](https://ja.wikipedia.org/wiki/GNU_Affero_General_Public_License)について

# 動作検証
## 動作環境
ソフトウェアバージョンは2020年2月25日時点で最新の👉[v0.3.9](https://github.com/Velocidex/velociraptor/releases/tag/v0.3.9)を使用します

サーバ
- Linux Mint 19.1

クライアント
- Windows10 Pro


## セットアップ
```bash
$ wget https://github.com/Velocidex/velociraptor/releases/download/v0.3.9/velociraptor-v0.3.9-linux-amd64
$ mv velociraptor-v0.3.9-linux-amd64 velociraptor 
$ chmod +x velociraptor
$ ./velociraptor config generate -i
? 
Welcome to the Velociraptor configuration generator
---------------------------------------------------

I will be creating a new deployment configuration for you. I will
begin by identifying what type of deployment you need.

  [Use arrows to move, type to filter]
> Self Signed SSL
  Automatically provision certificates with Lets Encrypt
  Authenticate users with Google OAuth SSO

とりあえずオレオレ証明書

? Enter the frontend port to listen on. 8000
? What is the public DNS name of the Frontend (e.g. www.example.com): 10.0.2.12※各自の環境に合わせて
? Path to the datastore directory. /tmp
? Path to the logs directory. /tmp
? GUI Username or email address to authorize (empty to end): testuser
? Password *****
? Where should i write the server config file? server.config.yaml
? Where should i write the client config file? client.config.yaml

とりあえずtestuserとパスワードを作成
するとserver.config.yamlとclient.config.yamlが作成される
```

<font color="red">**client.config.yaml**</font>を共有フォルダ等を使用しコピーしておきましょう
WEB GUIをlocalhost以外からアクセスする場合bind_addressの変更

```server.config.yaml
GUI:
  bind_address: 127.0.0.1
  bind_port: 8889
👇例
GUI:
  bind_address: 0.0.0.0
  bind_port: 8889
```
実行

```bash
$ ./velociraptor --config server.config.yaml frontend -v
```

ブラウザで「```https://10.0.2.12:8889```」を開きます※各自の環境に合わせて
オレオレ証明書なので「安全な接続ではありません」が無視して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/9d937788-f192-439e-3fdb-2c7eb6316ae4.png)

認証画面になりさきほど作成したアカウントを入れます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/c58bcbfb-6b41-b1b2-6233-c625b02662ca.png)

この画面になればサーバ側の設定は一旦終わりです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/64833f0c-f990-cd5b-b07a-f44247229365.png)


## 検証①
### インシデント内容
```
Maldocを開いてしまいEmotetに感染してしまった
```
適当に[any.run](https://any.run/)のPublic submissionsから「emotet」でタグ検索をかけて検体をダウンロードしましょう
👉[検体](https://app.any.run/tasks/dc1a3841-8364-4b82-92ba-446f07f33992/)今回はこれを使います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/b2c6002a-77f0-561a-e062-65fce7db77f7.png)

Enable Contentをクリックし実行します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/29f25ae9-d94c-c10d-828f-8beebd59f76c.png)

👉[Velociraptor](https://github.com/Velocidex/velociraptor/releases/download/v0.3.9/velociraptor-v0.3.9-windows-amd64.exe)のWindows実行ファイルをダウンロードしましょう
サーバのセットアップ時に生成されたclient.config.yamlを引数に以下のように実行します

```powershell
.\velociraptor-v0.3.9-windows-amd64.exe --config client.config.yaml client -v
```

ここからはWEB GUIの操作になります
**Hunt Manager**より
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/e08cdc53-03aa-8bab-8671-bc6cafd54043.png)

`Windows.`と入力するとWindowsで取得できるアーティファクトの一覧がでます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/2e0207d7-fa01-cd4f-6075-96ec75f9ea45.png)

今回は
- Prefetch
- SRUM
- MFT
- Windows Event Log(PS)
- AppCompatCache(Shimcache)
- Amcache
- Startup
を取得しようと思います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/2f9f880b-4013-c792-1262-4c7e87e655bb.png)

取得したいアーティファクトを`Add`したら`Next`を押します
hunt_descriptionに日付など入れて分かるようにしましょう
HuntConditionは今回はWindowsなので`Operating System`より`Windows`を選択します
最後に`Create Hunt`を押して`Done`押して完了です

実行したい行を選択し **▶**をクリックし実行します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/b9f5f080-f843-fcf3-1f6c-0ffebbc3762f.png)

### 結果
収集が終わるとResultタブより各プルダウンすることでアーティファクトの結果が見られます
プルダウンの下に`Search:`の入力ボックスがあるので検索することも可能です
（例1 Prefetch
しっかり`98.EXE-6B674017.pf `がありますね！ただし、<font color="red">読み込んだDLL等の情報まではパースされないみたいです</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/4647231a-5566-475e-2020-1886202e7711.png)

（例2 Startupにありましたね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/7b337017-44de-019a-7e34-fc039e375a1f.png)

Overviewタブの`Prepare Download`よりアーティファクトをダウンロードする準備します
Available Downloadsでダウンロードできます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/0ab64cbc-3f78-0b09-6cbe-c47cb7bce85f.png)

パースされたアーティファクトがCSVであります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/bec2af3b-de62-0ad5-1e5a-f6ca8956c5dd.png)

## 検証②
### インシデント内容
```
Pass the Hashされてしまった※
```
**※唐突な内容ですが、攻撃内容というよりも<font color="red">カスタムイベントログ</font>のための説明です**

検証②ではWindows Event LogのPass the Hash攻撃の痕跡を見つけたいです
しかし、プリセットのアーティファクトリストにはありません
velociraptorではカスタムアーティファクトを作成できます
**View Artifact**の➕を押して作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/b32ab130-c12b-b394-e92a-06461e851602.png)

入力画面で以下のように入力し `Save Artifact`します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/8992b19b-cba4-4b3c-9080-a6df11bed22f.png)


```
name: Custom.Windows.EventLogs.PasstheHash
description: |
  Pass the Hash

parameters:
  - name: securityLogFile
    default: C:/Windows/System32/Winevt/Logs/Security.evtx

sources:
  - queries:
      - SELECT EventData.IpAddress AS IpAddress,
               EventData.IpPort AS Port,
               EventData.ProcessName AS ProcessName,
               EventData.SubjectUserSid AS SubjectUserSid,
               EventData.SubjectUserName AS SubjectUserName,
               EventData.SubjectDomainName AS SubjectDomainName,
               EventData.TargetUserName AS TargetUserName,
               EventData.TargetServerName AS TargetServerName,
               EventData.TargetDomainName AS TargetDomainName,
               EventData.LogonProcessName AS LogonProcessName,
               EventData.LogonType AS LogonType,
               EventData.AuthenticationPackageName AS AuthenticationPackageName,
               EventData.WorkstationName AS WorkstationName,
               System.TimeCreated.SystemTime AS LogonTime
        FROM parse_evtx(filename=securityLogFile)
        WHERE System.EventID.Value = 4624
        AND EventData.LogonType = 9
        AND EventData.AuthenticationPackageName = "Negotiate"
        AND EventData.LogonProcessName = "seclogo"
```

`EventData.`や`System.`のあとのパラメタですが**evtx_dump.py**にて確認できます

```bash
$ sudo apt install python-evtx
evtx_dump.py Security.evtx
...
<Task>12544</Task>
<Opcode>0</Opcode>
<Keywords>0x8020000000000000</Keywords>
<TimeCreated SystemTime="2020-01-24 17:37:22.497969"></TimeCreated>
<EventRecordID>2467</EventRecordID>
<Correlation ActivityID="{38eed94e-d2d8-0000-e1d9-ee38d8d2d501}" RelatedActivityID=""></Correlation>
<Execution ProcessID="628" ThreadID="7444"></Execution>
<Channel>Security</Channel>
<Computer>PC1.TEST.local</Computer>
<Security UserID=""></Security>
</System>
<EventData><Data Name="SubjectUserSid">S-1-5-21-2779522552-3569681238-1483158904-1001</Data>
<Data Name="SubjectUserName">victim1</Data>
<Data Name="SubjectDomainName">PC1</Data>
<Data Name="SubjectLogonId">0x000000000009a96f</Data>
<Data Name="TargetUserSid">S-1-5-21-2779522552-3569681238-1483158904-1001</Data>
<Data Name="TargetUserName">victim1</Data>
<Data Name="TargetDomainName">PC1</Data>
<Data Name="TargetLogonId">0x00000000002a14c1</Data>
<Data Name="LogonType">9</Data>
<Data Name="LogonProcessName">seclogo</Data>
<Data Name="AuthenticationPackageName">Negotiate</Data>
<Data Name="WorkstationName">-</Data>
<Data Name="LogonGuid">{00000000-0000-0000-0000-000000000000}</Data>
<Data Name="TransmittedServices">-</Data>
<Data Name="LmPackageName">-</Data>
<Data Name="KeyLength">0</Data>
<Data Name="ProcessId">0x0000000000001b4c</Data>
<Data Name="ProcessName">C:\Windows\System32\svchost.exe</Data>
<Data Name="IpAddress">::1</Data>
<Data Name="IpPort">0</Data>
<Data Name="ImpersonationLevel">%%1833</Data>
<Data Name="RestrictedAdminMode">-</Data>
<Data Name="TargetOutboundUserName">victim2</Data>
<Data Name="TargetOutboundDomainName">TEST.LOCAL</Data>
<Data Name="VirtualAccount">%%1843</Data>
<Data Name="TargetLinkedLogonId">0x0000000000000000</Data>
<Data Name="ElevatedToken">%%1842</Data>
</EventData>
...
```

### 結果
保存したら検証①と同様に**Hunt Manager**に登録し実行します
きちんと収集できてますね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122949/4f54ca07-ae39-3689-58ba-f15c97001404.png)


## プリセットで収集できるアーティファクトの一覧

```bash
> ./velociraptor artifacts list
Admin.Client.Upgrade
Admin.Events.PostProcessUploads
Admin.System.CompressUploads
Demo.Plugins.Fifo
Demo.Plugins.GUI
Elastic.Events.Clients
Elastic.Flows.Upload
Generic.Applications.Office.Keywords
Generic.Client.Info
Generic.Client.Stats
Generic.Forensic.Carving.URLs
Generic.Forensic.Timeline
Linux.Applications.Chrome.Extensions
Linux.Applications.Chrome.Extensions.Upload
Linux.Applications.Docker.Info
Linux.Applications.Docker.Version
Linux.Debian.AptSources
Linux.Debian.Packages
Linux.Events.ProcessExecutions
Linux.Events.SSHBruteforce
Linux.Events.SSHLogin
Linux.Mounts
Linux.Proc.Arp
Linux.Proc.Modules
Linux.Search.FileFinder
Linux.Ssh.AuthorizedKeys
Linux.Ssh.KnownHosts
Linux.Ssh.PrivateKeys
Linux.Sys.ACPITables
Linux.Sys.CPUTime
Linux.Sys.Crontab
Linux.Sys.LastUserLogin
Linux.Sys.Maps
Linux.Sys.SUID
Linux.Sys.Users
Linux.Syslog.SSHLogin
MacOS.Detection.Autoruns
MacOS.System.Users
Network.ExternalIpAddress
Reporting.Hunts.Details
Server.Alerts.PsExec
Server.Alerts.WinPmem
Server.Hunts.List
Server.Hunts.Results
Server.Information.Clients
Server.Information.Users
Server.Internal.ArtifactDescription
Server.Internal.Interrogate
Server.Monitor.Health
Server.Monitor.Shell
Server.Monitor.VeloMetrics
Server.Monitoring.ClientCount
Server.Powershell.EncodedCommand
System.Flow.Completion
System.Hunt.Participation
System.VFS.DownloadFile
System.VFS.ListDirectory
Triage.Collection.Upload
Triage.Collection.UploadTable
Windows.Analysis.EvidenceOfExecution
Windows.Applications.ChocolateyPackages
Windows.Applications.Chrome.Cookies
Windows.Applications.Chrome.Extensions
Windows.Applications.Chrome.History
Windows.Applications.OfficeMacros
Windows.Attack.ParentProcess
Windows.Attack.Prefetch
Windows.Collectors.File
Windows.Collectors.VSS
Windows.Detection.Impersonation
Windows.Detection.Mutants
Windows.Detection.ProcessMemory
Windows.Detection.PsexecService
Windows.Detection.PsexecService.Kill
Windows.Detection.RemoteYara.Process
Windows.Detection.Service.Upload
Windows.Detection.Thumbdrives.List
Windows.Detection.Thumbdrives.OfficeKeywords
Windows.Detection.Thumbdrives.OfficeMacros
Windows.Detection.WMIProcessCreation
Windows.EventLogs.AlternateLogon
Windows.EventLogs.DHCP
Windows.EventLogs.Kerbroasting
Windows.EventLogs.PowershellScriptblock
Windows.EventLogs.ServiceCreationComspec
Windows.Events.DNSQueries
Windows.Events.FailedLogBeforeSuccess
Windows.Events.Kerbroasting
Windows.Events.ProcessCreation
Windows.Events.ServiceCreation
Windows.Forensics.Bam
Windows.Forensics.FilenameSearch
Windows.Forensics.Prefetch
Windows.Forensics.RecentApps
Windows.Forensics.SRUM
Windows.Forensics.Timeline
Windows.KapeFiles.Targets
Windows.Memory.Acquisition
Windows.NTFS.I30
Windows.NTFS.MFT
Windows.NTFS.Recover
Windows.Network.ArpCache
Windows.Network.InterfaceAddresses
Windows.Network.ListeningPorts
Windows.Network.Netstat
Windows.Network.NetstatEnriched
Windows.Packs.Autoexec
Windows.Packs.LateralMovement
Windows.Packs.Persistence
Windows.Persistence.Debug
Windows.Persistence.PermanentWMIEvents
Windows.Persistence.PowershellRegistry
Windows.Persistence.Wow64cpu
Windows.Registry.AppCompatCache
Windows.Registry.EnableUnsafeClientMailRules
Windows.Registry.EnabledMacro
Windows.Registry.MountPoints2
Windows.Registry.NTUser
Windows.Registry.NTUser.Upload
Windows.Registry.PortProxy
Windows.Registry.Sysinternals.Eulacheck
Windows.Registry.UserAssist
Windows.Search.FileFinder
Windows.Sys.AppcompatShims
Windows.Sys.CertificateAuthorities
Windows.Sys.DiskInfo
Windows.Sys.Drivers
Windows.Sys.FirewallRules
Windows.Sys.Interfaces
Windows.Sys.PhysicalMemoryRanges
Windows.Sys.Programs
Windows.Sys.StartupItems
Windows.Sys.Users
Windows.Sysinternals.Autoruns
Windows.Sysinternals.SysmonInstall
Windows.System.Amcache
Windows.System.CriticalServices
Windows.System.DLLs
Windows.System.Handles
Windows.System.Pslist
Windows.System.SVCHost
Windows.System.Services
Windows.System.TaskScheduler
Windows.System.UntrustedBinaries
Windows.System.VAD
Windows.Triage.ProcessMemory
Windows.Utils.DownloadBinaries
Windows.Utils.FetchBinary
Windows.Utils.UpdatePublicHashes
mint@mint-VirtualBox:~/dfir$ 
mint@mint-VirtualBox:~/dfir$ ./velociraptor artifacts list
Admin.Client.Upgrade
Admin.Events.PostProcessUploads
Admin.System.CompressUploads
Demo.Plugins.Fifo
Demo.Plugins.GUI
Elastic.Events.Clients
Elastic.Flows.Upload
Generic.Applications.Office.Keywords
Generic.Client.Info
Generic.Client.Stats
Generic.Forensic.Carving.URLs
Generic.Forensic.Timeline
Linux.Applications.Chrome.Extensions
Linux.Applications.Chrome.Extensions.Upload
Linux.Applications.Docker.Info
Linux.Applications.Docker.Version
Linux.Debian.AptSources
Linux.Debian.Packages
Linux.Events.ProcessExecutions
Linux.Events.SSHBruteforce
Linux.Events.SSHLogin
Linux.Mounts
Linux.Proc.Arp
Linux.Proc.Modules
Linux.Search.FileFinder
Linux.Ssh.AuthorizedKeys
Linux.Ssh.KnownHosts
Linux.Ssh.PrivateKeys
Linux.Sys.ACPITables
Linux.Sys.CPUTime
Linux.Sys.Crontab
Linux.Sys.LastUserLogin
Linux.Sys.Maps
Linux.Sys.SUID
Linux.Sys.Users
Linux.Syslog.SSHLogin
MacOS.Detection.Autoruns
MacOS.System.Users
Network.ExternalIpAddress
Reporting.Hunts.Details
Server.Alerts.PsExec
Server.Alerts.WinPmem
Server.Hunts.List
Server.Hunts.Results
Server.Information.Clients
Server.Information.Users
Server.Internal.ArtifactDescription
Server.Internal.Interrogate
Server.Monitor.Health
Server.Monitor.Shell
Server.Monitor.VeloMetrics
Server.Monitoring.ClientCount
Server.Powershell.EncodedCommand
System.Flow.Completion
System.Hunt.Participation
System.VFS.DownloadFile
System.VFS.ListDirectory
Triage.Collection.Upload
Triage.Collection.UploadTable
Windows.Analysis.EvidenceOfExecution
Windows.Applications.ChocolateyPackages
Windows.Applications.Chrome.Cookies
Windows.Applications.Chrome.Extensions
Windows.Applications.Chrome.History
Windows.Applications.OfficeMacros
Windows.Attack.ParentProcess
Windows.Attack.Prefetch
Windows.Collectors.File
Windows.Collectors.VSS
Windows.Detection.Impersonation
Windows.Detection.Mutants
Windows.Detection.ProcessMemory
Windows.Detection.PsexecService
Windows.Detection.PsexecService.Kill
Windows.Detection.RemoteYara.Process
Windows.Detection.Service.Upload
Windows.Detection.Thumbdrives.List
Windows.Detection.Thumbdrives.OfficeKeywords
Windows.Detection.Thumbdrives.OfficeMacros
Windows.Detection.WMIProcessCreation
Windows.EventLogs.AlternateLogon
Windows.EventLogs.DHCP
Windows.EventLogs.Kerbroasting
Windows.EventLogs.PowershellScriptblock
Windows.EventLogs.ServiceCreationComspec
Windows.Events.DNSQueries
Windows.Events.FailedLogBeforeSuccess
Windows.Events.Kerbroasting
Windows.Events.ProcessCreation
Windows.Events.ServiceCreation
Windows.Forensics.Bam
Windows.Forensics.FilenameSearch
Windows.Forensics.Prefetch
Windows.Forensics.RecentApps
Windows.Forensics.SRUM
Windows.Forensics.Timeline
Windows.KapeFiles.Targets
Windows.Memory.Acquisition
Windows.NTFS.I30
Windows.NTFS.MFT
Windows.NTFS.Recover
Windows.Network.ArpCache
Windows.Network.InterfaceAddresses
Windows.Network.ListeningPorts
Windows.Network.Netstat
Windows.Network.NetstatEnriched
Windows.Packs.Autoexec
Windows.Packs.LateralMovement
Windows.Packs.Persistence
Windows.Persistence.Debug
Windows.Persistence.PermanentWMIEvents
Windows.Persistence.PowershellRegistry
Windows.Persistence.Wow64cpu
Windows.Registry.AppCompatCache
Windows.Registry.EnableUnsafeClientMailRules
Windows.Registry.EnabledMacro
Windows.Registry.MountPoints2
Windows.Registry.NTUser
Windows.Registry.NTUser.Upload
Windows.Registry.PortProxy
Windows.Registry.Sysinternals.Eulacheck
Windows.Registry.UserAssist
Windows.Search.FileFinder
Windows.Sys.AppcompatShims
Windows.Sys.CertificateAuthorities
Windows.Sys.DiskInfo
Windows.Sys.Drivers
Windows.Sys.FirewallRules
Windows.Sys.Interfaces
Windows.Sys.PhysicalMemoryRanges
Windows.Sys.Programs
Windows.Sys.StartupItems
Windows.Sys.Users
Windows.Sysinternals.Autoruns
Windows.Sysinternals.SysmonInstall
Windows.System.Amcache
Windows.System.CriticalServices
Windows.System.DLLs
Windows.System.Handles
Windows.System.Pslist
Windows.System.SVCHost
Windows.System.Services
Windows.System.TaskScheduler
Windows.System.UntrustedBinaries
Windows.System.VAD
Windows.Triage.ProcessMemory
Windows.Utils.DownloadBinaries
Windows.Utils.FetchBinary
Windows.Utils.UpdatePublicHashes
```
#まとめ
今回はオープンソースのDFIRツールで超簡単なシナリオのもと実際にマルウェアを動かしアーティファクトの収集を行った
プリセットにないアーティファクトはカスタムアーティファクトとして作成し収集できる

## 所感
- オンラインでアーティファクトをアップロードするのは便利
- Windowsのアーティファクトは充実してるがLinuxやMacは少ない
- Windows Event Logの収集が弱い
    - 収集設定はカスタマイズできそうなので`4624/4625`とか`4648`とかとかの収集もできそう
- まだ開発中なので今後に期待！
- アップロードするときインターネットに接続しないといけない問題
    - マルウェアに感染したPCを業務ネットワークには接続できない👉テザリング？
    - 素のネットワークだとマルウェアも通信可能なため情報流出するおそれ👉宛先をVelociraptorにしぼる？