体系的な権限昇格

syuya yuikura
這いよれ! Pentest Lab ep2
19 min readOct 3, 2020

--

概要:

本記事ではMITRE ATT&CKの”Privilege Escalation”の項目について紹介する。

Privilege Escalationは権限昇格を意味し、攻撃者が現在得られてるアクセス権限を高めるための攻撃を指す。具体的にはそのコンピュータの管理者権限や、ドメインコントローラーの権限の取得を目指す一連の行動だ。

MITRE ATT&CKのEnterpriseに本攻撃の様々なパターンが紹介されているため、ここで簡単に紹介を行う。ただ、本項目は非常に大量にあり、1項目をかなり省略して紹介してる(およそ文量は本編の1/10になっている)。

そのため、本項目は概要程度ととらえて、興味があれば本編を参照してほしい。

https://attack.mitre.org/tactics/TA0004/

Privilege Escalation

権限昇格には様々な手法が存在する。

下記のようにコマンドを実行できるようなものもあれば、罠を仕掛けるもの、プロセスに割り込むものなどその手法は多岐に渡る。

本項目ではその大分類を紹介していく。

Abuse Elevation Control Mechanism

権限を制御するメカニズムを利用することで権限昇格を行う手法。

攻撃の検出には、特別な権限に設定されたファイルや、特別な権限でのプロセス実行を監視し、検出する仕組みが必要。

Setuid and Setgid

setuid/setgidはアクセス権を示すフラグであり、ユーザがプログラムを実行する際に設定されたアクセス権でそのプログラムを実行することができる。

この仕組みは簡単に悪用可能だ。例えばプログラムAに管理者権限で実行するフラグが付与されていたとする。そのプログラムAに任意のプログラムを実行する機能が含まれていた場合、攻撃者はプログラムAを経由して別のプログラムを操作することで、管理者権限で任意のプログラムを操作できることになる。

Bypass User Access Control

UAC(Windowsにおいて管理者権限が必要な操作を行う際に発生するチェック機能)を回避する。

脆弱性を利用してUACをバイパスする場合や、標的型攻撃のようにユーザの行動を操作する場合など方法は多岐に渡る

Sudo and Sudo Caching

sudo(ユーザが別のユーザの権限レベルでプログラムを実行するためのコマンド)を利用した権限昇格。

/etc/sudoersには誰がどのコマンドをどの権限から実行できるかが記載されており、これを利用することで自分以上の権限でプログラムを実行できる場合がある。

また、sudoには通常パスワードが必要だが、一度パスワードを入力すれば一定期間パスワード入力が不要なことを利用して、攻撃者はパスワードを入力を回避する場合がある。

Elevated Execution with Prompt

AuthorizationExecuteWithPrivileges(MacOSの管理者権限でプログラムを実行するAPI)を利用した権限昇格。

ユーザを騙し認証情報を入力させることで任意のプログラムを管理者権限で動作させる。(現在、このAPIは非推奨)

Access Token Manipulation

アクセストークンを利用した権限昇格。Windowsは常にユーザ認証を行っているわけではなくアクセストークンによって権限を制御している。このトークンを利用することで高い権限でプログラムを実行する。

攻撃の検出には、実行中のプロセスと活動しているユーザとの権限の不整合を監視する方法などが考えられる。

Token Impersonation/Theft

Create Process with Token

Make and Impersonate Token

他のユーザーのトークンを複製して、権限を昇格させたり、アクセス制御を迂回する。

または複製されたトークンを利用して新しいプロセスを作成する。そのプロセスは複製されたトークンのユーザの権限で動作する。

Parent PID Spoofing

親プロセスの識別子(PPID)を偽装することで権限昇格を行う。

親プロセスの権限を継承している場合、偽装された子プロセスは強い権限を持てる場合がある。

SID-History Injection

SID(Windowsのユーザアカウントに紐づけられる識別子)を偽装することでより高い権限に成りすますことが可能になる。

Boot or Logon Autostart Execution

システム起動時、またはログイン時に実行されるプログラムを利用することで権限の昇格を狙う。システム起動時に必ず実行されるプログラム、あるいは仕組みを利用し、それらが実行・参照するプログラムを悪意のあるものに切り替える。

攻撃の検出には、計画されたシステムの変更と相関関係のない変更点への調査や、自動実行プロセスの追加/変更の監視が必要。

Registry Run Keys / Startup Folder

スタートアップやレジストリのrun keyにプログラムを配置することで、ユーザがログインした時にその権限でプログラムが実行される。これが悪意のあるプログラムの場合、そのままユーザの権限で任意の操作が可能になる。

Authentication Package

