本サイトは、快適にご利用いただくためにクッキー(Cookie)を使用しております。
Cookieの使用に同意いただける場合は「同意する」ボタンを押してください。
なお本サイトのCookie使用については、「個人情報保護方針」をご覧ください。

最新情報

2021.10.05

社内CTFで出題した問題

当社では社内CTF2020年度から開催しており今年度も開催予定ですが、昨年度に筆者が出題した問題についてご紹介したいと思います。

ご紹介する問題は、昨年度の社内CTF開催前に実施された大和セキュリティ勉強会主催のCTFで出題したものを一部カスタマイズしたものです。ちなみに、大和セキュリティ勉強会は2012年から開催されており、「大和魂の皆様のためのワイワイ楽しく合法ハッキングしながら実践的なスキルを身につけるセキュリティ勉強会」です。大和セキュリティ勉強会主催のCTFは、とあるアニメの世界観を踏襲したものになっており、出題した問題もそのアニメの中で2つの巻物を取得することで課題をクリアできるというストーリーを参考に作成しました。出題した2つの問題のうち、最初に解くべき問題(MakimonoHeaven)について解説したいと思います。

image.png

MakimonoHeavenは、batファイル、PowerShellスクリプト、EXEファイルをアップロードすることで自動実行され、結果が出力される仕組みになっており、問題サーバー上に存在する巻物を取得することでクリアできます。巻物の保存場所(C:\Makimono)は明示しており、当たり前ですが普通にアクセスするとエラーとなり、参照することはできないようになっています。これは、IISのデフォルトアカウントで動作しており、当該アカウントには巻物へのアクセス権限がないためです。そこで、アクセス可能な権限を取得するための方法を模索することになります。Get-Hotfixなどを実行し、セキュリティパッチの適用状況を確認すると問題サーバーは(CTF開催時点で)最新のセキュリティパッチが適用されていることが分かります。そのため、OSの脆弱性を用いた権限昇格は無理筋であるという判断になります。

- whoamiの実行結果

iis apppool\heaven

- Get-ChildItem C:\Makimonoの結果

ディレクトリ: C:\Makimono

Mode LastWriteTime Length Name

---- ------------- ------ ----

-a---- 2020/11/29 20:45 78 MakimonoEarth.txt

-a---- 2020/11/09 20:07 34 MakimonoHeaven.txt

- icacls C:\Makimono\MakimonoHeaven.txtの結果

0 個のファイルが正常に処理されました。1 個のファイルを処理できませんでした

: アクセスが拒否されました。

- Get-HotFixの結果

Source Description HotFixID InstalledBy InstalledOn

------ ----------- -------- ----------- -----------

2JISHIKEN Update KB4580419 NT AUTHORITY\SYSTEM 2020/11/14 0:00:00

2JISHIKEN Update KB4562830 NT AUTHORITY\SYSTEM 2020/11/14 0:00:00

2JISHIKEN Security Update KB4580325 NT AUTHORITY\SYSTEM 2020/11/14 0:00:00

2JISHIKEN Security Update KB4586864 NT AUTHORITY\SYSTEM 2020/11/14 0:00:00

2JISHIKEN Security Update KB4586781 NT AUTHORITY\SYSTEM 2020/11/14 0:00:00

突然、話が変わってしまいますが、ペネトレーションテストでは権限昇格可能な問題などを探すために以下のような観点で環境内の情報収集を行っています。

  • 存在するアカウント

単純なパスワードを利用しているアカウントの調査のため

  • 稼働しているサービス(プロセス)

どのようなアプリケーションのプロセスが動作しているか調査のため

  • インストールされているアプリケーション

インストールされているアプリケーションでのDLLインジェクションなどの脆弱性を利用した権限奪取可否の調査のため

  • 存在するフォルダやファイル

認証情報が記載されたファイルの有無の調査のため

では、ペネトレーションテストと同様に情報収集を行っていきます。net localgroup administratorsの結果から、Administratorアカウントとorochimaruアカウントは管理者権限を有しており、どちらかのアカウントの認証情報が特定できれば、管理者権限の奪取が可能であることが分かります。

- net userの結果

\\ のユーザー アカウント

-------------------------------------------------------------------------------

Administrator DefaultAccount Guest

orochimaru WDAGUtilityAccount

- net localgroup administratorsの結果

エイリアス名 administrators

コメント コンピューター/ドメインに完全なアクセス権があります。

メンバー

-------------------------------------------------------------------------------

Administrator

orochimaru

- tasklistの結果(抜粋)

イメージ名 PID セッション名 セッション# メモリ使用量

========================= ======== ================ =========== ============

System Idle Process 0 0 8 K

System 4 0 32 K

Registry 92 0 8,732 K

smss.exe 348 0 660 K

csrss.exe 432 0 2,032 K

wininit.exe 508 0 2,036 K

services.exe 644 0 6,520 K

lsass.exe 652 0 9,936 K

svchost.exe 760 0 1,072 K

fontdrvhost.exe 772 0 1,112 K

Memory Compression 1604 0 23,020 K

