この記事は KMC Advent Calendar 2015 - Adventar19日目の記事です。18日目は、murataさんのKMCとPiet,そして最強のPietの為にdllを動的にC#で読みこむ話 - <(/^^)/⌒●~* $> :(){ :|:& };:でした。
はじめに
KMC 4回生kazakami https://twitter.com/Kazakami_9です。 *
今日はshellチャンネルの話しです。
shellチャンネル自体は10日目のアドベンドカレンダーであるmesos+marathon+docker と slack の shell チャンネルの話 - KMC活動ブログでもでてきています。
shellさんについて
$から始まる文字列がslackで発言されるとそれをコマンドとして解釈して実行し、標準出力をslackで発言するという脆弱性の塊のようなbotです。(botのソースコードは先述の記事にて公開されています。「ボットを書いた人からスクリプトをもらって」などと供述していますが、私は「あげる」とも「公開していい」とも言っていません。(半ギレ))
動作例として、たとえば $ls と発言するとこんな感じになります。
さすがにこんなもの直に動かすことはできないので、仮想マシンの上で動かしていました。環境構築を速くするためにubuntuの仮想マシン用のイメージディスクを用いました。
今回は悪質な人達によってどのような悪質なコマンドが投げられたか、その一部について紹介していきたいと思います。
なおこのチャンネルのログはテキストファイルであるにも関わらずファイルサイズが20MBもあります。(半ギレ)
大量のメッセージを表示させるもの
$yes
ひたすら y を出力するコマンドです。今回作ったbotでは処理が終了してからメモリに溜めておいた標準出力のデータを送信するようにしていたので、返事がなくなったりメモリを使い切ったりして落ちることが殆んどでした。
$seq 100000
こちらは1から100000までの数字を表示するコマンドです。yesと異なりこちらは終了するので100000個数字が表示されます。悪質。
$ls -R /
ルート以下全てのファイルを表示します。単純に実行しても表示に時間がかかる代物なので実際悪質。
途中から長すぎる文字列は表示しないように修正したため、これらものは終焉を迎えました。
処理を飽和させるもの
無限ループ
shell scriptやrubyのワンライナーなど様々な手法で様々な無限ループを回してくれました。プログラムの1つ2つが無限ループしていてもそんなに負荷は増えませんが、ループの中でプログラムの起動をしているものだとかなり悪質になりました。
$while true; do gnome-terminal; done
先述の通りbotの動作環境として仮想マシン上のubuntuを使用していたのですが、GUIで使用していたためこのようなコマンドを投げられると、画面上に大量のterminalが一斉に花開き死んでしまいます。悪質。
$:(){ :|:& };: や $perl -e 'fork while fork' など
いわゆるフォーク爆弾です。これをされると、ssh経由でログインしてbotを再起動するなどの作業ができなくなるので非常に困りました。一時期botを動かしているサーバのLoad Averageは5000近くになってました。
また、とある部員がサークルの共用マシンでこれを実行して楽しいことにもなりました。一体誰がそんな悪質なことをしたんでしょうね
終らないコンパイル
#include ".//.//.//.//hoge.cpp"
#include "hoge.cpp"
echoコマンドを用いてこのようなファイルを生成し、コンパイルするとCPUもメモリも大量に消費してくれます。
$ruby hoge.rb
hoge.rbはこのbotのソースコードです。このコマンドによってbotがもう1つ起動されてしまいます。このコマンドの実行回数の指数でbotが多重起動されていきます。
$echo $PATH | tr ':' '\n' | xargs -n1 ls | while read line; do ($line &); done;
パスが通されている全てのプログラムを実行します。GUIを使っているとlibre officeやブラウザ,スクリーンロックなど様々なものが起動しやがってくれます。
作業の邪魔をするもの
$killall tmux
実に単純でありながら実に悪質。
$killall ruby
やめてください。botが死んでしまいます。
$yes | write kazakami
私の端末に大量のyが降ってきます。
$gnome-terminal -e sl
突然端末が開き、SLが走りだします。
環境破壊
$rm -rf / --no-preserve-root
定番。全ての消せるファイルを消します。もちろんroot権限でbotを起動しているわけではないので致命的なことは起きませんでした。
$rm hoge.rb
hoge.rbはこのbotのソースです。これを消されるとつらみです。
$echo 'exit' > ~/.bashrc
ログインするとログアウトするようになります。悪質。
/bin 以下の書き換え
lsを全く関係ないコマンドにしたり、killを書き換えて echo '死んでたまるか' のようにしたりと混沌を極めていました。
その他
$echo 'password' | sudo -S 適当なコマンド
sudoには -S オプションというものがあって、標準入力からパスワードを受取るようにできるようです。おそらく実際に使うことはなさそう。
ちなみにパスワードは簡単なものを設定していましたが、誰も突破してくれませんでした。
.ssh以下に鍵を送り込んで、鍵認証によるログイン
されそうになっていたの、すぐに.sshの書き込み権限を奪いました。
botを作る
echoによりプログラムを書き込んで実行することはありましたが、botを利用してbotを作っている人がいました。
ちなみにそのbot、botの発言にも反応するようになっていたので自分自身の発言にも反応してしまい大変なことになっていました。
$find / -perm -u=w -type f 2>/dev/null | ruby -e 'STDIN.each{|line| echo ":fuck:" > #{line}
}'
全ての書き込み可能なファイルの内容が:fuck:に書き換えられます。botを動かすためにビルドしたばかりのrubyの最新版も:fuck:に書き換えられました
Reverse Shell
こんなことできるんだなって感じになりました。
まとめ
悪乗りでつくったbotでしたが、皆さん思い思いの方法で悪質なことをしてくれたので多くのshellのコマンドや機能を知ることができました。(大部分は使うこともないでしょうが)
このようなものでも皆さん結構楽しんでくれていたようなので、適当なものでも取り敢えず作って使える状態にするのは大切だと思いました。
積極的にクソbot作っていきましょう!!!!
次回予告
明日、20日目の KMC Advent Calendar 2015 - Adventarの記事はMSZ_006_A_E_U_G君による天下一品フェア2015です