アロワナ飼いたい

いつかアロワナを飼いたい人のブログです

rsyncを悪用したワイルドカードインジェクションを検証する

■ 概要

rsyncを悪用したワイルドカードインジェクションと呼ばれる攻撃を検証した際のメモ。rsyncはデータ同期のユーティリティであり、ワイルドカードインジェクションはコマンドの引数にワイルドカード(*)を与えることにより意図しない動作を引き起こす攻撃のことである。不適切な設定となっている脆弱なマシンに対して攻撃を行い、権限昇格ができることを確認する。

 ※ 本記事の内容は悪用厳禁であり、これにより生じてしまった被害等に対して当ブログは
   一切の責任を負いません


rsyncについて

rsyncについて簡単にまとめておく。rsyncはファイルやディレクトリを同期するためのユーティリティで、大容量ファイルのバックアップに使われることが多い。データの差分のみを同期するという特徴があり、この点がscpなどとは異なる。コマンドの実行例と代表的なオプションを記載する。

【実行例】

  • ローカルの「/home/parallels/test_dir/」内(同期元)のデータを別のサーバAの「/data/」
    (同期先)に同期したいとき
 $ rsync -av /home/parallels/test_dir/ alice@<サーバAのIPアドレス>:/data

  ※ 「alice」はサーバAに存在するユーザとする


【オプション】

  • -a:同期元データのパーミッションを保持するオプションなど、複数の便利なオプションを
      まとめて指定するためのオプション
  • -u:同期先データが同期元データより新しい場合は同期を行わないようにするための
      オプション
  • -v:データ同期の際に、同期状態の詳細を表示するためのオプション
  • -z:データ同期の際に、データを圧縮して転送するためのオプション
  • -e:データ同期の際に、同期先にて任意のコマンドを実行するためのオプションで、
      これを悪用してワイルドカードインジェクションを検証する


ワイルドカードインジェクションについて

実際の攻撃手法の前に、身近なコマンドを用いたワイルドカードインジェクション自体の振る舞いを確認しておく。コマンドの引数にワイルドカード(*)を与えると、場合によっては意図しない動作となることがある。

【動作例:lsコマンドとワイルドカード
ディレクトリ「test_dir」にて作業しており、このディレクトリには「file1」と「file2」の2つのファイルがある。このディレクトリで「ls *」を実行すると、次のような結果が得られる(これは「ls file1 file2」の実行結果と同じである)。

$ ls *
> file1 file2


次に、test_dirに「-l」という名前のファイルを作成し、再度「ls *」を実行してみる。

$ touch -- '-l'
$ ls *
> -rw-r--r--. <所有者名> <所有グループ名> <サイズ> <タイムスタンプ> file1
> -rw-r--r--. <所有者名> <所有グループ名> <サイズ> <タイムスタンプ> file2


先ほどと同様に、

$ ls *
> file1 file2 -l


といった結果が得られると想定していたが、そうはならず「ls -lの実行結果」が表示されてしまっている。これは、「ls *」が「ls file1 file2 -l」のように展開され、「-l」がオプションとして捉えられたためである。同様に、「-a」といった名前のファイルを作成して「ls *」を実行すると「ls file1 file2 -a」のように展開されてしまうことも分かる。


ワイルドカードインジェクションによる権限昇格の検証

前節にて、コマンドの引数にファイル名が「-」から始まるファイルを与えると、コマンドのオプションとして捉えられる可能性があることを確認した。これを悪用して、意図しない動作を引き起こす攻撃がワイルドカードインジェクションである。lsコマンドの場合は(おそらく)大した問題にならないが、「オプションで特定のコマンドやプログラムを実行する」ことができるコマンドの場合は、権限昇格といった深刻な問題に繋がることがある。今回は次のシナリオを想定し、実際に権限昇格を行ってみる。

【シナリオ】
攻撃者Aは、何らかの方法を用いて標的サーバへの不正アクセスに成功した。Aは、この時点ではroot権限を持たず、ユーザ「parallels」の権限でシェルを操作できる。この状況で標的サーバの内部探索を行ったところ、「parallelsrsyncをパスワードなしのroot権限で実行できる設定となっている」ことが分かった。この設定を悪用すれば、root権限を持たないユーザでは通常書き込み不可である「/etc/passwd」を編集できることに気が付いた。


【権限昇格】
権限昇格の準備として、まずは次のコマンドにて、任意のディレクトリに「backdoor.sh」と「'-e sh backdoor.sh'」の2つのファイルを作成しておく。

$ echo "echo 'backdoor::0:0::/root:/bin/bash' >> /etc/passwd" > backdoor.sh
$ touch -- '-e sh backdoor.sh'


「backdoor.sh」は、root権限を持つユーザ「backdoor」を「/etc/passwd」に追記するスクリプトである。当然、root権限を持たないユーザがこのスクリプトを実行しても、「/etc/passwd」に追記はされない。しかし、この2つのファイルがあるディレクトリにて次の書式のrsyncを実行すれば、システムにroot権限をもつユーザ「backdoor」を追加できる。

$ sudo rsync * localhost:/tmp


ワイルドカードを展開すると、「-e sh backdoor.sh」がオプションとして指定されたことが分かる。rsyncはroot権限で動くため、オプション「-e」の引数に与えた「sh backdoor.sh」もroot権限で動き、「/etc/passwd」に追記できたということである。あとは追加した特権ユーザ「backdoor」にスイッチすれば、権限昇格完了である。

$ su backdoor
# id


なお、権限昇格の一連の流れは、次の記事が分かりやすい。

betterprogramming.pub


【補足】
ワイルドカードインジェクションの理解のためにこのような流れで権限昇格を行ったが、同じ状況であれば、もっと簡単に権限昇格できる方法がある(下図とリンク)。

gtfobins.github.io


■ 感想など

運用負荷軽減のため、特定のコマンドに対して「root権限付与かつパスワードなしで実行可能」といった設定をすることもありますが、その設定が不適切であればなにが起こりうるかということを再認識できてよかったです。また、次の記事が大変参考になりました(ワイルドカードインジェクションについて知りたいのであれば、この記事を読むほうが話が早い)。 jpn.nec.com