Linuxゲリラ戦記

俺は、いつも地面を這いつくばって必死に生きている。そう、俺は這ッカー!!

33.ハッキングあたーっく!lwp-requestで情報を要求!/dev/nullはブラックホール

ナックス「20XX年。中国政府、グーグルに対してハッキングを行い、中国人人権家の個人情報を盗もうとする」

ナックス「これに対してグーグル。逆ハッキング行為でハッキング元が中国本土であることを突き止める。しかし、中国政府がハッキングを直接指示したという証拠は掴めず。中国からの撤退をちらつかせる」

ナックス「そして現在!我々健全なる男子は!スカートの下のパンツをちらつかせる女の子に!ハートをハッキングされている!」

ナックス「そんな危機的現状をどう思うのか!!そこの少年!!」

デビー君「…………」

ナックス「はい。というわけで今回は簡単なハッキングあたっく(じゃないけど、そんな感じなこと)を解説します」

デビー君「いいの?実行したら警察に捕まらない?」

ナックス「実行したら警察に捕まります。実行しないでください」

ナックス「というわけで今回はDoS攻撃を解説致します」

デビー君「ドス攻撃?」

ナックス「サービスを提供するもの、すなわちサーバーに過負荷を与える攻撃です。と言っても今回はDoS攻撃の基本、F5アタックの応用です」

ナックス「何度もいいますが、実行すると捕まります」

ナックス「で。他人に実行すると本当に捕まるし。かと言って私をターゲットにすると私が困るので、今回はDoS攻撃の手前まで解説して、DoS攻撃の手前の状態を当サイトで試していただこうというわけです」

デビー君「え?このサイトを攻撃するの?」

ナックス「いいえ。このサイトに本気のDoS攻撃された方はマジで警察に通報するので、私の解説以上の攻撃はしないでね」

ナックス「というわけで、まずは私が作ったカウンターの置かれたページを見てみてね」

デビー君「ん?カウンターの置かれたページを見てみたけど、数字が書かれてるだけだよ?そもそもカウンターって何?」

ナックス「カウンターというのは『このページに○○人のアクセスがあったよー』っていうものです。昔ほどカウンターを設置しているサイトは多くありませんが、デビー君も見たことくらいはあるでしょう。アクセスカウンターと言った方が分かりやすいかな」

ナックス「インターネットの話!!」

ナックス「皆さん!インターネットの仕組みについてご存知ですか!?実はインターネットとはリアルタイムに情報を送信しているのではなく、ある一瞬を切り取っているだけなのです!」

デビー君「さぁて、ナックスがまたわけの分からないことを言い出しました」

ナックス「おそらく、皆さんがなんとなく思っているネットの仕組みはこう!」

サーバーからリアルタイムに現在の情報が届けられている図

ナックス「上記は、ウェブサイトの情報が置かれている場所、すなわちウェブサーバーから情報がリアルタイムにあなたのパソコンに送りつづけられている、の図です。しかし、これはまちがったイメージです。実際は……」

最初の一回だけ情報をお届けする

ナックス「というように、最初の一回だけサーバーの情報が来て、皆さんはやりとりしたその一回の情報を見ているのです」

ナックス「つまり、私たちがサイトを見ている間、そのウェブサイトが情報を新しく書き換えても私たちは古い情報を見ている……ということがありえるのです」

古い情報のまま

ナックス「そんな時、私たちが新しい情報を見るにはF5キーを押すだけで良いのです。F5キーを押すことで、再度『情報くれ!』とサーバーに要求することになり、サーバーはその時点で最新の情報を皆さんにお届けします」

ナックス「さぁ!皆!カウンターの置かれたページでF5キーを押そう!」

デビー君「F5キー?」

ナックス「そうです。デビー君が苦手な真のCUI環境を起動するときにちょっとだけお世話になったかもしれない、あのキーです」

デビー君「えーっとそれは、CUI環境を開いてからF5キーを押せってこと?」

ナックス「いいえ。普通にFirefoxやらOperaやらKonquerorやらIceweaselやらなんやらともかくインターネットでウェブサイトを見るソフト(ブラウザ)でカウンターの置かれたページを見ながらF5キーを押してください」

デビー君「えい!」

デビー君「お。数字が増えた」

ナックス「そうです。F5キーを押す(「情報くれ!」)と、ページの情報が更新される(「今の時点で最新の情報やる!」)のです」

ナックス「シンプルなカウンターの場合、『新しく情報を要求される度に数字を増やす』という機能になっています。そのため──」

デビー君「F5キーを押す度に数字が増えるよ!!これじゃあ『来た人を数える』っていうアクセスカウンターとしてはダメなんじゃないの?」

