All Articles

Windows で CTF をやりたい人の環境構築手順

普段 CTF の問題を解くために使用しているマシンの構成がだいぶ把握しきれなくなってきてしまったので、心機一転新しい環境を構築することしました。

今回は、今後同じような環境を作るときの手間を減らせるように、できるだけコマンドベースでセットアップをしていきたいと思います。

なお、僕がメインで解く問題が Rev や Forensic のため、インストールしているツールなども若干偏りがあるかと思いますがご容赦ください。

もくじ

事前準備

OS のクリーンインストールとアップデート

僕は普段 Windows マシンで CTF の問題を解いているので、作成する VM も Windows で作成していきます。

また、仮想化基盤には Hyper-V を使用し、以下の構成でマシンを作成しました。

image-20230518141449150

ストレージ容量は 232 GB に設定しています。

なお、OS のクリーンインストールとアップデート方法については割愛します。

Nested Virtualization の有効化

仮想マシンを作成したら、マシンを停止した状態で管理者権限で起動した Power Shell から以下のコマンドレットを実行し、ネストされた仮想化を有効化します。

これで仮想マシン上で Android Emulator などを起動できるようになります。

# Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
Set-VMProcessor -VMName "Win10CTF" -ExposeVirtualizationExtensions $true

参考:Run Hyper-V in a Virtual Machine with Nested Virtualization | Microsoft Learn

ネットワークアダプタの設定変更

管理者権限で起動した Power Shell からネットワークアダプタの設定変更を行います。

今回は、外部接続する Default Switch には既定値の DHCP 接続、内部ネットワークの Internal には固定アドレス 192.168.50.10/28 を割り当てます。

# Get-NetIPAddress で Internal の NIC に対応する InterfaceIndex を特定する
Get-NetIPAddress
>
IPAddress         : 169.254.116.214
InterfaceIndex    : 8
InterfaceAlias    : Ethernet 3
AddressFamily     : IPv4

# InterfaceIndex が 8 のネットワークに 192.168.50.10/28 を割り当て
New-Netipaddress -InterfaceIndex 8 -IpAddress 192.168.50.10 -PrefixLength 28

参考:New-NetIPAddress (NetTCPIP) | Microsoft Learn

回復パーティションの削除

今回は仮想マシンなので回復パーティションは削除しておくことにします。

管理者権限で起動したコマンドプロンプトから Diskpart.exe を起動して以下のコマンドを順に実行します。

Diskpart.exe

# ディスクを列挙して選択します。
DISKPART> list disk
Disk 0    Online

DISKPART> select disk 0

# パーティションを列挙して Recovery パーティションの ID を特定します。
DISKPART> list partition

Partition ###  Type              Size     Offset
-------------  ----------------  -------  -------
Partition 3    Recovery           535 MB    79 GB

# 特定した Recovery パーティションを選択して削除します。
DISKPART> select partition 3
DISKPART> delete partition override

Windows のセットアップ

作成した仮想マシンを起動したら管理者権限で Power Shell を起動し、各種設定を行います。

以下のコマンドを実行して一括で設定を実行できます。

# ユーザフォルダパスに使用する名前の設定
$username = "kash1064"

# タイムゾーンを UTC に設定
tzutil.exe /s "UTC"

# Power Shell スクリプトの実行権限を変更
Set-ExecutionPolicy RemoteSigned

# エクスプローラで拡張子と隠しファイルを表示する
Set-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -name "HideFileExt" -Value 0
Set-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -name "Hidden" -Value 1

# RDP 接続の有効化
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server" -Name "fDenyTSConnections" -Value 0
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"

# 機能名の一覧を取得:Get-WindowsOptionalFeature -Online
# WSL と仮想マシンプラットフォーム、Hyper-V の有効化
Enable-WindowsOptionalFeature -NoRestart -Online -FeatureName Microsoft-Windows-Subsystem-Linux
Enable-WindowsOptionalFeature -NoRestart -Online -FeatureName HypervisorPlatform
Enable-WindowsOptionalFeature -NoRestart -Online -FeatureName VirtualMachinePlatform
Enable-WindowsOptionalFeature -NoRestart -Online -FeatureName Microsoft-Hyper-V-All

