Linux Privilege Escalation
システム情報
OS情報
実行中のOSに関する知識を得ることから始めましょう。
パス
もしPATH
変数の中の任意のフォルダに書き込み権限がある場合、いくつかのライブラリやバイナリを乗っ取ることができるかもしれません:
環境情報
環境変数に興味深い情報、パスワード、またはAPIキーがありますか?
カーネルの脆弱性
カーネルのバージョンを確認し、特権昇格に使用できる脆弱性があるかどうかをチェックします。
良い脆弱なカーネルのリストとすでにコンパイルされたエクスプロイトがこちらにあります: https://github.com/lucyoa/kernel-exploits および exploitdb sploits. いくつかのコンパイルされたエクスプロイトを見つけることができる他のサイト: https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack
そのウェブサイトからすべての脆弱なカーネルバージョンを抽出するには:
以下は、特権昇格を検索するのに役立つツールです:
linux-exploit-suggester.sh linux-exploit-suggester2.pl linuxprivchecker.py(被害者で実行し、カーネル2.xの脆弱性のみをチェック)
常にGoogleでカーネルバージョンを検索してください。おそらくあなたのカーネルバージョンはあるカーネルの脆弱性に記載されており、その脆弱性が有効であることを確認できます。
CVE-2016-5195(DirtyCow)
Linux特権昇格 - Linuxカーネル <= 3.19.0-73.8
Sudo バージョン
脆弱な sudo バージョンに基づいています:
あなたは、このgrepを使用して、sudoのバージョンが脆弱かどうかを確認できます。
sudo < v1.28
@sickrov から
Dmesg署名検証に失敗しました
この脆弱性がどのように悪用されるかの例については、HTBのsmasher2ボックスを参照してください
より多くのシステム列挙
可能な防御策の列挙
AppArmor
Grsecurity
Grsecurityは、Linuxカーネルのセキュリティ強化パッチであり、特権昇格攻撃に対する保護を提供します。
PaX
Execshield
Execshieldは、Linuxカーネルのセキュリティ機能の1つであり、スタックやヒープのオーバーフローを防ぐために使用されます。これにより、悪意のあるコードが実行されることを防ぎ、特権昇格攻撃などの脅威からシステムを保護します。
SElinux
SElinux(Security-Enhanced Linux)は、Linuxカーネルに組み込まれたセキュリティ機能の1つです。SElinuxは、アクセス制御と強化された権限管理を提供し、システムのセキュリティを向上させるのに役立ちます。
ASLR
ASLR(Address Space Layout Randomization)は、攻撃者が悪用するためのメモリの配置をランダム化するセキュリティ機能です。
Docker Breakout
Dockerコンテナ内にいる場合、それから脱出を試みることができます:
pageDocker Securityドライブ
マウントされているものとアンマウントされているものをチェックし、どこにどのようにマウントされているかを確認してください。何かがアンマウントされている場合は、それをマウントしてプライベート情報をチェックすることができます。
便利なソフトウェア
有用なバイナリを列挙します
また、インストールされているコンパイラを確認してください。これは、カーネルエクスプロイトを使用する必要がある場合に役立ちます。そのエクスプロイトをコンパイルすることが推奨されているため、そのマシンで(または類似のマシンで)コンパイルする必要があります。
脆弱なソフトウェアのインストール
インストールされたパッケージやサービスのバージョンを確認してください。たとえば古いNagiosバージョンなど、特権昇格に悪用される可能性があるかもしれません... より疑わしいインストールされたソフトウェアのバージョンを手動で確認することを推奨します。
もしマシンへのSSHアクセス権がある場合は、openVASを使用して、マシン内にインストールされている古いバージョンや脆弱なソフトウェアをチェックすることもできます。
これらのコマンドはほとんど役に立たない情報を表示する可能性があるため、既知の脆弱性に対してインストールされたソフトウェアのバージョンが脆弱かどうかをチェックするOpenVASなどのアプリケーションを使用することをお勧めします
プロセス
実行されているプロセスを確認し、適切な権限よりも多くの権限を持つプロセスがないかをチェックしてください(たとえば、rootユーザーによって実行されているtomcatなど)。
常に実行中のelectron/cef/chromium debuggersを確認してください。特権を昇格するために悪用できる可能性があります。Linpeasは、プロセスのコマンドライン内に--inspect
パラメータがあるかどうかをチェックしてこれらを検出します。
また、プロセスのバイナリに対する特権を確認してください。他のユーザーのものを上書きできるかもしれません。
プロセスの監視
pspyなどのツールを使用してプロセスを監視できます。これは、脆弱なプロセスが頻繁に実行されているか、一連の要件が満たされたときに特に役立ちます。
プロセスメモリ
サーバーの一部のサービスは、メモリ内に平文で資格情報を保存します。 通常、他のユーザーに属するプロセスのメモリを読むにはroot権限が必要です。そのため、既にrootであり、さらに資格情報を発見したい場合に通常よりも有用です。 ただし、通常のユーザーとして、所有するプロセスのメモリを読むことができることを覚えておいてください。
現在、ほとんどのマシンはデフォルトでptraceを許可していないことに注意してください。つまり、特権のないユーザーに属する他のプロセスをダンプすることはできません。
ファイル /proc/sys/kernel/yama/ptrace_scope は、ptraceのアクセス可能性を制御します:
kernel.yama.ptrace_scope = 0: 同じuidを持つプロセスであれば、すべてのプロセスをデバッグできます。これがptracingが機能する古典的な方法です。
kernel.yama.ptrace_scope = 1: 親プロセスのみをデバッグできます。
kernel.yama.ptrace_scope = 2: 管理者のみがptraceを使用できます。CAP_SYS_PTRACE機能が必要です。
kernel.yama.ptrace_scope = 3: ptraceでプロセスをトレースできません。一度設定すると、再起動してptracingを再度有効にする必要があります。
GDB
FTPサービスのメモリにアクセスできる場合(例えば)、Heapを取得し、その資格情報を検索できます。
GDBスクリプト
/proc/$pid/maps と /proc/$pid/mem
特定のプロセスIDに対して、mapsはそのプロセスの 仮想アドレス空間内でのメモリのマッピング方法を示し、各マップされた領域の権限も示します。 mem疑似ファイルはプロセスのメモリ自体を公開します。 mapsファイルからは、どのメモリ領域が読み取り可能かとそのオフセットがわかります。この情報を使用して、memファイルに移動し、すべての読み取り可能な領域をファイルにダンプします。
/dev/mem
/dev/mem
はシステムの物理メモリにアクセスを提供し、仮想メモリではありません。カーネルの仮想アドレス空間には/dev/kmem
を使用できます。
通常、/dev/mem
はrootとkmemグループのみが読み取り可能です。
ProcDump for Linux
ProcDumpは、Windows向けSysinternalsツールのクラシックなProcDumpツールのLinuxにおける再構想版です。https://github.com/Sysinternals/ProcDump-for-Linux から入手できます。
ツール
プロセスメモリをダンプするには、次のツールを使用できます:
https://github.com/hajzer/bash-memory-dump (root) - _rootの要件を手動で削除して、所有しているプロセスをダンプできます
https://www.delaat.net/rp/2016-2017/p97/report.pdf からのスクリプト A.5 (rootが必要)
プロセスメモリからの資格情報
手動の例
認証プロセスが実行されていることがわかった場合:
あなたはプロセスをダンプすることができます(異なる方法を見つけるために前のセクションを参照してください)そしてメモリ内で資格情報を検索することができます:
mimipenguin
ツールhttps://github.com/huntergregal/mimipenguinは、メモリから平文の資格情報を盗み出し、一部のよく知られたファイルからも取得します。正しく動作するには、root権限が必要です。
機能 | プロセス名 |
---|---|
GDMパスワード(Kali Desktop、Debian Desktop) | gdm-password |
Gnome Keyring(Ubuntu Desktop、ArchLinux Desktop) | gnome-keyring-daemon |
LightDM(Ubuntu Desktop) | lightdm |
VSFTPd(アクティブFTP接続) | vsftpd |
Apache2(アクティブHTTPベーシック認証セッション) | apache2 |
OpenSSH(アクティブSSHセッション - Sudo使用) | sshd: |
Search Regexes/truffleproc
予定された/Cron ジョブ
スケジュールされたジョブが脆弱性を持っていないか確認してください。おそらく、root によって実行されるスクリプトを悪用できるかもしれません(ワイルドカードの脆弱性?root が使用するファイルを変更できますか?シンボリックリンクを使用しますか?root が使用するディレクトリに特定のファイルを作成しますか?)。
Cron パス
例えば、/etc/crontab 内に以下の PATH を見つけることができます: PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
(ユーザー "user" が /home/user に対して書き込み権限を持っていることに注意)
この crontab 内で、root ユーザーがパスを設定せずにコマンドやスクリプトを実行しようとした場合。例えば: * * * * root overwrite.sh その後、次のようにして root シェルを取得できます:
スクリプトをワイルドカードで使用するCron(ワイルドカードインジェクション)
ルートによって実行されるスクリプトにコマンド内に "*" がある場合、これを悪用して予期しないことを行うことができます(例:特権昇格)。例:
ワイルドカードがパスの前にある場合 /some/path/* のように、脆弱性はありません( ./* も同様です)。
詳細なワイルドカードの悪用テクニックについては、次のページを参照してください:
pageWildcards Spare tricksCronスクリプトの上書きとシンボリックリンク
rootユーザーによって実行されるcronスクリプトを変更できる場合、非常に簡単にシェルを取得できます:
もしrootによって実行されたスクリプトが完全なアクセス権を持つディレクトリを使用している場合、そのフォルダを削除して別のスクリプトが制御可能な別のフォルダへのシンボリックリンクフォルダを作成することが役立つかもしれません
頻繁な cron ジョブ
プロセスを監視して、1分、2分、または5分ごとに実行されているプロセスを検索できます。これを利用して特権を昇格させることができるかもしれません。
たとえば、1分間に0.1秒ごとに監視し、実行されたコマンドが最も少ない順にソートして、最も実行されたコマンドを削除するには、次のようにします:
pspyを使用することもできます(これにより、開始されるすべてのプロセスが監視およびリスト化されます)。
不可視のcronジョブ
コメントの後にキャリッジリターンを入れることで(改行文字なしで)、cronジョブを作成することが可能です。例(キャリッジリターン文字に注意してください):
サービス
書き込み可能な .service ファイル
.service
ファイルを書き込むことができるかどうかを確認します。もし書き込める場合、サービスが開始、再起動、または停止されるときに、バックドアを実行するように変更できます(おそらくマシンが再起動されるまで待つ必要があるかもしれません)。
例えば、.service
ファイル内にバックドアを作成する:ExecStart=/tmp/script.sh
書き込み可能なサービスのバイナリ
サービスによって実行されるバイナリに書き込み権限がある場合、それらをバックドアに変更できることに注意してください。そのため、サービスが再実行されるときにバックドアが実行されます。
systemd PATH - 相対パス
systemd が使用する PATH を次で確認できます:
もし、パスの中のどこかに書き込み権限があることがわかった場合、特権昇格ができるかもしれません。次のようなサービス構成ファイルで使用されている相対パスを検索する必要があります:
その後、systemd PATHフォルダ内に相対パスバイナリと同じ名前の実行可能ファイルを作成し、サービスが脆弱なアクション(Start、Stop、Reload)を実行するよう要求されたときに、バックドアが実行されるようにします(通常、権限のないユーザーはサービスを開始/停止できませんが、sudo -l
を使用できるかどうかを確認してください)。
**man systemd.service
**でサービスについて詳しく学びます。
タイマー
タイマーは、名前が**.timer**
で終わるsystemdユニットファイルで、**.service**
ファイルやイベントを制御します。タイマーは、カレンダー時間イベントとモノトニック時間イベントの組み込みサポートを持つため、cronの代替として使用でき、非同期で実行できます。
すべてのタイマーを列挙するには、次のコマンドを使用します:
書き込み可能なタイマー
タイマーを変更できる場合、systemd.unit(.serviceや.targetなど)の存在するものを実行させることができます。
ドキュメントには、ユニットが何であるかが記載されています:
このタイマーが経過したときにアクティブ化するユニット。引数はユニット名であり、その接尾辞は「.timer」ではありません。指定されていない場合、この値は、タイマーユニットと同じ名前のサービスにデフォルトで設定されます(上記を参照)。アクティブ化されるユニット名とタイマーユニットのユニット名が、接尾辞を除いて同一であることが推奨されています。
したがって、この権限を悪用するには、次のことが必要です:
書き込み可能なバイナリを実行している
.service
などのsystemdユニットを見つける相対パスを実行しているsystemdユニットを見つけ、systemd PATH上で書き込み権限を持っている(その実行可能ファイルをなりすますため)
man systemd.timer
でタイマーについて詳しく学びます。
タイマーの有効化
タイマーを有効にするには、ルート権限が必要で、次のコマンドを実行します:
タイマーは、/etc/systemd/system/<WantedBy_section>.wants/<name>.timer
にシンボリックリンクを作成することでアクティブ化されます。
ソケット
Unixドメインソケット(UDS)は、クライアントサーバーモデル内で同じマシンまたは異なるマシン間でプロセス間通信を可能にします。これらは標準のUnix記述子ファイルを使用してコンピュータ間通信を行い、.socket
ファイルを介して設定されます。
ソケットは.socket
ファイルを使用して構成できます。
**man systemd.socket
**でソケットについて詳しく学びます。このファイル内では、いくつかの興味深いパラメータを構成できます:
ListenStream
、ListenDatagram
、ListenSequentialPacket
、ListenFIFO
、ListenSpecial
、ListenNetlink
、ListenMessageQueue
、ListenUSBFunction
: これらのオプションは異なりますが、ソケットがどこでリッスンするかを示すために使用されます(AF_UNIXソケットファイルのパス、リッスンするIPv4/6および/またはポート番号など)。Accept
: ブール値の引数を取ります。trueの場合、受信接続ごとにサービスインスタンスが生成され、接続ソケットのみが渡されます。falseの場合、すべてのリッスンソケット自体が開始されたサービスユニットに渡され、すべての接続に対して1つのサービスユニットが生成されます。この値は、データグラムソケットおよびFIFOの場合には無視され、1つのサービスユニットがすべての受信トラフィックを無条件に処理します。デフォルトはfalseです。パフォーマンス上の理由から、新しいデーモンはAccept=no
に適した方法でのみ記述することが推奨されます。ExecStartPre
、ExecStartPost
: 1つ以上のコマンドラインを取り、リッスンソケット/FIFOが作成およびバインドされる前または後に実行されるコマンドです。コマンドラインの最初のトークンは絶対ファイル名でなければならず、その後にプロセスの引数が続きます。ExecStopPre
、ExecStopPost
: リッスンソケット/FIFOが閉じられ、削除される前または後に実行される追加のコマンドです。Service
: 受信トラフィックでアクティブ化するサービスユニット名を指定します。この設定は、Accept=noのソケットにのみ許可されています。デフォルトでは、ソケットと同じ名前のサービス(接尾辞が置換されたもの)がデフォルトです。ほとんどの場合、このオプションを使用する必要はないはずです。
書き込み可能な.socket
ファイル
.socket
ファイル書き込み可能な.socket
ファイルを見つけた場合、[Socket]
セクションの冒頭に次のようなものを追加できます: ExecStartPre=/home/kali/sys/backdoor
、そしてバックドアはソケットが作成される前に実行されます。したがって、おそらくマシンが再起動されるまで待つ必要があります。
そのソケットファイル構成を使用している必要があることに注意してください。そうでない場合、バックドアは実行されません
書き込み可能なソケット
(ここではUnixソケットについて話しており、設定.socket
ファイルについてではありません)書き込み可能なソケットを特定した場合、そのソケットと通信し、脆弱性を悪用する可能性があります。
Unixソケットの列挙
生の接続
攻撃例:
pageSocket Command InjectionHTTP ソケット
HTTP リクエストを待ち受ける ソケット がいくつか存在する可能性があることに注意してください(私は .socket ファイルではなく、Unix ソケットとして機能するファイルについて話しています)。次のコマンドで確認できます:
Writable Docker Socket
Dockerソケットは、通常/var/run/docker.sock
にあり、セキュリティを確保する必要がある重要なファイルです。デフォルトでは、root
ユーザーとdocker
グループのメンバーによって書き込みが可能です。このソケットへの書き込みアクセスを持つことは特権昇格につながる可能性があります。これがどのように行われるか、およびDocker CLIが利用できない場合の代替方法について説明します。
Docker CLIを使用した特権昇格
Dockerソケットへの書き込みアクセス権がある場合、次のコマンドを使用して特権を昇格させることができます。
Docker APIを直接使用する
Docker CLIが利用できない場合、DockerソケットをDocker APIとcurl
コマンドを使用して操作することができます。
Dockerイメージのリスト: 利用可能なイメージのリストを取得します。
コンテナの作成: ホストシステムのルートディレクトリをマウントするコンテナを作成するリクエストを送信します。
新しく作成したコンテナを起動します:
コンテナにアタッチ:
socat
を使用してコンテナに接続し、それ内でコマンドを実行できるようにします。
socat
接続を設定した後、ホストのファイルシステムへのルートレベルアクセスを持つコンテナ内で直接コマンドを実行できます。
その他
docker
グループに所属しているためドッカーソケットに書き込み権限がある場合、特権を昇格させるためのさらなる方法があります。docker APIがポートでリスニングしている場合、それを妨害することもできるかもしれません。
dockerから脱出したり特権を昇格させるために悪用する方法については、以下をチェックしてください:
pageDocker SecurityContainerd (ctr) 特権昇格
**ctr
**コマンドを使用できることがわかった場合、特権を昇格させるために悪用できる可能性があるため、以下のページを読んでください:
RunC 特権昇格
**runc
**コマンドを使用できることがわかった場合、特権を昇格させるために悪用できる可能性があるため、以下のページを読んでください:
D-Bus
D-Busは、アプリケーションが効率的に相互作用しデータを共有するための高度なプロセス間通信(IPC)システムです。現代のLinuxシステムを念頭に置いて設計され、異なる形式のアプリケーション間通信のための堅牢なフレームワークを提供します。
このシステムは多目的であり、プロセス間のデータ交換を向上させる基本的なIPCをサポートし、拡張UNIXドメインソケットを思い起こさせます。さらに、イベントやシグナルのブロードキャストを支援し、システムコンポーネント間のシームレスな統合を促進します。たとえば、Bluetoothデーモンからの着信コールに関するシグナルは、音楽プレーヤーにミュートするよう促し、ユーザーエクスペリエンスを向上させます。さらに、D-Busはリモートオブジェクトシステムをサポートし、アプリケーション間のサービスリクエストやメソッド呼び出しを簡素化し、従来は複雑だったプロセスを合理化します。
D-Busは許可/拒否モデルで動作し、一致するポリシールールの累積効果に基づいてメッセージの権限(メソッド呼び出し、シグナルの発行など)を管理します。これらのポリシーはバスとのやり取りを指定し、これらの権限の悪用を通じて特権昇格が可能になる可能性があります。
/etc/dbus-1/system.d/wpa_supplicant.conf
にあるこのようなポリシーの例では、ルートユーザーがfi.w1.wpa_supplicant1
を所有し、それにメッセージを送信し、受信する権限が詳細に記載されています。
特定のユーザーまたはグループが指定されていないポリシーは普遍的に適用され、"default"コンテキストポリシーは他の特定のポリシーでカバーされていないすべてに適用されます。
ここでD-Bus通信の列挙と悪用方法を学びます:
pageD-Bus Enumeration & Command Injection Privilege Escalationネットワーク
常にネットワークを列挙し、マシンの位置を特定することは興味深いです。
一般的な列挙
オープンポート
アクセスする前に、マシンで実行されているネットワークサービスを常にチェックしてください。
スニッフィング
トラフィックを嗅覚できるかどうかをチェックしてください。できる場合、いくつかの資格情報を取得できるかもしれません。
ユーザー
一般的な列挙
自分が誰であり、どの特権を持っているか、システムにどのユーザーがいるか、どのユーザーがログインできるか、どのユーザーがルート権限を持っているかを確認します。
大きなUID
一部のLinuxバージョンは、UID > INT_MAXを持つユーザーが特権を昇格させることができるバグの影響を受けました。詳細はこちら、こちら、およびこちらを参照してください。
systemd-run -t /bin/bash
を使用して悪用してください。
グループ
ルート権限を付与する可能性のあるいくつかのグループのメンバーであるかどうかを確認してください:
pageInteresting Groups - Linux Privescクリップボード
クリップボード内に興味深い情報があるかどうかを確認してください(可能であれば)
パスワードポリシー
既知のパスワード
環境の任意のパスワードを知っている場合は、そのパスワードを使用して各ユーザーとしてログインを試みてください。
Su Brute
たくさんのノイズを気にしない場合、かつコンピューターにsu
とtimeout
バイナリが存在する場合は、su-bruteforceを使用してユーザーをブルートフォースできます。
Linpeasは、-a
パラメータを使用してユーザーをブルートフォースすることもできます。
書き込み可能なPATHの悪用
$PATH
$PATHのいくつかのフォルダに書き込み権限があることがわかった場合、書き込み可能なフォルダ内にバックドアを作成し、そのバックドアの名前を、別のユーザー(理想的にはroot)によって実行されるコマンドの名前にすることで、特権を昇格させることができるかもしれません。このコマンドは、$PATH内の書き込み可能なフォルダよりも前に位置するフォルダから読み込まれていない必要があります。
SUDOとSUID
sudoを使用していくつかのコマンドを実行することが許可されているか、suidビットが設定されているかもしれません。次のコマンドを使用して確認してください:
いくつかの予期しないコマンドが、ファイルの読み取りや書き込み、さらにはコマンドの実行を許可します。 例えば:
NOPASSWD
Sudoの設定は、ユーザーがパスワードを知らずに別のユーザーの特権でコマンドを実行できるようにする可能性があります。
以下は、ユーザーdemo
がroot
としてvim
を実行できる例です。これにより、ルートディレクトリにsshキーを追加するか、sh
を呼び出すことでシェルを取得することが簡単になります。
SETENV
このディレクティブは、何かを実行する際に環境変数を設定することをユーザーに許可します。
この例は、HTBマシンAdmirerに基づいて、スクリプトをrootとして実行する際にPYTHONPATHハイジャックに脆弱であり、任意のPythonライブラリを読み込むことができました。
Sudo実行パスのバイパス
他のファイルを読むか、シンボリックリンクを使用します。例えば、sudoersファイル内: hacker10 ALL= (root) /bin/less /var/log/*
もしワイルドカード(*)が使用されている場合、さらに簡単です:
対策: https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/
コマンドパスを指定せずにSudoコマンド/SUIDバイナリを使用する
もしsudo権限がパスを指定せずに単一のコマンドに与えられている場合: hacker10 ALL= (root) less、PATH変数を変更することで悪用できます。
このテクニックは、suid バイナリがパスを指定せずに別のコマンドを実行する場合にも使用できます(常に strings **で奇妙なSUIDバイナリの内容を確認してください)。
コマンドパスを持つSUIDバイナリ
suid バイナリがパスを指定して別のコマンドを実行する場合、その後、suidファイルが呼び出しているコマンドと同じ名前の関数をエクスポートしようとすることができます。
たとえば、suidバイナリが /usr/sbin/service apache2 start を呼び出す場合、その関数を作成してエクスポートしようとする必要があります:
LD_PRELOAD & LD_LIBRARY_PATH
LD_PRELOAD環境変数は、ローダーによって他のすべてのライブラリ、標準Cライブラリ(libc.so
)を含むすべてのライブラリよりも前に読み込まれる1つ以上の共有ライブラリ(.soファイル)を指定するために使用されます。このプロセスは、ライブラリのプリロードとして知られています。
ただし、システムセキュリティを維持し、特にsuid/sgid実行可能ファイルでこの機能が悪用されるのを防ぐために、システムは特定の条件を強制します:
ローダーは、実ユーザーID(ruid)が有効ユーザーID(euid)と一致しない実行可能ファイルでは、LD_PRELOADを無視します。
suid/sgidを持つ実行可能ファイルの場合、標準パスにあるかつsuid/sgidであるライブラリのみがプリロードされます。
特権昇格は、sudo
でコマンドを実行できる権限がある場合、およびsudo -l
の出力にenv_keep+=LD_PRELOADステートメントが含まれている場合に発生する可能性があります。この構成により、LD_PRELOAD環境変数が永続化され、sudo
でコマンドが実行されている場合でも認識され、特権を昇格させた状態で任意のコードが実行される可能性があります。
保存先を /tmp/pe.c としてください。
その後、次のコマンドを使用してコンパイルしてください:
最終的に、特権を昇格して実行します。
攻撃者がLD_LIBRARY_PATH環境変数を制御している場合、同様の権限昇格が悪用される可能性があります。なぜなら、攻撃者はライブラリが検索されるパスを制御しているからです。
SUID バイナリ – .so インジェクション
SUID 権限を持つバイナリが異常に見える場合、.so ファイルを適切に読み込んでいるかどうかを確認するのは良い習慣です。次のコマンドを実行して確認できます:
例えば、"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"のようなエラーに遭遇すると、悪用の可能性が示唆されます。
これを悪用するためには、次のコードが含まれたCファイル、例えば"/path/to/.config/libcalc.c"を作成する必要があります:
このコードは、コンパイルおよび実行されると、ファイルの権限を操作して特権を昇格し、特権を持つシェルを実行することを目的としています。
上記のCファイルを共有オブジェクト(.so)ファイルにコンパイルするには、次のコマンドを使用します:
最終的に、影響を受けるSUIDバイナリを実行すると、悪用がトリガーされ、システムが侵害される可能性があります。
共有オブジェクトのハイジャック
以下は、Linuxハードニング/特権昇格/README.mdファイルからのコンテンツです。該当する英語のテキストを日本語に翻訳してください。MarkdownとHTMLの構文をそのまま保持したまま翻訳してください。コード、ハッキング技術名、ハッキング用語、クラウド/SaaSプラットフォーム名(Workspace、aws、gcpなど)、'leak'、pentesting、およびMarkdownタグなどは翻訳しないでください。また、翻訳とMarkdown構文以外の追加は行わないでください。
もし次のようなエラーが表示された場合、
それは、生成したライブラリに a_function_name
という名前の関数が必要です。
GTFOBins
GTFOBins は、攻撃者がローカルセキュリティ制限をバイパスするために悪用できるUnixバイナリの厳選されたリストです。GTFOArgs も同様ですが、コマンドに引数のみをインジェクトできる場合に使用します。
このプロジェクトは、Unixバイナリの正当な機能を収集し、制限されたシェルから脱出したり、特権を昇格したり、昇格した権限を維持したり、ファイルを転送したり、バインドシェルやリバースシェルを生成したり、他のポストエクスプロイテーションタスクを容易にすることができます。
gdb -nx -ex '!sh' -ex quit sudo mysql -e '! /bin/sh' strace -o /dev/null /bin/sh sudo awk 'BEGIN {system("/bin/sh")}'
FallOfSudo
sudo -l
にアクセスできる場合、ツール FallOfSudo を使用して、どのようにして任意のsudoルールを悪用できるかを確認できます。
Sudoトークンの再利用
sudoアクセスがあるがパスワードがない場合、sudoコマンドの実行を待ってセッショントークンを乗っ取ることで特権を昇格できます。
特権昇格の要件:
ユーザー "sampleuser" としてシェルが既にある
"sampleuser" が最後の15分間に
sudo
を使用して何かを実行している(デフォルトでは、パスワードを入力せずにsudo
を使用できるsudoトークンの有効期間)cat /proc/sys/kernel/yama/ptrace_scope
が0であるgdb
にアクセスできる(アップロードできる)
(一時的に ptrace_scope
を有効にするには、echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
を使用するか、/etc/sysctl.d/10-ptrace.conf
を変更して kernel.yama.ptrace_scope = 0
に設定します)
これらの要件をすべて満たしている場合、次のリンクを使用して特権を昇格できます: https://github.com/nongiach/sudo_inject
最初のエクスプロイト (
exploit.sh
) は、/tmp/
にactivate_sudo_token
というバイナリを作成します。これを使用して、セッションでsudoトークンをアクティブ化できます(自動的にルートシェルは取得できません、sudo su
を実行してください):
第二のエクスプロイト (
exploit_v2.sh
) は、/tmp
に所有者が root で setuid が設定された sh シェルを作成します
第三のエクスプロイト (
exploit_v3.sh
) は、sudo トークンを永続化し、すべてのユーザーが sudo を使用できるようにする sudoers ファイルを作成します
/var/run/sudo/ts/<ユーザー名>
フォルダー内またはフォルダー内の作成されたファイルのいずれかに 書き込み権限 がある場合、バイナリ write_sudo_token を使用して ユーザーとPID用のsudoトークンを作成 できます。 たとえば、ファイル /var/run/sudo/ts/sampleuser を上書きでき、PID 1234 のそのユーザーとしてシェルを持っている場合、パスワードを知らなくても、次の操作を行うことで sudo権限を取得 できます:
/etc/sudoers, /etc/sudoers.d
ファイル /etc/sudoers
と /etc/sudoers.d
内のファイルは、sudo
をどのように使用できるかを設定します。これらのファイルはデフォルトでユーザー root とグループ root だけが読むことができます。
もし、このファイルを読むことができれば、興味深い情報を入手できるかもしれません。そして、もしファイルを書き込むことができれば、特権を昇格することができます。
もし書き込み権限があれば、この権限を悪用することができます。
別の権限乱用方法:
DOAS
sudo
バイナリの代替としてdoas
などがあります。OpenBSD用のdoas.conf
の設定を確認してください。
Sudoハイジャック
ユーザーが通常マシンに接続してsudo
を使用して特権を昇格させることを知っている場合、そのユーザーコンテキスト内でシェルを取得したら、新しいsudo実行可能ファイルを作成して、あなたのコードをrootとして実行し、その後ユーザーのコマンドを実行することができます。その後、ユーザーコンテキストの$PATHを変更します(たとえば、.bash_profileに新しいパスを追加)ので、ユーザーがsudoを実行すると、あなたのsudo実行可能ファイルが実行されます。
ユーザーが異なるシェル(bash以外)を使用している場合は、新しいパスを追加するために他のファイルを変更する必要があります。たとえば、sudo-piggybackは~/.bashrc
、~/.zshrc
、~/.bash_profile
を変更します。bashdoor.pyに別の例があります。
または、次のように実行します:
共有ライブラリ
ld.so
/etc/ld.so.conf
ファイルは読み込まれる設定ファイルの場所を示しています。通常、このファイルには次のパスが含まれています:include /etc/ld.so.conf.d/*.conf
つまり、/etc/ld.so.conf.d/*.conf
からの設定ファイルが読み込まれます。この設定ファイルは他のフォルダを指し示し、ライブラリが検索されるフォルダを示します。例えば、/etc/ld.so.conf.d/libc.conf
の内容は/usr/local/lib
です。これはシステムが/usr/local/lib
内のライブラリを検索することを意味します。
何らかの理由で、ユーザーが/etc/ld.so.conf
、/etc/ld.so.conf.d/
、/etc/ld.so.conf.d/
内の任意のファイル、または/etc/ld.so.conf.d/*.conf
内の設定ファイル内の任意のフォルダに書き込み権限を持っている場合、特権を昇格させることができるかもしれません。
この設定ミスをどのように悪用するかを次のページで確認してください:
RPATH
/var/tmp/flag15/
にlibをコピーすることで、RPATH
変数で指定された場所にあるプログラムによって使用されます。
次に、gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6
を使用して、/var/tmp
に悪意のあるライブラリを作成します。
機能
Linuxの機能は、プロセスに利用可能なルート権限の一部を提供します。これにより、ルート権限がより小さな独立した単位に分割されます。これらの単位のそれぞれをプロセスに独立して付与できます。これにより、特権の完全なセットが削減され、悪用のリスクが低下します。 機能について詳しく学ぶには、次のページを読んでください:
pageLinux Capabilitiesディレクトリの権限
ディレクトリ内での**「実行」ビットは、影響を受けるユーザーがフォルダに「cd」できることを意味します。 「読み取り」ビットは、ユーザーがファイルをリストできることを意味し、「書き込み」ビットは、ユーザーがファイルを削除したり新しいファイルを作成**できることを意味します。
ACL(アクセス制御リスト)
アクセス制御リスト(ACL)は、伝統的なugo/rwx権限をオーバーライドできる二次的な任意の権限を表します。これらの権限により、ファイルやディレクトリへのアクセスをより細かく制御でき、所有者やグループの一部ではない特定のユーザーに権利を許可または拒否できます。この細かい粒度により、より正確なアクセス管理が確保されます。詳細はこちらで確認できます。
ユーザー"kali"にファイルへの読み取りと書き込み権限を付与します:
システムから特定のACLを持つファイルを取得する方法:
シェルセッションを開く
古いバージョンでは、異なるユーザー(root)のシェルセッションを乗っ取ることができるかもしれません。 最新バージョンでは、自分のユーザーのスクリーンセッションにのみ接続できます。ただし、セッション内に興味深い情報が見つかるかもしれません。
スクリーンセッションの乗っ取り
スクリーンセッションのリスト
セッションにアタッチ
tmuxセッションの乗っ取り
これは古いtmuxバージョンの問題でした。私は特権を持たないユーザーとしてrootによって作成されたtmux(v2.1)セッションを乗っ取ることができませんでした。
tmuxセッションのリスト
セッションにアタッチする
HTBのValentineボックスを確認してください。
SSH
Debian OpenSSL Predictable PRNG - CVE-2008-0166
Debianベースのシステム(Ubuntu、Kubuntuなど)で2006年9月から2008年5月13日までに生成されたすべてのSSLおよびSSHキーは、このバグの影響を受ける可能性があります。 このバグは、これらのOSで新しいsshキーを作成する際に発生します。32,768のバリエーションのみが可能であるため、すべての可能性を計算でき、ssh公開鍵を持っていると対応する秘密鍵を検索できます。計算された可能性はこちらで見つけることができます: https://github.com/g0tmi1k/debian-ssh
SSHの興味深い構成値
PasswordAuthentication: パスワード認証が許可されているかどうかを指定します。デフォルトは
no
です。PubkeyAuthentication: 公開鍵認証が許可されているかどうかを指定します。デフォルトは
yes
です。PermitEmptyPasswords: パスワード認証が許可されている場合、サーバーが空のパスワード文字列でのアカウントへのログインを許可するかどうかを指定します。デフォルトは
no
です。
PermitRootLogin
rootがsshを使用してログインできるかどうかを指定します。デフォルトは no
です。可能な値:
yes
: rootはパスワードと秘密鍵を使用してログインできますwithout-password
またはprohibit-password
: rootは秘密鍵のみを使用してログインできますforced-commands-only
: Rootは、プライベートキーを使用してログインし、コマンドオプションが指定されている場合のみログインできますno
: いいえ
AuthorizedKeysFile
ユーザー認証に使用できる公開鍵を含むファイルを指定します。%h
のようなトークンを含めることができます。これはホームディレクトリに置き換えられます。絶対パス(/
で始まる)またはユーザーのホームからの相対パスを示すことができます。例:
その設定は、ユーザー "testusername" の秘密鍵でログインしようとすると、ssh があなたの鍵の公開鍵を /home/testusername/.ssh/authorized_keys
および /home/testusername/access
にある公開鍵と比較することを示します。
ForwardAgent/AllowAgentForwarding
SSH エージェント転送を使用すると、サーバーに鍵(パスフレーズなし!)を置いたままにする代わりに、ローカルの SSH キーを使用できます。そのため、ssh 経由でホストにジャンプし、そこから別のホストにジャンプして、初期ホストにある鍵を使用できます。
このオプションを $HOME/.ssh.config
に次のように設定する必要があります:
注意してください。Host
が *
の場合、ユーザーが別のマシンに移動するたびに、そのホストはキーにアクセスできるようになります(これはセキュリティ上の問題です)。
ファイル /etc/ssh_config
はこの オプションを上書き して、この構成を許可または拒否することができます。
ファイル /etc/sshd_config
は AllowAgentForwarding
キーワードで ssh エージェントの転送を 許可 または 拒否 できます(デフォルトは許可)。
環境で Forward Agent が構成されていることがわかった場合は、以下のページを読んでください。特権昇格を悪用できる可能性があります:
pageSSH Forward Agent exploitation興味深いファイル
プロファイルファイル
ファイル /etc/profile
および /etc/profile.d/
内のファイルは、ユーザーが新しいシェルを実行したときに実行される スクリプト です。したがって、これらのいずれかを 書き込むか変更することができれば、特権を昇格 できます。
パスワード/シャドウファイル
OSによっては、/etc/passwd
および/etc/shadow
ファイルが異なる名前を使用しているか、バックアップがあるかもしれません。したがって、それらをすべて見つけ、それらを読み取れるかどうかをチェックして、ファイル内にハッシュがあるかどうかを確認することが推奨されています。
いくつかの場合、/etc/passwd
(または同等の)ファイル内にパスワードハッシュを見つけることができます。
Writable /etc/passwd
最初に、次のコマンドのいずれかを使用してパスワードを生成します。
次に、ユーザーhacker
を追加し、生成されたパスワードを追加します。
例: hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash
su
コマンドをhacker:hacker
で使用できます。
代わりに、次の行を使用してパスワードのないダミーユーザーを追加できます。 警告: 現在のマシンのセキュリティが低下する可能性があります。
注意: BSDプラットフォームでは、/etc/passwd
は /etc/pwd.db
および /etc/master.passwd
にあり、/etc/shadow
は /etc/spwd.db
に名前が変更されています。
あなたがいくつかの機密ファイルに書き込めるかどうかを確認すべきです。たとえば、サービス構成ファイルに書き込めますか?
例えば、マシンがtomcatサーバーを実行しており、**/etc/systemd/**内のTomcatサービス構成ファイルを変更できる場合は、次の行を変更できます:
あなたのバックドアは、次にtomcatが起動されるときに実行されます。
フォルダのチェック
次のフォルダにはバックアップや興味深い情報が含まれているかもしれません: /tmp, /var/tmp, /var/backups, /var/mail, /var/spool/mail, /etc/exports, /root(おそらく最後のものは読めないかもしれませんが、試してみてください)
奇妙な場所/所有ファイル
最後の数分で変更されたファイル
Sqlite データベースファイル
*_history, .sudo_as_admin_successful, profile, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml ファイル
隠しファイル
PATH にあるスクリプト/バイナリ
Webファイル
バックアップ
パスワードを含む既知のファイル
linPEASのコードを読み、複数のパスワードを含む可能性のあるファイルを検索します。 これを行うために使用できる別の興味深いツールは、LaZagneです。これは、Windows、Linux、Mac上に保存されている多くのパスワードを取得するために使用されるオープンソースアプリケーションです。
ログ
ログを読むことができれば、それらの中に興味深い/機密情報を見つけることができるかもしれません。ログがより奇妙であればあるほど、それはより興味深いものになるでしょう(おそらく)。 また、一部の「悪質な」構成された(バックドアがある?)監査ログは、この投稿で説明されているように、監査ログ内にパスワードを記録することを許可するかもしれません: https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/。
ログを読むためには、adm グループが本当に役立ちます。
シェルファイル
一般的な資格情報検索/正規表現
ファイル名やコンテンツ内に単語 "password" を含むファイルをチェックし、ログ内のIPやメールアドレス、ハッシュの正規表現もチェックすべきです。 これらのすべての方法をここで説明するつもりはありませんが、興味がある場合は、linpeas が実行する最後のチェックを確認できます。
書き込み可能なファイル
Pythonライブラリの乗っ取り
Pythonスクリプトが実行される場所がわかっており、そのフォルダに書き込み権限があるか、Pythonライブラリを変更できる場合、OSライブラリを変更してバックドアを仕掛けることができます(Pythonスクリプトが実行される場所に書き込み権限がある場合、os.pyライブラリをコピーして貼り付けてください)。
ライブラリにバックドアを仕掛けるには、os.pyライブラリの最後に次の行を追加します(IPとPORTを変更してください):
Logrotateの悪用
logrotate
の脆弱性により、ログファイルまたはその親ディレクトリに書き込み権限を持つユーザーが特権を昇格する可能性があります。これは、logrotate
がrootとして実行されることが多いため、特に_/etc/bash_completion.d/のようなディレクトリで任意のファイルを実行するように操作できるからです。/var/log_だけでなく、ログのローテーションが適用されているすべてのディレクトリのアクセス権限を確認することが重要です。
この脆弱性はlogrotate
バージョン3.18.0
およびそれ以前に影響します
この脆弱性に関する詳細情報は、次のページで確認できます: https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition。
logrottenを使用してこの脆弱性を悪用できます。
この脆弱性はCVE-2016-1247 (nginxログ) に非常に類似していますので、ログを変更できることがわかった場合は、ログをシンボリックリンクに置き換えて特権を昇格できるかどうかを確認してください。
/etc/sysconfig/network-scripts/ (Centos/Redhat)
脆弱性リファレンス: https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f
何らかの理由で、ユーザーが_/etc/sysconfig/network-scripts_にifcf-<whatever>
スクリプトを書き込むことができるか、既存のスクリプトを調整できる場合、システムは乗っ取られています。
ネットワークスクリプト、例えば_ifcg-eth0_はネットワーク接続に使用されます。これらは.INIファイルとまったく同じように見えますが、LinuxではNetwork Manager (dispatcher.d)によって~ソース化~されます。
私の場合、これらのネットワークスクリプトのNAME=
属性が正しく処理されていません。名前に空白があると、システムは空白の後の部分を実行しようとします。つまり、最初の空白の後のすべてがrootとして実行されます。
例: /etc/sysconfig/network-scripts/ifcfg-1337
init、init.d、systemd、およびrc.d
ディレクトリ /etc/init.d
には、System V init (SysVinit) 用のスクリプトがあります。これは、クラシックなLinuxサービス管理システムです。これには、サービスを start
、stop
、restart
、そして時には reload
するスクリプトが含まれています。これらは直接実行するか、/etc/rc?.d/
で見つかるシンボリックリンクを介して実行できます。Redhatシステムでは、代替パスとして /etc/rc.d/init.d
があります。
一方、/etc/init
はUpstartに関連付けられており、これはUbuntuによって導入された新しいサービス管理です。サービス管理タスクのための構成ファイルを使用します。Upstartへの移行にもかかわらず、Upstartに互換性レイヤーがあるため、SysVinitスクリプトはUpstart構成と共に引き続き使用されています。
systemd は、現代の初期化およびサービスマネージャーとして登場し、オンデマンドデーモンの起動、自動マウント管理、およびシステム状態のスナップショットなどの高度な機能を提供しています。配布パッケージのファイルは /usr/lib/systemd/
に、管理者の変更は /etc/systemd/system/
に整理され、システム管理プロセスを効率化しています。
その他のトリック
NFS特権昇格
pageNFS no_root_squash/no_all_squash misconfiguration PE制限されたシェルからの脱出
pageEscaping from JailsCisco - vmanage
pageCisco - vmanageカーネルセキュリティ保護
その他のヘルプ
Linux/Unix Privescツール
Linuxローカル特権昇格ベクターを探すための最良のツール: LinPEAS
LinEnum: https://github.com/rebootuser/LinEnum(-t オプション) Enumy: https://github.com/luke-goddard/enumy Unix Privesc Check: http://pentestmonkey.net/tools/audit/unix-privesc-check Linux Priv Checker: www.securitysift.com/download/linuxprivchecker.py BeeRoot: https://github.com/AlessandroZ/BeRoot/tree/master/Linux Kernelpop: カーネルの脆弱性を列挙するLinuxおよびMAC https://github.com/spencerdodd/kernelpop Mestaploit: multi/recon/local_exploit_suggester Linux Exploit Suggester: https://github.com/mzet-/linux-exploit-suggester EvilAbigail (物理アクセス): https://github.com/GDSSecurity/EvilAbigail その他のスクリプトのまとめ: https://github.com/1N3/PrivEsc
参考文献
Last updated