ナックス「そうなんです。現在ではこの問題を解決した高機能なアクセスカウンタも多々あります」

デビー君「F5キーを押しまくると、数字も増えまくる!面白い!うぉー!!もっと増えろー!!」

ナックス「と、今デビー君がF5キーを押しまくっている状態。それがF5アタック。DoS攻撃の基本です」

デビー君「え?これもハッキングなの?F5キーを連打しているだけだよ?」

ナックス「ちなみに、ハッキングは『困ったことをあらゆる手段で手早く解決する事』という意味であり、パソコンで悪いことをするのはクラッキングと言います。というわけで正確にはデビー君が今行っているのはクラッキングです。」

ナックス「インターネットの仕組みの解説の時に、情報のやりとりは一度だけと言いました。『情報くれー』『情報やるぞー』というシンプルなやりとり。しかし、『情報くれ』『まだか』『早くしろ』『待ってんだ』『急げ』と過剰に要求しまくると、要求への返答が間に合わなくなってエラーになることがあります。これは立派なクラッキング行為。と言っても、少数の人間がF5キーを連打するだけでは最近のサーバーはビクともしません。F5アタックを成功させるには大人数での攻撃が必要ですね」

ナックス「DoS攻撃とは、何らかのサーバー(今回はWebサーバー)に多大な要求(トラフィック)をだして、正常な動作をさせなくする(返答が遅くなる。エラーを出す)ことです」

ナックス「さて。早速CUI環境を立ち上げましょう」

デビー君「立ち上げましたー」

CUIを起動する

ナックス「今まではブラウザ(インターネットをするためのソフト)からサーバーに『情報くれ』と要求していました。これをコマンドから要求してみましょう。ウェブサーバーに『情報くれ』とリクエストする(要求する)のはlwp-requestコマンドです」

$ lwp-request 要求先のアドレス

ナックス「今回の要求する情報はhttp://www.garunimo.com/program/linux/sample/counter.phpです」

$ lwp-request http://www.garunimo.com/program/linux/sample/counter.php

ナックス「結果は以下の様になります」

$ lwp-request http://www.garunimo.com/program/linux/sample/counter.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>アクセスカウンター</title>
</head>
<body>
<h1>アクセスカウンター</h1>
<p><a href="../linux33.php">ハッキングあたーっく</a>に戻る。</p>
<p>
103</p>
</body>
</html>

CUIからサーバーに要求を出す

デビー君「うわ!なんか変なのが出てきた」

ナックス「変なのとは失礼な。これは『情報くれー』と言った私たちに対して『情報やるよー』と返ってきた情報です。実はウェブサイトというのはテキストエディタで作られます。<html>とか<title>とかはタグと呼ばれるもので、ウェブページを作る時に使われるものです。実は、ブラウザというのはこの返ってきた情報を人間に見やすいようにグラフィカルなものに変換して表示するためのものだったんですね。Linuxをディープに勉強したいなら、ぜひとも一度で良いからウェブサイト作りも経験しておくと良いのですが……。もし興味があれば当サイトの別コーナーウェブサイトの作り方なども見てみてください」

デビー君「あれ?ウェブサイトの作り方、去年の10月25日から更新が止まっ」

ナックス「ちなみに!lwp-requestというコマンドが無いよ、っていうエラーが出る方(最初のlはLの小文字です)。コマンドもパッケージの一種です。yumなりaptitudeなりでインストールすれば良いさ」

ナックス「さて。こいつをシェルスクリプトに組み込んで攻撃スクリプトを作るよ。nanoエディタでファイル名はfueru.shにでもしておこう」

$ nano fueru.sh

nanoコマンドでシェルスクリプトを作成する

nanoが起動する

ナックス「以下の様に書こう」

#!/bin/sh

a=1
while [ $a -le 10 ]
do
	lwp-request http://www.garunimo.com/program/linux/sample/counter.php
	a=`expr $a + 1`
done

シェルスクリプトを書く

ナックス「いつも通りに保存して終了だ」

Ctrlキーを押しながらOキー
保存するファイル名を決めてEnterキー
Ctrlキーを押しながらXキーを押して終了

ナックス「シェルスクリプトを見れば分かるように、今回はとりあえず10回だけ要求してみることにする」

ナックス「実行権限をつけて」

$ chmod u+x fueru.sh

実行権限をつける

ナックス「まず、ブラウザでアクセスカウンタがいまいくつなのかを確認してから」

実行する前のカウンタ

ナックス「実行しよう」

$ ./fueru.sh

実行する

