フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

【Linux】削除されたファイルをプロセスから復元するには/proc/[PID]/exeを使おう

linux-logo

非常に限定的なテクニックです。

攻撃を受けたサーバーにて悪いプロセスが起動されることがあります。

プロセスを実行するためには実行元のファイルが必要ですが、Linuxでは一度プロセスを起動してしまえば実ファイルは削除しても問題ありません。そのため攻撃者はプロセスを起動した後に実行元ファイルを削除してしまいます。

これを何とかして復元できないか?というのが今回のテクニックです。

プロセスを起動してファイルを削除する

sleepをするtest.shを用意してみます。

blog [gh-pages]$ cat test.sh
#!/bin/sh

sleep 1000

こいつを実行してみた後に、実行元ファイルを削除してもプロセスは動いたままです。

blog [gh-pages]$ ./test.sh &
[1] 7092
blog [gh-pages]$ ps aux |grep test
xxxx           7103   0.0  0.0  2432772    644 s002  S+    7:31AM   0:00.00 grep test
xxxx           7092   0.0  0.0  2443608    980 s002  S     7:31AM   0:00.01 /bin/sh ./test.sh
blog [gh-pages]$ rm test.sh
blog [gh-pages]$
blog [gh-pages]$ ps aux |grep test
xxxx           7115   0.0  0.0  2432772    644 s002  S+    7:32AM   0:00.00 grep test
xxxx           7092   0.0  0.0  2443608    980 s002  S     7:31AM   0:00.01 /bin/sh ./test.sh

これはLinuxの仕組みで、プロセスが起動された時にメモリ上に実行元ファイルの内容がコピーされるためです。

削除されたファイルをプロセスから復元する

ここが今回の肝です。

Linuxでは/proc配下にプロセスにアタッチするための仮想的なファイルシステムが用意されています。プロセスが抱えている環境変数や、cgroupsの状態など非常に有用な情報が見れ、コマンドによってはプロセスやkernelに対して直接命令を与えることもできます。

itpro.nikkeibp.co.jp

そして/proc配下には、/proc/[PID]/exe/というファイルがプロセスごとに存在しています。 これこそがプロセスの実行元ファイルとなったファイル自身です。

そのため復元をしたいのであれば、コピーすることで削除されたファイルを復元することができます。

$ cp -p /proc/[PID]/exe ~/bot.sh