Windowsの認証パッケージを利用して、レジストリに登録された任意のプログラムを、そのユーザの権限で実行することが可能。

Time Providers

Windows Timeサービス(W32Time)を利用して、レジストリに登録された任意のプログラムを、そのユーザの権限で実行することが可能。

Winlogon Helper DLL

Winlogonの機能を悪用することで、ユーザがログイン時に任意のプログラムを実行できる。

Security Support Provider

セキュリティ サポート プロバイダ (SSP)を悪用することで、システムの起動時に任意のプログラムを実行できる。

Kernel Modules and Extensions

カーネルそのものを変更することでシステム起動時に任意のプログラムを実行する。ロード可能なカーネルモジュール (LKM)を利用することでシステムを再起動することなくカーネル機能を拡張できる。

Re-opened Applications

Plist Modification

plist ファイル(macOSで利用されるプロパティリスト)を変更して、ユーザがログインしたときに自動的にプログラムを実行する。

LSASS Driver

LSASS(ユーザー認証やアクセス権限の制御をおこなうWindowsのサービス)のドライバを追加・変更することで、システムに侵入することが可能

Shortcut Modification

ショートカットを編集・作成することで任意のプログラムを実行させる。

Port Monitors

ポートモニタ(ログインやファイルアクセスの要求を監視するWindowsのプログラム)を利用することで、レジストリに登録されたプログラムを実行可能。

Boot or Logon Initialization Scripts

ログイン時に実行されるスクリプトを利用することで、権限昇格を行う。

攻撃の検出には、異常なユーザによる異常なアクセスや、異常な時間帯に実行されたログインスクリプトの監視を行う。

Logon Script (Windows)

Logon Script (Mac)

Windows /Macのログオンスクリプトを利用し、システム起動時に任意のプログラムを実行する。

Network Logon Script

ネットワークのログオンスクリプトを利用し、システム起動時に任意のプログラムを実行する。

Rc.common

macOSのrc.common(Windowsのautoexec.batのようなもの)を利用し、システム起動時に任意のプログラムを実行する。

Startup Items

スタートアップに登録された様々なアイテムを利用する。

Create or Modify System Process

システムのプロセスを変更することで、攻撃者が永続性のある攻撃コードを実行し権限昇格を行う。攻撃者はシステム起動時に実行されるサービス、デーモン、またはエージェントをインストールすることで攻撃を行う。

攻撃の検出には、プロセスやプロセスに関わるファイルの変更を監視し、異常な変更を検出する必要がある。

Launch Agent

macOSではlaunch agent(ログイン時に実行されるプロセス)を編集する。

Systemd Service

Linuxではsystemdを利用し、悪意のあるプロセスを追加する。

Windows Service

Windowsではsc.exeやRegなどを利用し、悪意のあるプロセスを追加する。

Launch Daemon

(macOSの場合)エージェント(ログイン時に実行されるプロセス)に限らず、デーモン(常駐プログラム)として悪意のあるプロセスが実行され続けることもある。

Event Triggered Execution

攻撃者は特定のイベントの発生時に、任意のプロセスを実行するように設定する場合がある。

攻撃の検出には、これらイベント時に発生するプロセスが計画通りのものと変化がないかを定期的に監視する必要がある。

Change Default File Association

ファイルタイプの関連付けによって実行される悪意あるコンテンツを利用する。Windowsは任意のファイル拡張子を開いたときに実行するコマンドを指定することができる。

Screensaver

スクリーンセイバー実行時のプロセスを設定することで、ユーザが非アクティブになった際に、任意のコマンドが実行することができる。

Windows Management Instrumentation Event Subscription

WMIの機能を使用してイベントを発生させ、任意のコマンドを実行する。WMIでは実時間、ログイン、コンピュータの稼働時間などでイベントを設定できる。

.bash_profile and .bashrc

bashスクリプトを利用する。これらは新しいシェルが開いたときや、ログインした時に実行される。

Trap

trapコマンド(割り込みシグナルを受け取った時の動作を設定するコマンド)を利用する。例えばctrl + cが押された際に任意のコマンドを実行する。

LC_LOAD_DYLIB Addition

Mach-O(Mac OS Xのバイナリフォーマット)ヘッダーを利用する。本ヘッダーはバイナリ実行時にロードするダイナミックライブラリ(dylib)を示すが、これを悪意あるプロセスに変更できる。

Netsh Helper DLL

Netsh.exe(ネットワーク構成を表示したり変更したりするためのユーティリティ)を利用する。Netsh.exeが実行されるたびに発生するNetsh HelperDLLを使い、任意のプロセスを実行する。

Accessibility Features