# デフォルトでインストールされてるいらない Store Package を削除する
# パッケージの一覧は Get-AppxPackage | Select-Object Name で取得できる
# Tiktok、Instagram は手動削除が必要
Get-AppxPackage -alluser *MicrosoftSolitaireCollection* | Remove-Appxpackage
Get-AppxPackage -alluser *MicrosoftStickyNotes* | Remove-Appxpackage
Get-AppxPackage -alluser *Microsoft.People* | Remove-Appxpackage
Get-AppxPackage -alluser *Office.OneNote* | Remove-Appxpackage
Get-AppxPackage -alluser *Microsoft.GetHelp* | Remove-Appxpackage
Get-AppxPackage -alluser *MicrosoftOfficeHub* | Remove-Appxpackage
Get-AppxPackage -alluser *MicrosoftSolitaireCollection* | Remove-Appxpackage
Get-AppxPackage -alluser *MicrosoftStickyNotes* | Remove-Appxpackage
Get-AppxPackage -alluser *Microsoft.People* | Remove-Appxpackage
Get-AppxPackage -alluser *SkypeApp* | Remove-Appxpackage
Get-AppxPackage -alluser *YourPhone* | Remove-Appxpackage
Get-AppxPackage -alluser *SpotifyAB.SpotifyMusic* | Remove-Appxpackage
Get-AppxPackage -alluser *Disney* | Remove-Appxpackage
Get-AppxPackage -alluser *ZuneMusic* | Remove-Appxpackage
Get-AppxPackage -alluser *3DViewer* | Remove-Appxpackage
Get-AppxPackage -alluser *Microsoft.MSPaint* | Remove-Appxpackage
Get-AppxPackage -alluser *Microsoft.WindowsMaps* | Remove-Appxpackage
Get-AppxPackage -alluser *messaging* | Remove-Appxpackage
Get-AppxPackage -alluser *windowscommunicationsapps* | Remove-Appxpackage
Get-AppxPackage -alluser *ZuneVideo* | Remove-Appxpackage
Get-AppxPackage -alluser *BingWeather* | Remove-Appxpackage
Get-AppxPackage -alluser *MicrosoftOfficeHub* | Remove-Appxpackage
Get-AppxPackage -alluser *Microsoft.549981C3F5F10* | Remove-AppxPackage
Get-AppxPackage -alluser *Microsoft.Todo* | Remove-AppxPackage

# 不要なショートカットの削除
# C:\ProgramData\Microsoft\Windows\Start Menu\Programs
# %USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
Get-ChildItem -Path "C:\ProgramData\Microsoft\Windows\Start Menu\Programs"
Remove-Item -Path "C:\ProgramData\Microsoft\Windows\Start Menu\Programs" -Include *.lnk

# Desktop のショートカットをすべてスタートメニューにも登録する
Copy-Item -Path "C:\Users\$username\Desktop\*.lnk" -Destination "C:\ProgramData\Microsoft\Windows\Start Menu\Programs"

# Tools フォルダの作成
New-Item -ItemType "directory" -Path "C:\Tools"

# Defender の除外追加
$ExclusionPath = @"
C:\Tools\,
C:\Users\$usename\Downloads\,
C:\Users\$usename\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_*\
"@
$ExclusionPath = $ExclusionPath.Replace("`n", "")
Add-MpPreference -ExclusionPath $ExclusionPath

# UAC の設定を 2 段階目(通知のみ)に変更
# Get-ItemProperty HKLM:Software\Microsoft\Windows\CurrentVersion\policies\system
Set-ItemProperty "HKLM:Software\Microsoft\Windows\CurrentVersion\policies\system" -name "ConsentPromptBehaviorAdmin" -Value 5
Set-ItemProperty "HKLM:Software\Microsoft\Windows\CurrentVersion\policies\system" -name "PromptOnSecureDesktop" -Value 0
Set-ItemProperty "HKLM:Software\Microsoft\Windows\CurrentVersion\policies\system" -name "EnableLUA" -Value 1

# OS の再起動
Start-Sleep -Seconds 30
Restart-Computer

※ 設定の反映には OS の再起動が必要です。

エクスプローラで拡張子と隠しファイルを表示する

エクスプローラのオプション設定はHKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced以下のレジストリキーで管理できます。

今回は以下のコマンドレットでエクスプローラで拡張子と隠しファイルを表示する設定を行ってます。

# エクスプローラで拡張子と隠しファイルを表示する
Set-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -name "HideFileExt" -Value 0
Set-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -name "Hidden" -Value 1

Windows の機能を有効化する

WSL2 や Android Studio のエミュレータなどを使用するため、以下の機能を有効化しています。

-NoRestartを指定しないとコマンド実行時に再起動されてしまうので注意が必要です。

# WSL と仮想マシンプラットフォーム、Hyper-V の有効化
Enable-WindowsOptionalFeature -NoRestart -Online -FeatureName Microsoft-Windows-Subsystem-Linux
Enable-WindowsOptionalFeature -NoRestart -Online -FeatureName HypervisorPlatform
Enable-WindowsOptionalFeature -NoRestart -Online -FeatureName VirtualMachinePlatform
Enable-WindowsOptionalFeature -NoRestart -Online -FeatureName Microsoft-Hyper-V-All

参考:Enable-WindowsOptionalFeature (DISM) | Microsoft Learn

IME の設定変更をする

こちらは一旦 GUI から設定しました。

参考:IME配列をカスタマイズする

システム音の無効化

こちらも一旦 GUI から設定しました。