デビー君「おぉ。確かに10回要求したみたいだ」

ナックス「うん。でもブラウザでは『10回要求する前の古い情報が表示されてる』。F5キーを押せば、10回要求された後の新しい情報が表示されるよ」

デビー君「おぉ!数字が増えてる!」

数字が増えてる

ナックス「うん。でも、シェルスクリプトを実行した時に返ってきた結果が表示されるのはあまり格好良くない。そこで/dev/nullの出番だ」

デビー君「/dev/null?」

ナックス「/dev/nullは、そこに送り込まれた全てのものを消し去るブラックホールだ。以下の様にコマンドを打ってごらん」

$ lwp-request http://www.garunimo.com/program/linux/sample/counter.php > /dev/null

/dev/nullにリダイレクトする

デビー君「あれ……。結果が返ってこない……。」

ナックス「正確には結果は返ってきてるんだけど > でリダイレクトして/dev/nullに送り込んでるんだ」

デビー君「 > って何?」

ナックス「リダイレクトっていって14.パイプとgrep、less。で教えたパイプ(|)と同じ仲間の一種だよ」

ナックス「パイプ『|』は『その結果を別のコマンドの入力として渡したいとき』に使うのに対して、『>』は『あるコマンドの出力結果を別のファイルに書き込む』ときなんかに使うよ。ただ、今回はその先が全てを亡き者とする特別なファイル /dev/null だけどね」

デビー君「ということは、返ってくるはずの結果の」

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>アクセスカウンター</title>
</head>
<body>
<h1>アクセスカウンター</h1>
<p><a href="../linux33.php">ハッキングあたーっく</a>に戻る。</p>
<p>
103</p>
</body>
</html>

デビー君「は……」

ナックス「まぁ、分かりやすく言えば消去された、ってことだね」

ナックス「さて、先ほどのfueru.shを書き換えよう。数字も60ほどにしてみようか」

$ nano fueru.sh
#!/bin/sh

a=1
while [ $a -le 60 ]
do
	lwp-request http://www.garunimo.com/program/linux/sample/counter.php > /dev/null
	a=`expr $a + 1`
done

結果を返さないシェルスクリプト

Ctrlキーを押しながらOキー
保存するファイル名を決めてEnterキー
Ctrlキーを押しながらXキーを押して終了

ナックス「実行権限が無いようなら実行権限を付け足して、まずブラウザから現在のアクセスカウンタの数字を確認」

実行前のアクセスを確認

ナックス「そして実行」

$ ./fueru.sh

実行する

ナックス「最後に、ブラウザの更新ボタン(F5キー)を押せば、数字が増えたことを確認できる」

実行後のアクセスを確認

デビー君「おー。なるほど」

ナックス「その気になれば、無限ループで永遠に要求して、終わりたいときにCtrlキーを押しながらCキーで終了。なのですが、これはもう立派な犯罪で本当にサーバーエラーとかになるかもしれないので、無限ループでの当サイトの攻撃はやめてね。最高でも60回までにしておいてね」

ナックス「今回習ったこと!」

デビー君「lwp-requestコマンドで、CUIからウェブサーバーに情報を要求できる!」

デビー君「/dev/nullはすべての情報を無に帰す特別なファイル!」

デビー君「>は、パイプ|の仲間!コマンドの結果を別のところに移す……のかな?正直、これはまだ良く分からない……」

ナックス「正解です。良く出来ました。>はパイプ|と一緒に合わせていつかきちんと再度やりましょう」

ナックス「──さて。今回解説した方法で攻撃して通報された場合、警察があなたの身元を調べるのに必要な時間は……5分です」

デビー君「5分!?5分でバレるの!?」

ナックス「これは言い過ぎとしても、まぁその気になれば5分で見つかるよ、ってことです」

ナックス「というわけで次回!!『私の不倫と私のハッキングはなぜバレるのか(34.私のハッキングはなぜバレるのか。whoisコマンド。nslookupコマンド。ifconfigコマンド。)』です」

補足

lwp-requestのコマンドが無いというエラーが出るとき

すいません。lwp-requestという名前のパッケージは存在しないですね。私の場合最初から入っていたので実際に試すことが出来ず自信が無いのですが、perlという名前のパッケージをインストールしてみてください(実際のパッケージ名にはバージョン番号などもついていると思います)。

perlはLinux文化から生まれたプログラミング言語の一種で、多くのLinuxディストリビューションで最初からインストールされているはずです。それをインストールすれば使えるのでは、と……。

インストール途中に「これもインストールする?」などと聞かれた場合はとりあえず全てインストールしてみてください。

このエントリーをはてなブックマークに追加