ハニーポット観察記録 番外編 〜IRCBOT はプロセスの名前を騙るのか?〜
どうも.ハニーポッターです.
最近見たブログ記事「[Perl] 細かすぎて伝わらないPerlと$0変数 – コマンド名偽装(ろば電子が詰まっている)」で,下記のような記述をみかけました.
引用:$0操作はpsコマンドからの隠蔽目的でもよく使われます。具体的には、Perlでマルウェアを書いている人たちの間では、この$0いじりをするのは常套手段でありよく使われる手法です。
ハニーポットでは IRCBOT に感染させようとする攻撃をたくさん検知しています.たとえば Apache Magica や phpMyAdmin など毎日毎日検知します.
私は攻撃検知時に可能な限り IRCBOT のソースコードを入手し,解析をしています.そこで今回は,今までに収集した IRCBOT たちが,どのようなプロセス名を $0 に設定しているのか調査してみました.
IRCBOT ソースコード
いくつか IRCBOT のソースコードから $0 でプロセス名を設定している部分を紹介します.
ソースコード例1
my $processo = ‘-‘; (中略) $0=”$processo”.“\0″x16; |
ソースコード例2
my @rps = (“/usr/local/apache/bin/httpd -DSSL”, “/usr/sbin/httpd -k start -DSSL”, “/usr/sbin/httpd”, “ksoftirqd/0″, “khelper”, “kblockd”, “/usr/sbin/apache2 -k start”, “kmpathd”, “httpd”, “/usr/sbin/acpid”, “/usr/sbin/cron”); my $process = $rps[rand scalar @rps]; $0=”$process”.“\0″x16;; |
ソースコード例3
my @fakeps = (“/usr/local/apache/bin/httpd -DSSL”, “/usr/sbin/httpd -k start -DSSL”, “/usr/sbin/httpd”, “gnome-pty-helper”, “httpd”); (中略) my $xproc = $fakeps[rand scalar @fakeps]; $0=”$xproc”.“\0″; |
プロセス名
ハニーポットで収集した100個以上の IRCBOT のソースコードから,$0 に設定しているプロセス名を抜き出しました.その結果は下記のとおりです.
- -
- -bash
- [bash]
- [cpuset]
- [httpds]
- [kattr]
- [sync_supers]
- [sync_supers]
- /sbin/klogd -c 1 -x -x
- /sbin/syslogd
- /sbin/syslogd”,”/sbin/klogd -c 1 -x -x
- /usr/bin/httpd -SSL
- /usr/local/apache/bin/httpd -DSSL
- /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d
- /usr/sbin/acpid
- /usr/sbin/apache/asterisks
- /usr/sbin/apache/log
- /usr/sbin/apache2
- /usr/sbin/apache2 -k start
- /usr/sbin/asteriskd
- /usr/sbin/atd
- /usr/sbin/cron
- /usr/sbin/httpd
- /usr/sbin/httpd -k start -DSSL
- /usr/sbin/httpde
- /usr/sbin/httpde -k startd -SSL
- /usr/sbin/sshd
- /usr/sbin/sshd -D
- /usr/sbin/sshd -i
- auditd
- core
- cpuset
- crond
- gnome-pty-helper
- grep
- htlpd
- httpd
- kblockd
- khelper
- klogd -x
- kmpathd
- ksoftirqd/0
- nagios
- rpc.idmapd
- spamd chiIde
- suid
- sysprot
※重複を除く
1つのソースコードに1つのプロセス名だけだったり,複数のプロセス名から選択するものだったり,50種類弱の多種多様なプロセス名で偽装することが分かりました.
なお中には,複数のプロセス名を設定しているにも関わらず,ランダムに選ぶというコーディングを忘れているソースコードもありました.(つまり,毎回同じプロセス名が選ばれる)
サンプリングの母集団が Web サーバの脆弱性を狙った攻撃で感染する IRCBOT のソースコードのため,「apache」や「httpd」という名前関連のプロセスが多いという偏りが生じている可能性はあります.
また「bash」というプロセス名は,Shellshock 以降で見られるようになりました.
さらに,一部不思議なプロセス名にしているものがありました.例えば「htlpd」や「spamd chiIde (4文字目が,小文字のエルではなく,大文字のアイ)」です.どういう意図でこのプロセス名を指定しているのか分かりかねますが,ちょっと気になりました.
NULL
ソースコード例1,2,3のソースコードの最後の部分のように,$0 にプロセス名を設定するとき,最後に「”\0”」や「”\0″x16」をくっつけているものがありました.
\0 はみなさんご存知の通り,制御文字の NULL 文字ですね.もちろん ps コマンドで実行中の IRCBOT のプロセス名を表示しても,画面に印字されません.
また x は Perl の x 演算子と呼ばれるものです.x に続く数字の回数分,x の直前の文字を繰り返します.つまり「”\0”x16」の意味は NULL 文字を16回繰り返すということになります.
明確な意図はよくわかりませんが,ps コマンドでプロセス名を表示したときに,ウインドウ幅一杯に不可視の NULL 文字を表示させて,プロセス名の偽装の隠蔽をしようとしているのでしょうか? 妄想は募るばかりです.
まとめ
今回は,ハニーポット観察記録の番外編として,IRCBOT がプロセス名を偽装するときのプロセス名について調査しました.
本物のプロセスとしてあるような名前から不思議な名前まで50種類近くあることがわかりました.
こうやってまとめて一覧化していくだけでも経験値が溜まっていくので,プロセス名を見ただけで
「( ゚д゚)! これは偽装されたプロセス名だ!」と光って見えるようになる・・・気がします.
参考情報
[Perl] 細かすぎて伝わらないPerlと$0変数 – コマンド名偽装 (ろば電子が詰まっている)
http://d.hatena.ne.jp/ozuma/20141129/1417199650