今回は以下のニュースであった脆弱性の検証を行います!
・Linuxカーネルに権限昇格の脆弱性「Dirty Pipe」 – PoCも公開に
カーネルの脆弱性を検証するのは初ですね。カーネルの準備からやりますので、興味がある方は自分でも環境を用意してやってみてください。
なお、本記事は悪用を促すものではないことを予めご了承ください。
検証環境の準備
今回は「Ubuntu/20.04.1」の日本語版をVMで構築しました!
※構築したといっても立ち上げただけです。
また、後々の操作用に使用する「ssh」、「gcc」もインストールを行っています。
まずは起動直後のLinuxのバージョンを確認します。
$ uname -rs Linux 5.13.0-35-generic
上記となっておりました。
このバージョンでは今回の脆弱性は発現しませんでした。
以下を見るとこのバージョンは本脆弱性に対応していることを確認できます。
・USN-5317-1: Linux kernel vulnerabilities
なので、脆弱性のあるカーネルにダウングレードする必要があります。
最初に紹介した記事をみると「Linux 5.16.11」で修正されたということなので、「Linux 5.16.10」を使用して検証を行います。
以下のサイトにアクセスします。
画像の赤枠の個所をダウンロードして、Ubuntu内の適当なディレクトリに持ってきます。
私は以下のようにwgetで持ってきました。
$wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.16.10/amd64/linux-headers-5.16.10-051610_5.16.10-051610.202202161442_all.deb $wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.16.10/amd64/linux-image-unsigned-5.16.10-051610-generic_5.16.10-051610.202202161442_amd64.deb $wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.16.10/amd64/linux-image-unsigned-5.16.10-051610-lowlatency_5.16.10-051610.202202161442_amd64.deb $wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.16.10/amd64/linux-modules-5.16.10-051610-generic_5.16.10-051610.202202161442_amd64.deb $wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.16.10/amd64/linux-modules-5.16.10-051610-lowlatency_5.16.10-051610.202202161442_amd64.deb
ブラウザから直接ダウンロードでも構いません。
ダウンロードが終わったら、以下のコマンドを実行します。
$sudo dpkg -i *.debに
日本語版を使用していれば最後に「完了」と出ると思いますので、それが出ればOKです。
次にVMを再起動します。
再起動時は「Escキー」を押しながらやってください。
通常の起動ではなく、以下の画面のようになると思いますので、「Advanced・・・・」という個所を選択します。
次に以下の画面になりますので、「Ubuntu, with Linux 5.16.10-051610-generic」を選択します。
起動して再度Linuxのバージョンを確認します。
$ uname -rs Linux 5.16.10-051610-generic
これで準備はOKです。
Dirty Pipeの検証
以下の記事に脆弱性の説明から、PoCまですべて記載されています。
また、日本語であれば以下もめっちゃオススメです。
・20分で分かるDirty Pipe(CVE-2022-0847)
早速やってみます。
まずは英語の記事のほうから、PoCをコピペします。
「This is my proof-of-concept exploit:」から下のソースをコピーしてきます。
こんな感じです。
「gcc」コマンドで実行できるようにコンパイルします。
$ gcc exploit.c -o exploit
これで準備完了です。
まずは一般ユーザで「/etc/passwd」にアクセスしてみます。
以下の画像下中央に記載されていますが、一般ユーザだと編集を行うことできません。
さて次はPoCを使用してみます。
先ほど紹介した記事のとおり、やってみると・・・
./exploit /etc/passwd 1 ootz:
「It worked!」という文字列が表示されました。
実際に「/etc/passwd」を確認してみます。
画像が小さいので分かりにくいかもですが、一行目の「root:x:0:0:」が「rootz::0:0:」に書き換わっています。
どういうことかというとrootのパスワードを消し去っています。
また、ユーザ名が「rootz」に変更されています。なので以下のコマンドを使用すると・・・
$ su rootz
以下のようにログインができてしまいます。
rootzはroot権限を持っていますので、「/etc/passwd」はもちろん、「/etc/shadow」にもアクセスすることができます。
以下は「/etc/shadow」を開いた時の画像の切り取りです。
これで検証完了です!
最後に
今回は「Dirty Pipe」について検証を行いました。
カーネルの脆弱性なので、Webアプリケーションから攻撃をするのは難しいかもしれませんが、ペネトレーションテスト等で内部に入れた際に権限昇格を狙うのには使うことはできそうです。
※ただし、ファイルを書き換えるので、契約によっては難しそう・・・
また、OSCP等の資格の試験で脆弱性のあるカーネルを使用していた場合に権限昇格を狙う手段の一つとしても使うことができるかと思います。
脆弱性のあるバージョンを使用している場合はアップデートを行うことを推奨します。
外部に出てないから平気っしょと思われるかと思いますが、標的型の攻撃も増えているので、可能な限り脆弱性がない状態にしておくことは重要です!
今回の脆弱性だけではないですが、計画的にアップデートを行うようにすることを推奨します。
日本語で紹介したブログでは詳細な解説を行っていたり、Go言語でPoCを書いていたりして尊敬します。
とても読みやすく勉強にもなりますので、ぜひ読んでみてください。
※私のブログ来る前に大体の人は見ていると思いますが・・・
不明点や要望やこういったこともやって欲しいとの要望があれば、お問い合わせページやコメント、ツイッターからでも結構ですので、気軽にご連絡ください。
コメント