Windowsのアクセシビリティ機能(例:Shitを5回連続押す)で発生するプロセスを変更することでシステムを乗っ取る。これらによりシステムにログインせずにバックドアを設置することが可能になることがある。

AppCert DLLs

AppInit DLLs

appcert(WindowsApp Certification Kitx64プログラムの一部)やAppInitのDLL読み込みを悪用する。

Application Shimming

アプリケーションシム(Windowsアプリケーション互換性フレームワーク)を利用する。

Image File Execution Options Injection

Image File Execution Options(IEFO)デバッガーを利用する。デバッカーとして任意のプロセスを割り当てることで権限昇格を実行する。

PowerShell Profile

PowerShellプロファイル(PowerShellが起動される際に実行されるスクリプト)を利用する。PowerShell起動時に任意のコードが実行できるようになる。

Emond

イベントモニターデーモン(emond)を利用する。emondはサービスからイベントを受け取りルール通りにアクションを実行するデーモンである。このアクションに任意のコマンドを設定する。

Component Object Model Hijacking

コンポーネントオブジェクトモデル(COM)オブジェクトを利用する。COMを書き換えることでソフトウェアへの参照関係が変更され、正当なソフトウェアの代わりに悪意あるコードが実行される。

Exploitation for Privilege Escalation

ソフト/OSの脆弱性を利用して権限昇格を行う。

対策には、ソフトウェアを常にアップデートする必要がある。また、脆弱性の悪用は監視プロセスに引っかからない可能性がある(脆弱性の利用は、ソフトウェアとしては正常に見えるため)。

Group Policy Modification

グループポリシーオブジェクト(GPO)を変更して権限昇格を行う。GPOの変更はセキュリティソフトの無効化/変更、アカウントの作成、サービスの実行など多くのことが可能になる。

攻撃の検出には、WindowsのイベントログにGPOの変更が記録されるため、その点を監視することが有効。

Hijack Execution Flow

OSがプロセスを実行する方法やパスを変更することで任意のプロセスを実行させる。

攻撃の検出には、DLLの移動、名前変更、置換、または変更についてファイルシステムの監視。また、環境変数への変更、およびこれらの変更を実装するためのコマンドも監視する。

DLL Search Order Hijacking

DLLのロード順を変更することで、悪意あるプロセスを実行する。方法としてはロードされるDLLそのものを悪意あるものに入れ替える、またはDLLすべきファイルの指定を変更させる等が考えられる。

DLL Side-Loading

DLLのロードに使用されるライブラリマニフェストを変更する。それにより悪意あるライブラリを実行させる。

Dylib Hijacking

MacOSにおいて、dylib(自身に依存するライブラリのパスが設定されている)を変更することで、悪意あるライブラリを実行させる。

Executable Installer File Permissions Weakness

Services File Permissions Weakness

Services Registry Permissions Weakness

インストーラー/サービス/レジストリが使用するプロセスやファイルを変更ことにより、悪意あるプロセスを実行する。これらが高い権限で実行される場合、別のプロセスも同等の権限で実行される。

LD_PRELOAD

ライブラリのロードに使用されるダイナミックリンカーを変更する。この変更にはLD_PRELOAD(環境変数であり、指定したライブラリが最優先で読み込まれる)が使われる。

Path Interception by PATH Environment Variable

WindowsのPATH環境変数を変更する。PATHには複数のディレクトリが登録可能なため、そこに悪意あるプロセスを設定する。

Path Interception by Search Order Hijacking

Windowsにおいて、パスを与えられていないプログラムを検索する順序の仕様を悪用する。検索先のディレクトリに似た名前の実行ファイルを配置することで、それを実行できる場合がある。

Path Interception by Unquoted Path

パスに1つ以上のスペースがあり、引用符で囲まれていないファイルパスを悪用する。この記載方法は攻撃者にパスの変更を可能にし、任意のプロセスを実行される。

COR_PROFILER

COR_PROFILER環境変数を利用して、.NETCLRをロードするプログラムの実行フローを乗っ取る。これにより共通言語ランタイム(CLR)が呼び出されるたびに、すべての.NETプロセスのコンテキストで悪意のあるプロセスが実行される。

Process Injection

プロセスインジェクションは、別のライブプロセスのアドレス空間で任意のコードを実行する。プロセスインジェクションによる実行は、正当なプロセスの下で実行が隠されるため、セキュリティ製品からの検出を回避することがある。

攻撃の検出には、プロセスの動作を分析して、通常は実行しないアクションを実行しているかどうかを判断する。

Dynamic-link Library Injection

DLLインジェクションは、新しいスレッドを呼び出してDLLをロードする前に、ターゲットプロセスの仮想アドレス空間にDLLへのパスを書き込むことによって実行される。