コントロールパネルから [Change system sounds] を開き、[No Sounds] を設定します。

image-20230519150525712

WinGet で解析ツールをインストールする

ツールの管理は可能な限り winget を使っていきます。

そのため、winget で取得できないツールや、winget で取得しない方が運用が楽なツールは全部以下でインストールしてしまいます。

# 各種パッケージのインストール
winget.exe install --id Google.Chrome
winget.exe install --id Mozilla.Firefox
winget.exe install --id Canonical.Ubuntu
winget.exe install --id Typora.Typora
winget.exe install --id Microsoft.VisualStudioCode
winget.exe install --id Microsoft.WindowsTerminal
winget.exe install --id Git.Git
winget.exe install --id WiresharkFoundation.Wireshark
winget.exe install --id SoftwareFreedomConservancy.QEMU
winget.exe install --id 7zip.7zip
winget.exe install --id Microsoft.XMLNotepad
winget.exe install --id Brave.Brave
winget.exe install --id PortSwigger.BurpSuite.Community
winget.exe install --id Google.AndroidStudio
winget.exe install --id Hex-Rays.IDA.Free
winget.exe install --id icsharpcode.ILSpy
winget.exe install --id dnSpyEx.dnSpy
winget.exe install --id Notepad++.Notepad++
winget.exe install --id Python.Python.3.10
winget.exe install --id Python.Python.2
winget.exe install --id WinMerge.WinMerge
winget.exe install --id Microsoft.WinDbg
winget.exe install --id OliverBetz.ExifTool
winget.exe install --id ExpressVPN.ExpressVPN
winget.exe install --id GIMP.GIMP
winget.exe install --id Microsoft.Office
winget.exe install --id Canonical.Ubuntu.2204
winget.exe install --id Canonical.Ubuntu.2004
winget.exe install --id kalilinux.kalilinux
winget.exe install --id Chocolatey.ChocolateyGUI
winget.exe install --id MHNexus.HxD
winget.exe install --id ImageMagick.ImageMagick

参考:Windows Package Manager(winget)でよく使うアプリケーションをインストールする - かえるのひみつきち

各種解析ツールを手動でインストールする

WinGet でインストールできない(もしくはしたくない)ツールをインストールしていきます。

WinDbg

以下からダウンロードした Windows SDK のインストーラでインストールする。

参考:Debugging Tools for Windows - Windows drivers | Microsoft Learn

また、以下からダウンロードした reg ファイルでワークスペースをセットアップする。

参考:Releases · kash1064/WinDbg-Classic-Dark

Sysinternals

以下からダウンロードしたファイルをC:\Tools\SysinternalsSuiteに配置する。

参考:Sysinternals Utilities - Sysinternals | Microsoft Learn

また、Procmon と Proexp にはシンボルの設定を行う。

image-20230519004530612

SDK に含まれる C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\dbghelp.dll に変更後、シンボルパスに以下を設定する。

srv*C:\symbols*https://msdl.microsoft.com/download/symbols

Proexp にも同じ設定を行う。

image-20230519004740181

.NET 6.0 Desktop Runtime

以下からダウンロードした MSI でインストール。

参考:Download .NET 6.0 Desktop Runtime (v6.0.16) - Windows x64 Installer

Ghidra

以下からファイルをダウンロードしてC:\Tools\Ghidraに展開する。

参考:Releases · NationalSecurityAgency/ghidra

以下の手順でセットアップを行う。

参考:CTFのためのGhidra環境構築メモ - かえるのひみつきち

Visual Studio 2019

MSDN からインストーラをダウンロードしてインストールします。

インストールが完了したら、最低限キーボードマッピングを VSCode に統一しておきます。

image-20230519150330086

Noriben

以下からファイルをダウンロードしてC:\Tools\Noribenに展開する。

参考:GitHub - Rurik/Noriben: Noriben - Portable, Simple, Malware Analysis Sandbox

Java 17

以下からファイルをダウンロードしてC:\Tools\jdk-17に展開する。

参考:Java Downloads | Oracle

Java 8

以下からダウンロードし、C:\Tools\jdk-8に展開する。

参考:Latest Releases | Adoptium

Eclipse Memory Analyzer

以下からファイルをダウンロードしてC:\Tools\MemoryAnalyzerに展開する。

参考:c Open Source Project | The Eclipse Foundation

以下の手順で Java のパスを指定する。

参考:Eclipse Memory Analyzer をシングルバイナリで起動する際に version 1.8.0_261 of the jvm is not suitable のエラーが出る問題の解決方法 - かえるのひみつきち

Android Studio

WinGet でインストール済みの Android Studio を起動してセットアップを進める。

また、デバイスマネージャから x86 と x86_64 のエミュレータを作成しておく。

image-20230518220001103

Android SDK Platform Tools

以下からファイルをダウンロードしてC:\Tools\android-sdkに展開する。