vmtoolsd.exe 2664 0 11,056 K

VGAuthService.exe 2672 0 2,008 K

MsMpEng.exe 2732 0 154,328 K

dllhost.exe 3352 0 4,096 K

-- 抜粋 --

WmiPrvSE.exe 3592 0 10,920 K

msdtc.exe 3788 0 2,912 K

NisSrv.exe 4436 0 3,796 K

SearchIndexer.exe 4148 0 20,668 K

SecurityHealthService.exe 7704 0 7,836 K

SgrmBroker.exe 7484 0 4,296 K

MoUsoCoreWorker.exe 4324 0 15,056 K

w3wp.exe 2648 0 20,392 K

WmiPrvSE.exe 4960 0 6,848 K

powershell.exe 2404 0 61,132 K

conhost.exe 2912 0 3,844 K

powershell.exe 4808 0 61,256 K

SearchFilterHost.exe 1632 0 7,132 K

csrss.exe 5412 2 5,128 K

winlogon.exe 7288 2 9,308 K

fontdrvhost.exe 6040 2 3,840 K

LogonUI.exe 3692 2 78,440 K

dwm.exe 2928 2 53,564 K

tasklist.exe 2688 0 8,728 K

- Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | %{ $_.DisplayName}の結果

Lhaplus

Microsoft Edge

Microsoft Edge Update

SAKURA Editor(サクラエディタ) 2.4.1.2849 (x86)

Microsoft Visual C++ 2015-2019 Redistributable (x64) - 14.20.27508

Microsoft Visual C++ 2015-2019 Redistributable (x86) - 14.20.27508

Microsoft Visual C++ 2019 X86 Minimum Runtime - 14.20.27508

Microsoft Visual C++ 2019 X86 Additional Runtime - 14.20.27508

- Get-ChildItem C:\の結果

ディレクトリ: C:\

Mode LastWriteTime Length Name

---- ------------- ------ ----

d----- 2020/11/14 16:42 inetpub

d----- 2020/11/29 20:45 Makimono

d----- 2020/11/06 23:44 Microsoft

d----- 2019/12/07 18:14 PerfLogs

d-r--- 2020/11/26 19:13 Program Files

d-r--- 2020/11/14 16:57 Program Files (x86)

d----- 2020/11/26 19:47 share

d----- 2020/11/10 20:26 Sysinternals

d-r--- 2020/11/14 16:59 Users

d----- 2020/11/08 19:49 Web

d----- 2020/11/14 17:05 Windows

d----- 2020/11/14 17:06 Windows.old

環境内を見てみると、shareフォルダという興味深いフォルダが存在しています。shareフォルダの中を調べてみると、password.txtなど怪しいファイルの存在に気づけます。

Get-ChildItem -recurse C:\share

C:\share\Administrator

C:\share\orochimaru

C:\share\Administrator\script

C:\share\Administrator\script\EncryptPassword.ps1

C:\share\Administrator\script\password.txt

C:\share\orochimaru\script

C:\share\orochimaru\script\EncryptPassword.ps1

C:\share\orochimaru\script\password.txt

C:\share\Administrator\scriptフォルダとC:\share\orochimaru\scriptフォルダに存在するファイルの中身を確認してみます。

- C:\share\Administrator\script\EncryptPassword.ps1

$cred = Get-Credential

$cred.Password | ConvertFrom-SecureString | Out-File password.txt

- C:\share\Administrator\script\password.txt

01000000d08c9ddf0115d1118c7a00c04fc297eb01000000db49799dae870e49bcda2251effdafb1000000000200000000001066000000010000200000003a9824e7377f641ea2abdcaae9d0470caed29eceb529007e6ce8aa00616be910000000000e80000000020000200000008261fe39001005d5e8b00b75b355dd502baec05e57f9d02f4eb4bb3c1accb08530000000d54c28b5cf9dc68ae759c6b81419d660257de8d81d432dcca122f028f7ebe6feee180a927b951773cb5ad827e1c8168040000000be38705e4445f7184d7fa1d499249315d338969a268cb46c2126899822cefd06714040eaeadd8771c476ad89305cf9d9d7190eb6dd17bc38468376b5f618ae24

- C:\share\orochimaru\script\EncryptPassword.ps1

$cred = Get-Credential -UserName orochimaru

$cred.Password | ConvertFrom-SecureString -Key (1..16) | Out-File password.txt

- C:\share\orochimaru\script\password.txt

76492d1116743f0423413b16050a5345MgB8AHoAQQBxAE8ARABSADEARQBMAFMAbABJADUAOABQADcAZABXADUAbQBiAFEAPQA9AHwANgA1ADUAMQA3AGQAOAA3AGYAZQA1ADEAMAA0AGEANgAzADYANwA5ADIAMgA1ADgANAAwADMAZABmADYAMQA5ADUANwAyADgANwA4ADQAYwBhAGUAYwBhAGQAYwAzADYAYwAzADEAMQA4ADUAZgA0ADgAMgBjADEAYQA2ADgAMQA2ADIAMwA4ADgAOAA2ADIANABlADIAMQBmADYAMAA4ADgAMQA1AGIAMQBkADAANABhADMAYwA5AGUANQA5AGYA