Portable Executable Injection

PEインジェクションは、新しいスレッドを介して呼び出す前に、コードをターゲットプロセスの仮想アドレス空間にコピーすることによって実行される。

Thread Execution Hijacking

スレッド実行ハイジャックは、既存のプロセスを一時停止し、そのメモリのマッピングを解除/ホローすることによって実行される。その後、悪意のあるコードまたはDLLへのパスに置き換える。

Asynchronous Procedure Call

APCインジェクションは、プロセスのスレッドのAPCキュー(非同期プロシージャ呼び出しが登録されたもの)に悪意のあるコードを添付することによって実行される。APC関数は、スレッドが変更可能な状態に入ると実行される。

Thread Local Storage

TLSコールバックインジェクションでは、ポータブル実行可能ファイル(PE)内のポインターを操作して、コードの正当なエントリポイントに到達する前にプロセスを悪意のあるコードにリダイレクトする。

Ptrace System Calls

Ptraceシステムコールインジェクションは、実行中のプロセス(例:malloc)に任意のコードを書き込み、そのメモリをPTRACE_SETREGSで呼び出して、次に実行する命令を含むレジスタを設定することによって実行される。

Proc Memory

Procメモリインジェクションは、/ procファイルシステムによって提供されるメモリマッピングを使用してターゲットプロセスのスタックを上書きすることによって実行される。

Extra Window Memory Injection

EWMは、そのウィンドウに固有のデータを格納することを目的としており、ここに悪意あるプロセスへのポインタを格納することで実行される。

Process Hollowing

プロセスの空洞化は、一時停止状態でプロセスを作成し、そのメモリをマッピング解除/空洞化することで実行される。そのあとに悪意あるプロセスに置き換えることが可能。

Process Doppelgänging

TxF(WindowsトランザクションNTFS)を悪用して、ファイルを使用しないプロセスインジェクションのバリエーションを実行する。Process Hollowingと同様に、正当なプロセスのメモリを置き換え、防御と検出を回避する。

VDSO Hijacking

VDSOハイジャックには、vdso共有オブジェクトからプロセスにマップされたsyscallインターフェイスコードスタブを乗っ取って、syscallを実行し、悪意のある共有オブジェクトを開いてマップする。

Scheduled Task/Job

タスクスケジューリング機能を悪用して、悪意のあるコードを実行する。

攻撃の検出には、予定された以外のタスクがスケジュールされていないか、スケジュールされたタスクが予定外の動きをしていないかを監視する。

At (Linux, Windows)

Atコマンドは指定した時刻に、指定のプログラムを実行する。ここに悪意あるプロセスを仕込む。

Cron

Cronを利用し、指定した時刻に、指定のプログラムを実行する。ここに悪意あるプロセスを仕込む。Atと比較し定期的にプログラムを実行しやすい。

Launchd

macOSのLaunchdデーモンを利用し、悪意あるプロセスをスケジューリングする。

Scheduled Task

Windowsのタスクスケジューラを利用し、悪意あるプロセスをスケジューリングする。

Valid Accounts

既存アカウントの認証情報を取得し、そこから内部資源の搾取やより高い権限への昇格を行う。

攻撃の検出には、堅牢で一貫性のあるアカウントアクティビティ監査ポリシーを構成する。1アカウントの同時ログインや、時間外のログイン、ログイン時に対象社員は施設内にいたか…等。また、管理外のアカウントが存在しないかも調査する。

Default Accounts

OSやサービスのデフォルトアカウントを利用し、システムに侵入する。

Domain Accounts

ドメインアカウントの資格情報を取得する。そのためにOS資格情報のダンプやパスワードの再利用などのさまざまな手段を実行する。

Local Accounts

ローカルアカウントの資格情報を取得して悪用する。このアカウントから権限昇格が始まる場合が多く、また管理者が乗っ取られると全てのローカルアカウントが危険にさらされる。

Cloud Accounts

クラウドアカウントは、クラウドサービスプロバイダーやSaaSアプリケーション内のリソースを管理するためのアカウント。この認証情報が乗っ取られることで、外部から組織内部に侵入される。

まとめ

本記事では権限昇格にどのような種類があるかをMITRE ATT&CKを参考に紹介した。

非常に多くの種類があることが理解してもらえたと思う。これらは単純な対策だけでは防ぐのは不可能だ。1つ1つに対して、この攻撃は防げるのか、攻撃を受けた場合は検出できるのかを検討する必要がある。

そしてそれらには専門に知識が必要不可欠であり、MITRE ATT&CKの他の項目とともに様々な知識を学習していくことが求められている。

--

--