参考:SDK Platform Tools release notes | Android Studio | Android Developers

Android NDK

SDK Manger から NDK のインストールを行う。

image-20230518222206294

参考:Install and configure the NDK and CMake | Android Studio | Android Developers

または、ダウンロードした NDK ファイルを直接ビルドする。

参考:ライブラリ関数を dlopen して ELF バイナリとして動的解析を行う

pestudio

以下からダウンロードしてC:\Tools\pestudioに展開する。

参考:Winitor

RegistryChangesView

以下から RegistryChangesView をダウンロードしてC:\Tools\RegistryChangesViewに展開する。

参考:RegistryChangesView - Compare snapshots of Windows Registry

Hayabusa

以下からダウンロードしてC:\Tools\Hayabusaに展開する。

参考:Releases · Yamato-Security/hayabusa · GitHub

Timeline Explorer

以下からダウンロードしてC:\Tools\TimelineExplorerに展開する。

参考:Eric Zimmerman’s tools

Hasher

以下からダウンロードしてC:\Tools\Hasherに展開する。

参考:Eric Zimmerman’s tools

jq

以下からダウンロードしてC:\Tools\jqに配置する。

参考:Download jq

Frida

以下の手順でセットアップし、C:\Tools\Fridaに配置する。

参考:Frida のセットアップ

Eclipse IDE

以下からダウンロードしたインストーラでインストールする。

参考:Eclipse Downloads | The Eclipse Foundation

image-20230518205120765

インストール先はC:\Tools\Eclipseに設定する。

また、ワークスペースは%USERPROFILE%\Documents\eclipse-workspaceに作成する。

Gradle

以下からダウンロードし、C:\Tools\Gradleに展開する。

参考:Gradle | Releases

PEiD

以下からダウンロードし、C:\Tools\PEiDに展開する。

参考:PEiD (Windows) - Download & Review

jadx

以下からダウンロードし、C:\Tools\jadxに展開する。

参考:Releases · skylot/jadx · GitHub

jd-gui

以下からダウンロードし、C:\Tools\jd-guiに展開する。

参考:Java Decompiler

ProcessHacker

以下からダウンロードし、C:\Tools\ProcessHackerに展開する。

参考:Downloads - Process Hacker

LLDB

以下からダウンロードしたインストーラでC:\Tools\LLVMにインストールする。

参考:Releases · llvm/llvm-project · GitHub

npcap

以下からダウンロードしたインストーラでインストールする。

参考:Npcap: Windows Packet Capture Library & Driver

Windows Terminal

WinGet でインストールしたアプリケーションのセットアップを行う。

ショートカットキーやスタートアップフォルダを指定しておく。

また、[elevate] を True にした Power Shell のプロファイルを追加し、settings.jsonを以下のように並び変えておく。

{省略}
{
    "commandline": "%SystemRoot%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
    "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
    "hidden": false,
    "name": "Windows PowerShell",
    "startingDirectory": "%USERPROFILE%\\Downloads"
},
{
    "commandline": "%SystemRoot%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
    "elevate": true,
    "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44ba}",
    "hidden": false,
    "name": "Elevate Windows PowerShell",
    "startingDirectory": "%USERPROFILE%\\Downloads"
},
{
    "guid": "{51855cb2-8cce-5362-8f54-464b92b32386}",
    "hidden": false,
    "name": "Ubuntu",
    "source": "CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc"
},
{
    "guid": "{07b52e3e-de2c-5db4-bd2d-ba144ed6c273}",
    "hidden": false,
    "name": "Ubuntu-20.04",
    "source": "Windows.Terminal.Wsl",
    "tabTitle": "Remnux"
},
{
    "commandline": "%SystemRoot%\\System32\\cmd.exe",
    "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
    "hidden": false,
    "name": "Command Prompt",
    "startingDirectory": "%USERPROFILE%\\Downloads"
},
{省略}

これで、Windows Terminal から簡単に昇格した Power Shell プロンプトを起動できる。

hollows_hunter

以下からダウンロードしたファイルをC:\Tools\hollows_hunterに展開する。

参考:Releases · hasherezade/hollows_hunter

APIMiner

以下からダウンロードしたファイルをC:\Tools\APIMinerに展開する。

参考:Release APIMiner-v1.0.0 · poona/APIMiner

CyberChef

以下からダウンロードしたファイルをC:\Tools\CyberChefに展開してブラウザブックマークしておく。

参考:Releases · gchq/CyberChef · GitHub

UPX

以下からダウンロードしたファイルをC:\Tools\upxに展開する。

参考:Releases · upx/upx · GitHub

FTK Imager

以下からダウンロードしたインストーラでC:\Tools\AccessDataにインストール。

参考:Exterro Thank You Page - Exterro

PDFStreamDumper

以下からダウンロードしたインストーラでC:\Tools\PDFStreamDumperにインストール。