(Administrator)EncryptPassword.ps1と(orochimaru)EncryptPassword.ps1は、認証情報をConvertFrom-SecureStringで暗号化した文字列をpassword.txtに出力していることが分かります。ConvertFrom-SecureStringは、SecureStringを暗号化された文字列に変換します。暗号化された文字列をSecureStringに変換するコマンドレットにCovertTo-SecureStringがあります。Secure Stringとは、認証情報など不要になったときにコンピューターのメモリから削除するなどして機密を保持する必要があるテキストです。暗号・復号には、DPAPI(Data Protection API)が利用されています。

DPAPIは、Windows2000以降から存在しており、安全にデータを暗号・復号するためのAPIです。Chromeなどで保存された認証情報の暗号化やWindows資格情報マネージャーなどに利用されています。DPAPIは、90日ごとに変更される512ビットのマスターキーを生成し、マスターキー、ランダムなデータから生成したセッションキーで暗号・復号を行います。古くなったマスターキーもユーザープロファイルに保存されており、過去に暗号化したものも復号できます。マスターキーは、C:\Users\ユーザー名\AppData\Roaming\Microsoft\Protect\SID に保存されています。

ディレクトリ: C:\Users\Administrator\AppData\Roaming\Microsoft\Protect\S-1-5-21-2642224021-2466155339-2432303502-500

Mode LastWriteTime Length Name

---- ------------- ------ ----

-a-hs- 2020/11/08 10:51 468 9d7949db-87ae-490e-bcda-2251effdafb1

-a-hs- 2020/11/07 0:06 468 ea09db68-821b-4cc9-b320-fd93d5954b5c

-a-hs- 2020/11/08 10:51 24 Preferred

それぞれのGUIDに紐づくマスターキーが保存されています。

[00000000]

* GUID : {9d7949db-87ae-490e-bcda-2251effdafb1}

* Time : 2020/12/06 11:22:04

* MasterKey : 6052d942****************************************************************************************************************9cc460ca

* sha1(key) : ade7********************************2c16

問題の解説に戻ります。(Administrator)password.txtを見てみましょう。暗号化された文字列にもGUIDが含まれており(赤字箇所)、どのマスターキーを利用して暗号化したか分かるようになっています。

01000000d08c9ddf0115d1118c7a00c04fc297eb01000000db49799dae870e49bcda2251effdafb1000000000200000000001066000000010000200000003a9824e7377f641ea2abdcaae9d0470caed29eceb529007e6ce8aa00616be910000000000e80000000020000200000008261fe39001005d5e8b00b75b355dd502baec05e57f9d02f4eb4bb3c1accb08530000000d54c28b5cf9dc68ae759c6b81419d660257de8d81d432dcca122f028f7ebe6feee180a927b951773cb5ad827e1c8168040000000be38705e4445f7184d7fa1d499249315d338969a268cb46c2126899822cefd06714040eaeadd8771c476ad89305cf9d9d7190eb6dd17bc38468376b5f618ae24

では、改めて(Administrator)EncryptPassword.ps1(orochimaru)EncryptPassword.ps1を確認してみるとConvertFrom-SecureStringのオプションに差異があることが分かります。ConvertFrom-SecureStringでオプションを指定しない場合、マスターキーを利用するため、マスターキーの情報を取得しない限り、復号できません。それに対して、keyオプションを指定している場合、この問題においては指定された16byteの鍵を用いてAESで暗号化しているため、鍵を特定することができれば復号できます。鍵は(1..16)となっており1から16までの配列が指定されているため、以下のスクリプトを実行することで(orochimaru)password.txtを復号できます。

$encpass = Get-Content password.txt | ConvertTo-SecureString -key (1..16)

$bstr_pass = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($encpass)

$org_pass = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr_pass)

$org_pass

スクリプトの実行結果に「Muzukash1P@ssw0rd」が出力され、orochimaruアカウントのパスワードを取得することができました。あとはorochimaruアカウントを用いてC:\Makimono\MakimonoHeaven.txtにアクセスすることでFlagをゲットすることができます。

暗号化されたパスワードと共に暗号化するプログラムも同じ場所に保存されていたというペネトレーションテストでの経験を参考に本問題を作成しました。このように仮に暗号化されていた場合でも、暗号化するプログラムが分かれば復号するプログラムも作成可能です。ただ、先にも述べたようにConvertFrom-SecureStringkeyオプションを指定せずにマスターキーを用いた暗号化を行っていれば、プログラムが分かっても復号にはハードルがあります。ConvertFrom-SecureStringkey指定しなければ、万全のように感じますが、複数名でパスワードを共有する場合や端末にログインできなくなった場合など運用形態やリスクに応じて利用可否を各自でご判断頂ければと思います。

長くなりましたが、今年度開催予定のCTFの作問も無事終了したので、自分へのご褒美に飲もうと思います、テキーラを。