非常に限定的なテクニックです。
攻撃を受けたサーバーにて悪いプロセスが起動されることがあります。
プロセスを実行するためには実行元のファイルが必要ですが、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に対して直接命令を与えることもできます。
そして/proc
配下には、/proc/[PID]/exe/
というファイルがプロセスごとに存在しています。
これこそがプロセスの実行元ファイルとなったファイル自身です。
そのため復元をしたいのであれば、コピーすることで削除されたファイルを復元することができます。
$ cp -p /proc/[PID]/exe ~/bot.sh