参考:Releases · dzzie/pdfstreamdumper

うさみみハリケーン、青空白猫

以下からダウンロードしたファイルをC:\Tools\UsaMimiに展開。

参考:汎用ファイルアナライザ「青い空を見上げればいつもそこに白い猫」

Volatility 2.6

以下からダウンロードしたファイルをC:\Tools\volatility2に展開する。

Volatility 3 は、基本的に WSL 上にインストールしたものを使用する。

参考:Release Downloads | Volatility Foundation

Universal Radio Hacker (URH)

以下からダウンロードしたインストーラでC:\Tools\Universal Radio Hackerにインストールする。

参考:Releases · jopohl/urh

Cheat Engine

以下からダウンロードできる、どうやらインストーラが Adware のようなものを抱き合わせでインストールするらしく、Defender で PUA として検出される。

特別使用頻度も多くないので普段はインストールせず、どうしても使いたい時だけ導入する。

参考:Cheat Engine

Sysmon

以下からダウンロードし、sysmon64 -iでインストールする。

参考:Sysmon - Sysinternals | Microsoft Learn

VcXsrv Windows X Server

以下からダウンロードし、C:\Tools\VcXsrvにインストールする。

参考:VcXsrv Windows X Server download | SourceForge.net

Pybag

以下のコマンドでインストールする。

cd C:\Tools

# 公式のリポジトリにはインストール時のバグが存在している(2023/5/24時点)ので、Forkしたリポジトリを clone する
git clone https://github.com/kash1064/Pybag
cd .\Pybag\
python.exe ./setup.py install

参考:kash1064/Pybag: Python module for Windbg’s dbgeng plus additional wrappers.

AssetStudio

以下からダウンロードします。

参考:GitHub - Perfare/AssetStudio: AssetStudio is a tool for exploring, extracting and exporting assets and assetbundles.

ExtremeDumper

以下のリポジトリからダウンロードします。

参考:Releases · wwh1004/ExtremeDumper · GitHub

Quick Assembler

以下のリポジトリからバイナリをダウンロードします。

参考:zodiacon/AllTools: All reasonably stable tools

cutter

以下からダウンロードしたファイルを展開します。

参考:Cutter

Fiddler

以下からダウンロードしたインストーラを使用します。

参考:Web Debugging Proxy and Troubleshooting Tools|Fiddler

Chocolatey でツールをインストールする

CFF Explorer などを含む一部のツールは、Chocolatey 経由でインストールすることにします。

ますは、管理者権限で起動した Power Shell で以下のコマンドを実行して Chocolatey をインストールします。

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

Chocolatey のインストールが完了したら、以下のコマンドで各ツールのインストールを行います。

# ツールのインストール
choco install apimonitor -y
choco install hashmyfiles -y
choco install fakenet -y
choco install explorersuite -y

環境変数をセットアップする

以下のコマンドを管理者権限で起動した Power Shell で実行することで環境変数をまとめて設定できます。

実際のパスは環境に合わせて変更します。

# ユーザ環境変数のセットアップ
$usename = "kash1064"
$UserPath = @"
C:\Tools\SysinternalsSuite;
C:\Tools\android-sdk;
C:\Tools\android-ndk;
C:\Tools\Noriben;
C:\Tools\Ghidra;
C:\Tools\MemoryAnalyzer;
C:\Tools\Hayabusa;
C:\Tools\Hasher;
C:\Tools\TimelineExplorer;
C:\Tools\jq;
C:\Tools\Frida;
C:\Tools\Gradle\bin;
C:\Tools\jdk-17\bin;
C:\Tools\LLVM\bin;
C:\Tools\APIMiner;
C:\Tools\hollows_hunter;
C:\Tools\upx;
C:\Tools\UsaMimi;
C:\Tools\volatility2;
C:\Tools\Universal Radio Hacker;

C:\Program Files\qemu;

C:\ProgramData\chocolatey\lib\apimonitor;
C:\ProgramData\chocolatey\lib\hashmyfiles;
C:\Program Files\NTCore\Explorer Suite;

C:\Users\$usename\AppData\Local\Programs\Python\Python310\Scripts\;
C:\Users\$usename\AppData\Local\Programs\Python\Python310\;
C:\Users\$usename\AppData\Local\Microsoft\WindowsApps;
C:\Users\$usename\AppData\Local\Programs\Microsoft VS Code\bin;
C:\Users\$usename\AppData\Local\Microsoft\WinGet\Links;
C:\Users\$usename\AppData\Local\Programs\ExifTool;

C:\Python27\Scripts;
C:\Python27;
"@
$UserPath = $UserPath.Replace("`n", "")

