またepgrecを狙った攻撃がありました
epgrecを狙った攻撃があったことは前にもありましたが、今回はちょっと違う攻撃がありました。
まずは前回のアクセスログです。
403になってるのはUAがnmapだと強制的にアクセス拒否してるからです。(あまり意味はない)
1 2 |
providencesamsung.dip.jp - - [02/Apr/2015:20:03:30 +0900] "GET / HTTP/1.1" 403 2144 "-" "Mozilla/5.0 (compatible; Nmap Scripting Engine; http://nmap.org/book/nse.html)" providencesamsung.dip.jp - - [02/Apr/2015:20:04:17 +0900] "GET /epgrec/gen-thumbnail.sh HTTP/1.1" 403 2144 "-" "Mozilla/5.0 (compatible; Nmap Scripting Engine; http://nmap.org/book/nse.html)" |
そして今回のアクセスログです。
1 2 3 4 5 6 7 |
161.202.72.135-static.reverse.softlayer.com - - [09/Apr/2015:11:21:41 +0900] "GET /epgrec/templates/envSetting.html HTTP/1.1" 404 230 "-" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0" 161.202.72.135-static.reverse.softlayer.com - - [09/Apr/2015:11:21:42 +0900] "GET /templates/envSetting.html HTTP/1.1" 404 223 "-" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0" 161.202.72.135-static.reverse.softlayer.com - - [09/Apr/2015:11:21:43 +0900] "GET /epgrec_old/templates/envSetting.html HTTP/1.1" 404 234 "-" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0" 161.202.72.135-static.reverse.softlayer.com - - [09/Apr/2015:11:21:43 +0900] "GET /tv/templates/envSetting.html HTTP/1.1" 404 226 "-" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0" 161.202.72.135-static.reverse.softlayer.com - - [09/Apr/2015:11:21:44 +0900] "GET /rec/templates/envSetting.html HTTP/1.1" 404 227 "-" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0" 161.202.72.135-static.reverse.softlayer.com - - [09/Apr/2015:11:21:44 +0900] "GET /epg/templates/envSetting.html HTTP/1.1" 404 227 "-" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0" 161.202.72.135-static.reverse.softlayer.com - - [09/Apr/2015:11:21:45 +0900] "GET /epgrec_STZ/templates/envSetting.html HTTP/1.1" 404 234 "-" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0" |
アクセスする場所もUAも異なります。
適当に「nmap蹴ったら来なくなったwwwwwwwwwちwwwょwwwろwwwいwww」と調子に乗ってる人は注意です。
対策
録画システムを外部に公開しないのが1番のおすすめです。
なぜなら録画した番組は自分しか見る必要がなく、ウェブサイトみたいに外部に公開する必要性が無いからです。
もし、外部からアクセスしたい場合はVPNを経由させればいいでしょう。
どうしても公開したままにしておきたいなら国外IPからのアクセスを拒否しておくのをおすすめします。
いくら外部からアクセスするといっても海外からアクセスすることは無いという人が多いでしょう。
現在epgrecの脆弱性を狙っているハッカーは海外在住なので、日本のVPNやプロクシサーバを経由させたりしなければアクセスできません。
通常のウェブサイトでこれをやると、Googleの検索結果に載らないといった副作用がありますが、録画システムでは関係ないことかと思います。
国外IPからのアクセスを拒否する方法ですが、「フリーCGI 無料ショッピングカート CGI’s」というサイトの「日本国外からのアクセスを制限する.htaccess」にて.htaccessを自動で生成してくれます。
これを適当なディレクトリに配置しておけば国外IPからのアクセスを拒否できます。
意味のない対策
バーチャルホストでepgrecの部分だけドメインを変えようとか、IPアドレスやドメイン名を秘密にしておけばいいとか、そういったことは全く意味がありません。
なぜならこういった誰も見に来ない過疎ウェブサイトに対しても攻撃を行っており、対象のIPアドレスを機械的に選んでいる可能性が高いです。
遊び
前回はファイアウォールで遮断しましたが、IPはたまに変わるので申し訳程度の効き目しかありません。
もしかしたらハッカーは正常にアクセスできた場合に限り、GETしたページを見ているかもしれません。
ということでepgrecのファイルがおいてあるはずの場所に遊びでファイルを置いておくことにしました。
置くファイル
/imgにyou_are_an_idiot.gifを置きました。
/epgrec/templates/envSetting.html
/templates/envSetting.html
/epgrec_old/templates/envSetting.html
/tv/templates/envSetting.html
/rec/templates/envSetting.html
/epg/templates/envSetting.html
/epgrec_STZ/templates/envSetting.html
にhtmlファイルを置き、以下の通りにしました。
混乱させるためにコメントとして本物のepgrecのenvSettings.htmlを置いています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 |
<!DOCTYPE html> <!-- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Style-Type" content="text/css"> <title>{$sitetitle}</title> <script type="text/javascript" src="js/jquery-1.3.2.min.js"></script> <script type="text/javascript" src="js/jquery.validate.min.js"></script> <script type="text/javascript" src="js/messages_ja.js"></script> <script type="text/javascript"> --> <!-- {literal} var PRG = { force_cont:function() { if( $('#id_force_cont_rec' ).val() == 0 ) { $('#id_rec_switch_time').attr('disabled','disabled'); } else { $('#id_rec_switch_time').attr('disabled',false); } } } $(document).ready(function(){ $("#env_setting").validate(); PRG.force_cont(); }); {/literal} --> </script> <!-- <style type="text/css"> --> <!-- {literal} body {padding:4px;margin:0;font-size:10pt; width: 85%;} a {text-decoration:none;} .bold {font-weight:bold;} .small {font-size:75%;} div.setting { padding: 0px; margin-left: 20px; margin-bottom: 20px;} {/literal} --> <!-- </style> </head> <body> <form id="env_setting" method="post" action="{$post_to}"> <div>{$message}</div> <h2>デジタルチューナー設定</h2> <h3>地デジチューナーの台数</h3> <div class="setting"> <div class="caption">サーバーに接続されている地デジチューナーの台数を設定してください。地デジチューナーを持っていない場合、0にします。</div> <input type="text" name="gr_tuners" value="{$settings->gr_tuners}" size="3" class="required digits" /> </div> <h3>BSチューナーの台数</h3> <div class="setting"> <div class="caption">サーバーに接続されているBSチューナーの台数を設定してください。BSチューナーを持っていない場合、0にします。</div> <input type="text" name="bs_tuners" value="{$settings->bs_tuners}" size="3" class="required digits" /> </div> <h3>CS録画の有無</h3> <div class="setting"> <div class="caption">この設定を「行う」にするとCS放送を加味した動作となります。CS放送を使用しない方は「使わない」に設定してください。</div> <select name="cs_rec_flg" id="id_cs_rec_flg" > <option value="0" {if $settings->cs_rec_flg == 0} selected {/if}>行わない</option> <option value="1" {if $settings->cs_rec_flg == 1} selected {/if}>行う</option> </select> </div> <h2>録画関連設定</h2> <h3>録画開始の余裕時間(秒)</h3> <div class="setting"> <div class="caption">epgrecは番組開始時間より早く録画を開始します。どのくらい録画開始を早めるかを秒で設定してください。早める時間を短くしすぎると、番組冒頭がとぎれる恐れがあります。設定できる時間は0秒以上180秒未満です。</div> <input type="text" name="former_time" value="{$settings->former_time}" size="4" class="required digits" min="0" max="179" /> </div> <h3>録画時間を長めにする</h3> <div class="setting"> <div class="caption">下の欄に0以上の秒数を設定すると、すべての番組に対して設定した秒数分だけ録画時間を延ばします。この設定は「連続した番組の予約」設定と相性が良くありません。0以外の秒を設定する場合、連続した番組の予約が行いづらくなることに注意してください。推奨値は0です。</div> <input type="text" name="extra_time" value="{$settings->extra_time}" size="4" class="required digits" /> </div> <h3>連続した番組の予約</h3> <div class="setting"> <div class="caption">この設定を「行う」にするとepgrecが自動的に直前の時間に予約されている番組の録画時間を短縮して時間が連続している番組の予約を可能にします。録画時間を短縮する時間は「録画開始の余裕時間」+「録画コマンドの切り替え時間」です。この機能を使って連続した番組を予約する場合、前の時間の番組の最後がとぎれる可能性がありますが、チューナーが1台しか無くてもキーワード自動録画による連続した番組の予約が可能になります。メリットとデメリットをよく考えて設定してください。</div> <select name="force_cont_rec" id="id_force_cont_rec" onChange="javascript:PRG.force_cont()" > <option value="0" {if $settings->force_cont_rec == 0} selected {/if}>行わない</option> <option value="1" {if $settings->force_cont_rec == 1} selected {/if}>行う</option> </select> </div> <h3>録画コマンドの切り替え時間</h3> <div class="setting"> <div class="caption">連続した番組を予約するとき、録画が終了して次の録画を開始するまでの余裕時間(秒)を設定します。1以上の秒数を設定してください。設定する秒数が短いほど録画時間を短縮する時間が短くなりますが、この時間を短くしすぎると連続した番組の予約に失敗する恐れがあります。失敗するかどうかは使用している録画コマンドやチューナーに依存します。</div> <input type="text" name="rec_switch_time" id="id_rec_switch_time" value="{$settings->rec_switch_time}" size="4" class="required digits" min="1" /> </div> <h3>優先する録画モード</h3> <div class="setting"> <div class="caption">キーワード自動録画や簡易録画を行う番組の録画モードを設定します。config.phpの$RECORD_MODEに複数の録画モードを登録し、do-record.shをカスタマイズているのであれば、その録画モードを優先して利用できます。キーワード自動録画はキーワード登録時に録画モードを設定することもできます。デフォルトはモード0です。 </div> <select name="autorec_mode" id="id_autorec_mode" > {foreach from=$record_mode item=mode name=recmode} <option value="{$smarty.foreach.recmode.index}" {if $settings->autorec_mode == $smarty.foreach.recmode.index} selected {/if}>{$mode.name}</option> {/foreach} </select> </div> <h3>mediatomb連係機能</h3> <div class="setting"> <div class="caption">この設定を「使う」にすると録画した番組のタイトルと概要をmediatombに反映させます。mediatombを使用していない方は「使わない」に設定してください。なお、この設定を利用するにはmediatomb側の設定も必要になります。詳しくはドキュメントを参照してください。 </div> <select name="mediatomb_update" id="id_mediatomb_update" > <option value="0" {if $settings->mediatomb_update == 0} selected {/if}>使わない</option> <option value="1" {if $settings->mediatomb_update == 1} selected {/if}>使う</option> </select> </div> <h3>録画ファイル名の形式</h3> <div class="setting"> <div class="caption">epgrecは録画ファイル名をカスタマイズすることができます。下の欄にファイル名のフォーマットを記入してください。フォーマットに使用できる特殊文字列は以下の通りです。 <table cellspacing="1" border="1"> <thead> <tr> <th>特殊文字列</th><th>置換後の内容</th> </tr> </thead> <tbody> <tr><td>%TITLE%</td><td>番組タイトル</td></tr> <tr><td>%ST%</td><td>開始日時(ex.200907201830)</td></tr> <tr><td>%ET%</td><td>終了日時(同上)</td></tr> <tr><td>%TYPE%</td><td>GRまたはBS</td></tr> <tr><td>%CH%</td><td>チャンネル番号</td></tr> <tr><td>%DOW%</td><td>曜日(英3文字Sun-Mon)</td></tr> <tr><td>%DOWJ%</td><td>曜日(漢字1字日-土)</td></tr> <tr><td>%YEAR%</td><td>開始年</td></tr> <tr><td>%MONTH%</td><td>開始月</td></tr> <tr><td>%DAY%</td><td>開始日</td></tr> <tr><td>%HOUR%</td><td>開始時</td></tr> <tr><td>%MIN%</td><td>開始分</td></tr> <tr><td>%SEC%</td><td>開始秒</td></tr> <tr><td>%DURATION%</td><td>録画時間(秒)</td></tr> </tbody> </table> たとえば、<p>%YEAR%年%MONTH%月%DAY%日%HOUR%時%MIN%分%SEC%秒_%TYPE%%CH%_%TITLE%</p>と設定すると<p>2009年07月15日12時49分16秒_GR21_番組タイトル.ts</p>というような形式の録画ファイルが生成されます。%TYPE%や%CH%などを混ぜ、異なる番組に同じ録画ファイルが生成されないよう注意してください。なお、ファイルシステムがUTF-8以外の文字コードで、ファイル名に日本語を交ぜる場合、config.php内の定数FILESYSTEM_ENCODINGに文字コードを設定することができます。ただし、UTF-8以外の文字コードはテストを行っていないため推奨しません。</div> <input type="text" name="filename_format" value="{$settings->filename_format}" size="40" class="required" /> </div> <h2>番組表表示設定</h2> 以下の設定は実際に利用して様子を見ながら設定した方がいいでしょう。 <h3>ページに表示する番組表の長さ(時間)</h3> <div class="setting"> <div class="caption">1ページに表示する番組表の長さを時間で設定します。標準は8時間分です。</div> <input type="text" name="program_length" value="{$settings->program_length}" size="2" class="required digits" min="2" max="24" /> </div> <h3>1局あたりの幅</h3> <div class="setting"> <div class="caption">番組表の1局当たりの幅をピクセル数で設定します。標準は150ピクセルです。</div> <input type="text" id="ch_set_width" name="ch_set_width" value="{$settings->ch_set_width}" size="4" class="required digits" min="20" /> </div> <h3>1時間あたりの高さ</h3> <div class="setting"> <div class="caption">番組表の1時間あたりの高さをピクセル数で設定します。標準は120ピクセルです。なお、60で割り切れないピクセル数を指定するとFirefoxを除くブラウザでは番組の高さが揃わなくなり見た目が悪くなるかもしれません。これはFirefox以外のブラウザでは実数のピクセルを正しくレンダリングしないためです。</div> <input type="text" id="height_per_hour" name="height_per_hour" value="{$settings->height_per_hour}" size="4" class="required digits" min="30" /> </div> <input type="submit" value="設定を保存する" id="env_setting-submit" /> </form> </body> </html> --> <html> <head> <title>FUCK OFF</title> </head> <body> <h1>YOU ARE AN IDIOT!</h1> <p>Do you want watching anime?</p> <p>Simple, buy the anime.<br> You can watch all you want!</p> <img src="/img/you_are_an_idiot.gif"> </body> </html> |
アクセスするとこのように見えます。
(日本語訳)
バーーーーーカ
アニメが見たいのか?
簡単さ、アニメを買えばいい。
好きなだけ見れるぞ!
タイトルがfuck offで草