[System.Environment]::SetEnvironmentVariable("Path", $UserPath, "User")
[System.Environment]::SetEnvironmentVariable("NDK_PROJECT_PATH", "C:\Tools\NDK", "User")
[System.Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Tools\jdk-17", "User")


# システム環境変数のセットアップ
$usename = "kash1064"
$SytemPath = @"
C:\Users\$usename\AppData\Local\Programs\Python\Python310\Scripts\;
C:\Users\$usename\AppData\Local\Programs\Python\Python310\;
C:\Python27\Scripts;
C:\Python27;

C:\Windows\system32;
C:\Windows;
C:\Windows\System32\Wbem;
C:\Windows\System32\WindowsPowerShell\v1.0\;
C:\Windows\System32\OpenSSH\;
C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;
C:\Program Files\dotnet\;
C:\ProgramData\chocolatey\bin;
C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\;
C:\Program Files\Git\cmd;
C:\Tools\SysinternalsSuite;
C:\Tools\APIMiner;
C:\Tools\hollows_hunter;
C:\Tools\UsaMimi;
C:\Tools\volatility2;

C:\Program Files\qemu;
"@
$SytemPath = $SytemPath.Replace("`n", "")
[System.Environment]::SetEnvironmentVariable("Path", $SytemPath, "Machine")

# OS の再起動
Restart-Computer

WSL のセットアップ

WSL2 に変更する

まず、以下からダウンロードした wslupdatex64.msi をインストールします。

参考:Manual installation steps for older versions of WSL | Microsoft Learn

続いて、管理者権限で起動した Power Shell から以下のコマンドを実行して WSL2 を有効化します。

wsl --set-version Ubuntu 2
wsl --set-version Ubuntu-20.04 2

WSL2 の有効化コマンドを 2 回実行しているのは、WinGet を使ったインストール時に以下の 2 つのパッケージをインストールしているためです。

winget.exe install --id Canonical.Ubuntu.2204
winget.exe install --id Canonical.Ubuntu.2004

Ubuntu 20.04の方は、後述する SHIFT と REMnux の前提要件を満たすために必要なバージョンです。

また、Ubuntu 20.04だと依存関係の glib のバージョンの関係で最近の問題バイナリを実行できなくなるため、メインで使用する CTF 用の環境としてはUbuntu 22.04の方を使用します。

パッケージをインストールする

以下のコマンドでパッケージなどをインストールします。

こちらの環境はメインの解析に使用する方なので、Ubuntu 22.04を使用します。

# 更新
sudo apt update && sudo apt upgrade -y

# Docker のインストール
# https://docs.docker.com/engine/install/ubuntu/
sudo apt install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release \
    -y
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# パッケージのインストール
sudo apt update && sudo apt install \
	apktool \
    bash-completion \
    build-essential \
    binwalk \
    cifs-utils \
    containerd.io \
    docker-ce \
    docker-ce-cli \
    docker-compose \
    docker-compose-plugin \
    elfutils \
    exiftool \
    foremost \
    gdb \
    gdbserver \
    glibc-source \
    golang-go \
    git \
    hexedit \
    hprof-conv \
    libc6-dbg \
    lldb \
    libbpf-dev \
    libseccomp-dev \
    libfuzzy-dev \
    maven \
    make \
    mingw-w64-* \
    nasm \
    netcat \
    net-tools \
    openjdk-17-jdk \
    patchelf \
    pdftohtml \
    pngcheck \
    python2.7 \
    python3-pip \
    python3.10 \
    python3.10-dev \
    qemu \
    rar \
    ruby-rubygems \
    snapd \
    steghide \
    ssh \
    tmux \
    tshark \
    ufw \
    unzip \
    upx-ucl \
    vim \
    yara \
    7zip \
    -y

# 2024/06 時点で docker-compose を動かすのに必要
pip3 install requests==2.29.0

# /usr/sbin/iptables-legacy を指定する
sudo update-alternatives --config iptables

# rust のインストール
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# SageMath のインストール(サイズが大きいので不要なら入れない)
sudo apt install sagemath -y

# Docker を通常ユーザで使用する
sudo gpasswd -a $USER docker
sudo service docker start --enable

# SSH キーを作成して Github に登録
ssh-keygen

# Tool のインストール
mkdir ~/Tools

# gdb peda と pwndbg のインストール
git clone https://github.com/longld/peda.git ~/Tools/peda
git clone https://github.com/scwuaptx/Pwngdb.git ~/Tools/Pwngdb

cat << EOF > ~/.gdbinit
source ~/Tools/peda/peda.py
source ~/Tools/Pwngdb/pwngdb.py
source ~/Tools/Pwngdb/angelheap/gdbinit.py

define hook-run
python
import angelheap
angelheap.init_angelheap()
end
end
EOF

# zsteg
sudo gem install zsteg

# stegsolve
mkdir -p ~/Tools/stegsolve
cd ~/Tools/stegsolve
wget http://www.caesum.com/handbook/Stegsolve.jar -O stegsolve.jar
chmod +x stegsolve.jar

# pwninit
mkdir -p ~/Tools/pwninit
cd ~/Tools/pwninit
wget https://github.com/io12/pwninit/releases/download/3.3.0/pwninit
chmod +x ./pwninit

# pip2 のインストール
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o ~/Tools/get-pip.py
python2.7 ~/Tools/get-pip.py
/home/ubuntu/.local/bin/pip2 install --upgrade setuptools
/home/ubuntu/.local/bin/pip2 install pipenv
sudo apt install python2-dev --fix-missing

# piptool
sudo pip3 install \
	angr \
	ciphey \
    pipenv \
    python-magic \
    pycryptodome \
    pwntools \
    yara-python

# volatility3
cd ~/Tools
git clone https://github.com/volatilityfoundation/volatility3.git

# extract-vmlinux のダウンロード
cd ~/Tools
wget https://raw.githubusercontent.com/torvalds/linux/master/scripts/extract-vmlinux
chmod +x extract-vmlinux

# ropr のインストール
cargo install ropr

# Steganography のインストール
cd ~/Tools
git clone https://github.com/ragibson/Steganography
cd Steganography
sudo python3 setup.py install

# stegoveritas のセットアップ
pip3 install stegoveritas
stegoveritas_install_deps

# daring のインストール(依存関係もセットでインストールする)
sudo apt install cmake clang bison flex libfuse-dev libudev-dev pkg-config libc6-dev-i386 \
gcc-multilib libcairo2-dev libgl1-mesa-dev libglu1-mesa-dev libtiff5-dev \
libfreetype6-dev git git-lfs libelf-dev libxml2-dev libegl1-mesa-dev libfontconfig1-dev \
libbsd-dev libxrandr-dev libxcursor-dev libgif-dev libavutil-dev libpulse-dev \
libavformat-dev libavcodec-dev libswresample-dev libdbus-1-dev libxkbfile-dev \
libssl-dev python2 -y
wget https://github.com/darlinghq/darling/releases/download/v0.1.20220704/darling_0.1.20220704.focal_amd64.deb
sudo dpkg -i darling_0.1.20220704.focal_amd64.deb
rm darling_0.1.20220704.focal_amd64.deb

# qemu 系のツールをインストール
sudo apt install qemu-user-binfmt qemu-efi qemu-efi-aarch64 qemu-efi-arm qemu-system qemu-system-arm qemu-system-common qemu-system-x86 qemu-system-misc qemu-utils g++-arm-linux-gnueabihf gdb-multiarch -y

# wabt のインストール
wget https://github.com/WebAssembly/wabt/releases/download/1.0.33/wabt-1.0.33-ubuntu.tar.gz

# smali2java と jadx のインストール https://github.com/skylot/jadx/releases

# one_gadget のインストール
sudo gem install one_gadget

# seccomp-tools のインストール
sudo apt install ruby-dev -y
sudo gem install seccomp-tools

# Risc-V
git clone https://github.com/riscv-collab/riscv-gnu-toolchain
cd riscv-gnu-toolchain
git checkout origin/extra-multi-lib-test

sudo apt-get install autoconf automake autotools-dev curl python3 python3-pip libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev ninja-build git cmake libglib2.0-dev python-is-python3 -y

# root に gef のインストール
sudo su
wget -O ~/.gdbinit-gef.py -q https://gef.blah.cat/py

sudo su
./configure --prefix=/home/ubuntu/Tools/riscv
make linux

# glibc のソースのクローン
cd ~/Tools
git clone https://github.com/bminor/glibc
echo source ~/.gdbinit-gef.py > ~/.gdbinit

# Alias のセットアップ
echo -e "
alias tarbz2='tar -jxvf'
alias targz='tar -zxvf'
alias tarxz='tar -Jxvf'
alias aptupgrade='sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y'
alias checksec='pwn checksec'

alias run_python2='docker run --net host --rm -it -v $PWD:/app python2 bash'
alias run_python3='docker run --net host --rm -it -v `pwd`:/app python3 bash'
alias run_wine='docker run --rm -it --user ubuntu -v $PWD:/usr/app wine32 bash'
alias run_php='docker run --net host --rm -it -v $PWD:/root php bash'
alias run_impacker='docker run --net host --rm -it -v `pwd`:/root impacket'
alias pince='cd /home/parrot/Tools/PINCE && sh PINCE.sh'

alias aptupgrade='sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y'
alias sample2zip='zip -P infected -r'

sudo /etc/init.d/docker start > /dev/null

export PATH=$PATH:/home/ubuntu/.local/bin:/home/ubuntu/Tools:/home/ubuntu/Tools/stegsolve:/home/ubuntu/Tools/wabt:/home/ubuntu/Tools/pwninit
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0" >> ~/.bashrc

# ホストマシンへのシンボリックリンクを作成
ln -s /mnt/c/Users/kash1064/Downloads/ win

# よく使うコマンドのパスワード入力を不要にする
echo $USER ALL=NOPASSWD: /usr/bin/apt | sudo tee /etc/sudoers.d/apt
echo $USER ALL=NOPASSWD: /etc/init.d/docker | sudo tee /etc/sudoers.d/docker
sudo chmod 440 /etc/sudoers.d/*

# 32bit のバイナリを実行するためのライブラリを追加
sudo dpkg --add-architecture i386
sudo apt update

sudo apt install libncurses6:i386

# ripgrep のインストール
# pcre2 を有効化する場合は cargo install ripgrep --features 'pcre2'
rustup install stable
cargo install ripgrep

# クリーンアップ
sudo apt autoremove -y
sudo rm /var/crash/*

WSL2 に libc-database をインストールする

libc のオフセットを調べることができる libc-database ですが、オンラインのツールだと情報が更新されていない場合などがあり、必要なバージョンを特定することができません。

そのため、ローカルで libc-database を使用できるようにします。

# libc-database の Clone
cd ~/Tools
git clone https://github.com/niklasb/libc-database

# 依存関係のインストール
sudo apt update && sudo apt install -y \
  binutils file \
  wget \
  rpm2cpio cpio \
  zstd jq -y

# 各プラットフォームの libc 情報を取得(時間とストレージを消費します)
cd ~/Tools/libc-database
./get ubuntu debian rpm centos alpine

参考:GitHub - niklasb/libc-database: Build a database of libc offsets to simplify exploitation

WSL2 に rp++ をインストールする

以下からダウンロード。

参考:Releases · 0vercl0k/rp

WSL2 に REMnux のツールをインストールする

続いて、Ubuntu 20.04の方の WSL2 に REMnux のアドオンをインストールします。

sudo apt update && sudo apt upgrade -y

# インストーラの配置
wget https://REMnux.org/remnux-cli
mv remnux-cli remnux
chmod +x remnux
sudo mv remnux /usr/local/bin

# インストール
sudo remnux install --mode=addon

参考:Install from Scratch - REMnux Documentation

参考:Windowsの環境でもLinuxのフォレンジックツールを使いたい! - Qiita

WSL2 で GUI ツールを使えるようにする

REMnux のアドオンには多くの GUI ツールが含まれてるため、これを使えるようにしたいと思います。

まず、すでにインストール済みの VcXsrv Windows X Server を起動します。

ここは既定値のままにし、次の設定も [Start no client] を選択します。

image-20230519220135087

Extra Settings は以下のように設定します。

パラメータには -ac と入力しています。

image-20230519220224276

これで作成したconfig.xlaunch%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startupに保存します。

次に、REMnux をセットアップした WSL の .bashrc に以下のコマンドを追加し、ディスプレイ設定を登録します。

export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0

OS の再起動後、WSL で起動した GUI アプリが Windows 側で使用できるようになれば設定は完了です。

image-20230519222129404

Kali のセットアップ

WSL でインストールした Kali Linux もセットアップしていきます。

Kali は事前に WSL2 に変更しておきます。

wsl --set-version kali-linux 2

Ubuntu に kali-tools で入れてもいいですが、msfvenom などのツールを楽に使うために最低限のセットアップだけしておきます。

まずは、EXPKEYSIG ED444FF07D8D0BF6 Kali Linux Repositoryのエラーの解消のために以下のリポジトリからダウンロードした kali-archive-keyring2022.1all.deb を WSL の Kali に配置してインストールします。

# https://http.kali.org/kali/pool/main/k/kali-archive-keyring/
sudo dpkg -i kali-archive-keyring_2022.1_all.deb

参考:Index of /kali/pool/main/k/kali-archive-keyring

参考:The following signatures were invalid: EXPKEYSIG ED444FF07D8D0BF6 Kali Linux Repository

これで apt によるパッケージ更新ができるようになります。

続いて、以下のコマンドでパッケージの更新とセットアップを進めます。(いきなり dist-upgrade をかけると apt が壊れるので注意)

# Install Tools
sudo apt update && sudo apt install kali-linux-large -y
sudo apt install \
	bash-completion \
	vim \
	sox \
	multimon-ng \
	-y

参考:Win-KeX | Kali Linux Documentation

また、Kali のツールには GUI アプリが多く含まれます。

これらを使えるようにするために、Kali 側の .bashrc にも以下を追記しておきます。

export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0

なお、WSL 側で問題が起きてアクセスできなくなった場合は、Power Shell から以下のコマンドを実行することで root ユーザとしてシェルにアクセスできます。

wsl --distribution kali-linux -u root

まとめ

3 年ほど使ってきた CTF 用の環境をリビルドしてみました。

しばらく使っていると構成がわけわからなくなってきてしまうので、今後更新する際はこの記事をアップデートしようかと思います。