ひよこになりたい

Programming Server Network Security and so on

CentOS でプロンプトのユーザー名が「私は名前がありません!」になった件について

VMで作ったテストCentOS鯖で遊んでいると・・・プロンプトのユーザー名が"私は名前がありません!"になってしまいました。

 

初めて見る謎のエラー文?で少しばかり手こずったのでメモ。

 

useradd usernameでユーザーを作成して、`su username` で変身。おもむろに画面を見ると・・・

 

```

[私は名前がありません!@server001 ~]$

```

 

なんだこの名前・・・ぐぐってもあまりいい情報が出ず。

 

とりあえず何か手がかりはないか模索してみる。すると、

 

```

[root@server001 ~]# su username

id: cannot find name for user ID 502

# -------------

[私は名前がありません!@server001 ~]$ id

uid=502 gid=502(username) 所属グループ=502(username) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

```

 

uidの関連付けあたりでエラー出てるっぽい?

 

usernameに変身もできるし、idでユーザー情報の確認ができるけど、uidが見つからない模様。

 

この辺りがおかしいのかな?

 

というわけで、`/etc/shadow` と `/etc/passwd` と `/etc/group` を確認。

 

内容には問題がなかったのですが、`/etc/passwd` パーミッションがオカシイ

 

```

[root@server001 etc]# ls -la passwd

-rw-------. 1 root root 1473  3月 20 00:47 2014 passwd

```

 

なるほど・・・

 

原因はここっぽい。/etc/passwdは644になっているべきなので、変更してあげる。

 

```

[root@server001 etc]# chmod 644 passwd

``

 

再度変身。

 

```

[root@server001 etc]# su server300

[server300@server001 etc]$

```

 

なおった!

 

passwdファイルはroot以外でも読み込むことがあるので644じゃないと行けないみたいですね〜

 

/etc/passwd ファイルを一般ユーザが更新できる理由 - ねもぷらす: http://nemoplus.hateblo.jp/entry/20100704/1278252696

 

なおってよかったー

SECCON2013全国大会に出場しました

SECCON全国大会に出場してきました。

ということで私が解くことができた問題のWriteupをしたいと思います。

今回、私が回答を提出した問題は0問でした。

以下、提出した問題のWriteupです。



・・・という冗談はさておき。

SECCON2013全国大会に出場してきました!

20140301_122919in 東京電機大学。会場も大学自体もすごくキレイで、さすが私大だなぁと・・・羨ましい。駅にも近いし周りは色々なものがあるしいい場所です。

地方大会ではJeopady方式(問題を解いてFLAGを手に入れる)ですが、本戦では攻防戦。自分のチームのFLAGを書き込み続ければその分点数どんどん増えていく感じです。

出場チームは地方大会とOnline予選を通過した強豪ばかり。会場の顔ぶれもすごい。

DSC01166sこんなかんじで挑みました。MacBook Airdynabook(Win8.1)。メインで使用するのはMBAです。

各チームのテーブルにはルーターとコンセント(3つ)があり、そこに接続して問題サーバーに接続するといった感じになってました。(http://2013.seccon.jp/seccon2013finalchallenge.html

周りは手慣れた様子で着々と用意を進めてました。(こわい)

会場モニタにはネットワーク可視化システム、NIRVANA改が動いていました。(写真撮り忘れていた。。。)

図2 NIRVANA改 SECCONカスタム(Towerモード)

イメージはhttp://www.nict.go.jp/info/topics/2014/02/140228-1.htmlより

かっこいい!!パケットの飛びがすごくわかりやすかったです。

nmapでスキャンしたりすると、パケットの点がズラーっと連なって飛んで行く様子が見て取れます。TCP, UDPどちらもわかるようになっているみたいです。私の家にも欲しいなぁ()w

隣のチームへのパケットも表示されるので運営側は不正行為を見つけやすい(?)ので非常に良いシステムだと思います。中の人とも軽くお話させてもらいましたが、このシステムを作るのに非常に苦労したようで・・・。

競技者側からのNIRVANA改への意見・視点を参考にしたいとおっしゃってました。(ただ私は競技に集中していたのでNIRVANA改を見る余裕があまりありませんでした。一度観客側からどんな感じか見たいものです)

問題を解いた感想など

私は参加はしたものの、Key提出までには至らずWriteupを書く人権がないのですが(足引っ張ってしまい非常に申し訳ないです)気づいた点などをメモしておきます。

次回参加できれば今回の全国大会の経験を活かして点数獲得したいな。

問題について

予選と違い、与えられる問題は実際の攻撃に近い形で与えられるので、ノーヒントです。分類やタイトルなども与えられないため、問題サーバーに接続しただけではどのジャンルなのかも分からない状態でした。

また、復号問題が大半で、なかなか取っ掛かりを見つけることが難しかったです。

やったことなど簡単に書きますがWriteupではないので、解法がほしい方は他のサイトを見るといいです。

karin.tower

Web系の問題。クッキーを覗いたり、取得できるディレクトリを探しまわっていましたが、なにも解けませんでした。

フォームに色々入れて、Mailaddressの入力フォームにXSSできることがわかりました。それだけでした。というのも、/image/の中に、captchaSt1.cgiやKey.jpg, Key2.jpg, /nothinghereディレクトリなど意味深なものが大量にあったのでそこの解析を重点的にやってしまったのです。。

Adminページがあることと、CookieCGIのSESSIONIDがあったので、どこかで使うのだろうと考えていたのですが、XSSでAdminのSESSIDを奪うなどという事は考えても見なかったです。終わったあとに考えてみれば、確かに管理人に対してメールを送るフォームであるから、AdminのSESSIDをXSSで奪えるよなぁ。

そこが解けないと次に行くのは無理みたいなので、解けたチームはどんどんKeyを獲得して、逆に解けなかったチームは全然得点を得ることが出来ないということに。悔しい。

2.kaku.tower

通天閣タワー。どんな問題か忘れかけてる程度には手も足も出なかったバイナリ系の問題。

シェルコードをうにゅうにゅする問題みたいですがバイナリ系は全くわからないので投げました。

バイナリを勉強する予定なので、問題来たら解けるようになりたいな。

Pisa.tower

ピサの斜塔。掲示板の問題。hattoriさんがつくったらしい。

掲示板にフラグを書き込むと得点が増えていく模様。とりあえずいろいろ試してみてもあまりわからず。。。

途中からXSSでダイアログでたり、強制リダイレクトされたり。

多分自動化すれば点は入るだろうと思って、思っただけでした。←こういうのダメですね

やっぱりやらないとダメだということを思い知らされました。結局これをやらなかったおかげで得点が伸びず。

captchaの自動化をどうするのだろうか?と思ったのですが、実はCaptchaを見ないとキーが変わらないみたい。気付かなかった。

Druaga.tower

ここから3問は一日目の最後に追加されたもの。

とりあえず落とし始めたのですが、回線は大混乱。80MBのファイルダウンロードに14kb/sとか無理だろ!

ギリギリまで粘りましたが、結局ダウンロードできず。落とせたチームは、二日目のはじめに即提出できたみたい。つよい。

Passwordはすでに与えられていたのでTrueCryptでマウントするとKeyを発見。

その後は、5つのディレクトリの中に100のディレクトリがあり、その中に100のディレクトリがあり、その中にtaka.jpgがそれぞれ入っていて、そのファイルはそれぞれ違うアセンブラ短歌が書かれている。これを詠んで、0609を出力できるものを探せというもの。

OCRを掛けて、ひたすら実行すれば出るだろうと思ったのですが、アセンブラ短歌の実行方法がわからず。

バイナリ勉強せねば・・・

Babel.tower

バベルの塔。2つのpureserverとjamserverという名前のバイナリファイルがそれぞれ別のポートで動いており、さらにそのファイルをもらえる。

jamserverの方は、メンバーがブラウザからそのポートにアクセスするとキーが出ることを発見。

pureserverの方は、フォーマットストリング攻撃だということはすぐにわかったのですが、やっぱりバイナリは(´・ω・`)

han01.tower

ログインフォームとハノイの塔のGifアニメがあり、更にid.txtやpass.txtへのリンクが有る。

id.txtの方をクリックすると、daemonとbackupと書かれたファイルが。URLをみると

[bash]

http://han01.tower/readfile.php?filename=id.txt&accesscode=1bc29b36f623ba82aaf6724fd3b16718

[/bash]

となっていた。accesscodeはMD5でハッシュされてるっぽい。何のハッシュなんだろう?と思ってるとメンバーの方がfilenameのハッシュだよ!と教えてくれた。やってみるとたしかにそうだ。

pass.txtも見れるかな?と思ってやってみたら見れた。daemonとbackupの後にsha~(1なのか512日は忘れた)のハッシュがあるだけ。結局わからず。

readfileではなんでも読み込めそうだったので、readfile.phpを読ませると読めた。さらにindex.htmlも読めて、ここにはkeyがありました。(すでに提出済み)

一日目はここで終了。後の話し合いの時に、メンバーさんが「ハノイの画像にIPアドレスみたいなのがあるよ」と。

二日目に試しにDNSに問い合わせてみました。がわからず。終わり際に別のサーバーがあるということが判明したので、2つめのハノイの塔のサーバーにアクセスをして見ると同じようなWebサイトが。同じようにreadfileに読ませてみると同じような感じに。

ただ今回は少し違って、menuというファイルがあることがreadfile.phpからわかった。index.htmlを読むとパスワードは/bin/menuのmd5だよ!って書いてあったので、readfile.phpにmenuを読ませるとbase64エンコードされた文字があった。コピペして、Pythonbase64をデコードして、出てきたバイナリを保存。

fileコマンドで見てみるとSysExファイルとの表示が。ググって調べるとどうやらMIDI関連のものらしい?アプリケーションで開いて探ってみましたが全くわからず、タイムアップ。よくわからないまま終わってしまった。

得点について

全国大会では地方予選と違い攻防戦なので、Keyを提出した点数と、自チームのFLAGを書き込み、守ることで得られる点数の2つがあります。

そのため、その両方を念頭に置いて挑まなければならないのですが、本戦はFLAGを守ることで得られる点数が非常に高かった模様。

私のチームはそのことを後回しにしていたせいで、後半の周りの伸びについていけず、大きく点数を落としてしまいました。

例えばPisa.towerの掲示板にFLAGを書き込む問題、最初から自動投稿するようにスクリプト化をしていたチームはそれだけでKey提出数回分の得点を得ていたみたいです。

点数配分は一応書いていたみたいなので、そこを読み飛ばしたのが悪いのですが。

一日目が終わっても競技は続く・・・

基本中の基本ですが一日目が終わってもファイル解析や落としたバイナリの穴探しは続けることができます。

Web系の問題は競技ネットワークが切られているので無理ですが、それでも話し合い位はできるので私のチームは居酒屋で酒を飲みながらやっていました(w

ホテルに到着してからもファイルの中を覗いたり色々とやっていましたが・・・うーん、難しかったw

全体的に

バイナリ系がなにもできなかったことが辛かったです。Web系の問題なども解けなかったので、メンバーさんに申し訳ない限り・・。

本戦形式の問題は、手がかりを探すことからはじめなければならないので、それに慣れていない私には厳しい大会でした。この辺りは経験が必要なのかな。

問題自体もスラスラと解けるようなものではなかったので、苦戦しました。

しかし、本戦出場は非常にいい経験になりました。チームメンバーには感謝してもしきれません。

来年のCTFで戦えるようにWriteupを見てバイナリとWebを中心に勉強しよう。

DSC01187

SECCON CTF Online 解けなかった問題を2つほど

一つ前にSECCON CTF 2013 Online にでさせてもらいましたという記事を書いて、解けた問題(一問)だけWrite upしましたので、今回は解けなかった問題を途中まで、です。需要はないかな・・・・

自分の頭のなかでの整理と、記録のためです

拙いコードですがお暇な方は見ていってください。

SECCON 2013 CTF OnlineのWriteupまとめはこちらのブログさんが参考になると思いますので、詳しい解法が知りたい方はどうぞ つ:SECCON 2013 CTF オンライン予選のWriteupとかまとめてみた。 - piyolog

プログラミング/Crypt 500

telnet 133.242.50.48 65437 で問題サーバに接続して、 5個のシーザー暗号と、5個の換字式暗号と、 単語区切りのスペースが消されたシーザー暗号と換字式暗号、 計12個を、それぞれ10秒以内に解いてください。

答えは、平文の「a」が、暗号文だと何になるかで答えてください。

フラグが3つあります。

10問目まで解けた時点で350点。11問目までで+50点。 12問目まですべて解けると、+100点で、計500点が得られます。

telnetすると暗号問題が降ってくるのでさぁといてね!って問題です。一見すると簡単そうに見えますがこれがかなり難しい。

[bash]'transposition ciphers' challenge for SECCON 2013.

by KeigoYAMAZAKI, 2013.11.06-

- Challenge 01-05 => Caesar cipher

- Challenge 06-10 => simple substitution cipher

- Challenge 11 => Caesar cipher without separators ("space" removed)

- Challenge 12 => simple substitution cipher without separators

*** Challenge 01 (of 12)

Kmbsjc::Glqryjj fyq jmrq md amkkylbq qayrrcpcb gl rfc cvrclqgmlq.

Rfgq gq y qfmpr bcqapgnrgml md rfc nspnmqc md rfc bgqrpgzsrgml.

Rfcqc ypc rfc amkkylbq rm upgrc yarsyj kcry dgjcq.

plain [a] -> cipher ?

[/bash]

こういうのが降ってくるのでときましょうという問題

タイムリミットが一問10秒と超短かったので、さすがに手動では無理と断念。

とりあえずプログラムに説かせるべく、PythonのTelnetlibを使って接続しました。

CeaserCipherのプログラムは前書いていたのを使用。

telnetlibの使い方がいまいちよくわからなかったのですが、なんとか接続して取得し、投稿まで出来るようにしました。

Challange 01-05を攻略するプログラム

[bash]

# -*- coding: utf-8 -*-

import telnetlib

from string import *

import sys

#Telnetする

HOST = "133.242.50.48"

tn = telnetlib.Telnet(HOST, 65437)

#問題文を解き終わるまでループ

while True:

arr =

msg = ""

#ceaser結果をarrに格納

def ceaser(source):

for n in range(26):

trns = translate(source, maketrans(uppercase + lowercase, uppercase[n:] + uppercase[:n] + lowercase[n:] + lowercase[:n]))

arr.append(trns)

print "> [", n,"] "

print arr[n],

tn.read_until("(of 12)")

tn.read_until("\n")

#問題文

msg = tn.read_until("plain [a]")

ceaser(msg)

msg = msg.replace('\n', '').replace('\r', '')

print msg

#bunが正しい文かどうかを調べる。正しければTrue

def isSentence(bun):

count = 0

bun = bun.replace('\n', '').replace('\r', '').split(" ")

for tango in bun:

if tango == 'in':

count = count + 1

if tango == 'is':

count = count + 1

if tango == 'a':

count = count + 1

if tango == 'the':

count = count + 1

if tango == 'of':

count = count + 1

if tango == 'and':

count = count + 1

if tango == 'this':

count = count + 1

if tango == 'was':

count = count + 1

if tango == 'from':

count = count + 1

if count >= 2:

return True

else:

return False

#正解の文の中でのAの位置を返す

def findAEX():

for bun in arr:

if isSentence(bun):

bun = bun.replace('\n', '').replace('\r', '')

return bun.find('a')

indexofA = findAEX()

if indexofA == False:

answer = ""

else:

answer = msg[int(findAEX())]

tn.read_until("cipher ? ")

tn.write(answer + '\n')

print tn.read_until("!")

[/bash]

な、何だこのコードは(呆然

関数名やら変数名やら組み方やらひどいのはご勘弁を(とりあえず動けばいいやと思って書いたので・・・)

はじめは、CeaserCipherを行い、0-26回ずらしたものを単純に表示させて、あとは目で見て確認するという方法でやってみました。ですが、この方法では10秒以内に正しい文章を見つけ、aの位置と対応する文字を見つけて入力するのは大変だったため断念。

・・・

そこで自動判別するプログラムを書いてみました。

telnet接続をし、降ってきた文章の中の問題文だけを取り出してmsgに格納。その後、CeaserCipher結果をarrに格納。arrの中から文章であると思われるものを判別(isSentence())し、その中でaが含まれていればその位置に対応する文字を取り出し、提出するという感じです。

isSentence(bun)の部分はin, is, a, the, of, and・・・・といった単語を見つけ出し、カウント。そのうち2つ以上が含まれていれば文章であると判断しました。(・・・辞書ファイル用意してforで回したほうが楽そうですね)

正答率は9.5割位でしょうか?(5回セットを何回か回すとエラーでたりします)もっと辞書増やせば正確に判別できそうな感じです。。

これを使えば、Challange 1はクリアできるようになりました。が、Challenge 06-10は、この方法では無理でした。

---

プログラムは割愛しますがChallenge06-10は、simple substitution cipher(換字式暗号)で、実行するたびにランダムに文字が置換されるというもの。ランダムに置換されるので、前の結果を使用することは無理。

方法が全くわからなかったので、とりあえず与えられる文章を書き出してみました。・・・・が、法則性など見当たらなかった。

辞書ファイルを眺めているうちに、なんとなく、一文の単語数と、単語の長さで判別すればいいのでは、と思いついたので、プログラム化。

辞書ファイルから"."までの文章を引き出し、リストに落とし込み、さらにスペースで分けて単語別にリストにしました。ついでに単語の文字数もリストにしました。↓こんな感じ・・・・

[bash]#listDict => 文字を格納

#listDictList => 文字をリスト化したもののリスト

#numlistDict => 文字数を格納

#['Valid values range from 0 to 250, where 0 means use the default value 30', .....

#[['Valid', 'values', 'range', 'from', '0', 'to', '250,', 'where', '0', 'means', 'use', 'the', 'default', 'value', '30'], ...

#[[5, 6, 5, 4, 1, 2, 4, 5, 1, 5, 3, 3, 7, 5, 2], .....

[/bash]

この辞書リストの文章の単語数と単語文字数リストが、与えられた問題文と一致すれば良さそうだなという感じで書いてました。

・・・・ここでタイムアップ。チームのメンバーさんが先にといちゃいました!さすがはやい。

その方はスペースの位置で判別したそうです。なるほど。そっちのほうがわかりやすそうだ。

プログラムも見せていただきましたがすごい。。。私のコードとは天と地の差ですね()

もっと綺麗に書けるようになりたい!

[ネットワーク100] repeat after me

followme.pcap

pcapが渡される。内容を見ると何やらtelnetしている模様。

とりあえずFollow TCP Streamしてみる。

[bash]

.nslookup 133.0xf2.010357

.ssh -p 311.37.37 follow .me@133.0xf2.010357

.repeat after me

.ls-l.. -l

.ls -l.followme$ whoami.ls-l... -l...

.ls -l

.exit

.

[/bash]

送信情報だけ抜き出すとこんな感じですnslookupで謎の数値を渡してますね・・・・

とりあえずnslookupで133.0xf2.010357に問い合わせてみると

[bash]

** server can't find 133.0xf2.010357: NXDOMAIN

[/bash]

となりますが、これは正常のようです(サーバーからの受信情報見てもそうなってるみたい)

次にsshしているようなのでとりあえずssh。・・・もちろんそのままだとエラーで怒られちゃいました。

ポートのところがおかしいみたいです。311.37.37とは一体?

何かがおかしいようなので、HEXDumpデータを読んでみました。

[bash]

0000007D 73 68 24 20 sh$

00000081 73 s

00000082 73 s

00000083 68 h

00000084 20

00000085 2d -

00000086 70 p

00000087 20

00000088 33 3

00000089 31 1

0000008A 31 1

### 0000008B 08 20 08 . .

0000008E 33 3

0000008F 37 7

### 00000090 08 20 08 . .

00000093 33 3

00000094 37 7

00000095 20

00000096 66 f

00000097 6f o

00000098 6c l

00000099 6c l

0000009A 6f o

0000009B 77 w

0000009C 20

0000009D 08 .

0000009E 6d m

0000009F 65 e

000000A0 40 @

000000A1 31 1

000000A2 33 3

000000A3 33 3

000000A4 2e .

000000A5 30 0

000000A6 78 x

000000A7 66 f

000000A8 32 2

000000A9 2e .

000000AA 30 0

000000AB 31 1

000000AC 30 0

000000AD 33 3

000000AE 35 5

000000AF 37 7

[/bash]

###の部分、-p[space]311まで打ったあと、08 20 08と入力している模様。

この部分のASCIIコードは0x08→[backspece]に当たるものです。また0x20は[space]。

ということで入力は-p[space]311[BS][Space][BS]37[BS][Space][BS]37となりますので、-p 31337。

同様に見ていくとfollow[space][BS]meとなり、@133.0xf2.010357の.は0x2eなのでそのまま.となります。

最終的にssh -p 31337 followme@133.0xf2.010357となりますので接続。

次にパスワードを聞かれるので同じような手順で読んでいくと、repaet after meと入れて[Enter]、ls -lと入れて[Enter]していますがいずれも違うパスワードの模様。

次のls -l.followme$ whoami.ls-l... -l...が正しいパスワードみたいです。

これの途中でも0x15→[NAK]、0x17→[ETB]と言う文字を送ってますが構わず突っ込む。すると認証に成功する。

・・・・はずでしたが、文字コード送信方法に手間取ってしまい、ここでタイムアップ。メンバーさんがry

バイナリをそのまま突っ込んだら解けたらしいのですが、どういうことなのでしょう?

後から解いてみたのですが、普通にテキストエディタにGoogleIME文字パレットから持ってきた制御コードもろともぶち込んで、コピペすれば行けました。ぐぬぬ・・・・

-------------

# 追記

@shiracamusさんよりこんなリプを頂きました。

https://twitter.com/shiracamus/status/429952739842334720

制御文字をそのまま突っ込むのではなく、対応するコマンドを実行した結果を送ってみてもいいみたいです

対応表はここがわかりやすいかも

[bash]00000065 6c l

00000066 73 s

00000067 20

00000068 2d -

00000069 6c l

### 0000006A 15 .

0000006B 66 6f 6c 6c 6f 77 6d 65 24 20 followme $

00000075 77 w

00000076 68 h

00000077 6f o

00000078 61 a

00000079 6d m

0000007A 69 i

### 0000007B 17 .

0000007C 6c l

0000007D 73 s

0000007E 2d -

0000007F 6c l

00000080 7f .

00000081 7f .

00000082 2e .

00000083 20

00000084 2d -

00000085 6c l

00000086 2e .

### 00000087 02 .

### 00000088 7f .

00000089 0d 00

[/bash]

0x15(Ctrl+U)で前半を消し0x17(Ctrl+W)で1単語(前のスペースまで)削って0x02を入力直後に0x7fでBackSpaceしているので、

結局followme$ ls. -lになるということですかね。

なるほどこっちのほうがわかりやすい。勉強になりました

######

長くなりすぎましたのでとりあえずこのへんで。

SECCON CTF 2013 Online にでさせてもらいました

2014/1/25〜26に、SECCONのオンライン大会が開催されたので参加させてもらいました。

今回のCTFで、とあるきっかけで知り合ったみむらさんや、ラボの先輩のかーみーさんの所属しているwasamusumeに入れていただくことになりました。ありがとうございます。

wasamusumeのメンバー、みんなつよい(こわい)

今回解けた問題はプログラミング/Crypt 200だけでした(しょんぼり)

というわけで簡単でしたがとりあえずそこだけWrite Up。

プログラミング/Crypt200 数「毒」ちゃれんじ★

問題

telnet 133.242.48.175 65434 で問題サーバに接続して、 数独の「X」の部分に、各数字を入れた場合の解の個数を答えてください。 6セット出題されます。それぞれ 3分以内に答えてください。

全問正解するとフラグが表示されます。

サーバーのアドレスとポートが与えられて、ncするとSUDOKU問題が降ってくるというもの。

タイムリミットは3分なので、プログラムの力に頼るしかない問題です。Stage1〜Stage6まで答えられたら勝利。

解法

SUDOKUプログラムを使い、答える。以上

とりあえず解の個数が必要との事だったので数独プログラムを解いてくれるライブラリを探すと

http://www.geocities.jp/motonaga_asao/Sudoku/Sudoku.html

ここに置いてありましたのでそれを使いました

落ちてきた問題を整形して、これに合う形で解かせると解の個数が出るのでひたすら入力して解きました

答え出すのは6stage * 2〜5問程度だったし、解いてる途中リミットの3分は、Stage毎に設けられていることがわかったので

telnetでつなぐプログラム書くより入れたほうが早いなーと思ったので手入力です(ひどい)

いやーCTFって簡単だな〜(棒)

---------------

ネットワークの300点までの問題やらProg/Crypt500やらにも取り組んだのですが、あと少しでFLAGゲット出来そうだなって時にメンバーが解いてしまうと言うことが多かったです。やはり速さが違う。

ネットワークの問題に翻弄されている間、CTF慣れしているメンバーさんたちがどんどん解いちゃって、気づけば解けそうな問題がない!というCTFでした。

しかし、問題を解いている間は非常に楽しかったです。wasamusumeのメンバーさんたちから得られるものも多かったし、次のCTFまでに人権が獲得できるように頑張りたいと思います。

ネットワーク、Forensics、プログラミング/Cryptは途中まで解いたものがいくつか残ってるので、次の記事にでも書いてみようかなぁと思います。

バイナリは[お察しください]

Raspberry PiからWake On LanでWindowsを外出先から起動できるようにした

先日Raspberry Piを購入し、ひとまず設定も行って使える環境にまで持っていったので、以前から使ってみたいと思っていたWake On Lanを導入して外出先から自宅PCを起動できるようにしました。

というわけで簡単な設定ですが手順メモを。

関連記事:Raspberry Piを購入したのでインストールとセットアップメモなど

Wake On Lan

Wake On Lan (WOL)とはコンピュータの起動やシャットダウンをネットワークを通して行う事ができる技術です。これを使えば必要なときに外部から自宅PCを起動し、接続ができるようになるので、一日中PCをつけっぱなしにしなくてもPCに接続することができてとてもおサイフにやさしい。すばらしい

WOLは、マジックパケットと呼ばれるパケットをコンピュータに向けて送信します。受け取ったコンピュータは送られたパケットがマジックパケットであると判断できれば、起動を開始します。簡単ですね。

この辺りはWikipediaに詳しく書かれてますので興味のある方はそちらをどうぞ。けっこう面白いパケットを送ってます。

Wake-on-LAN - Wikipedia

ただし、WOLを利用できるかどうかはNIC、OS、BIOSマザボなどが対応している必要があるので確認が必要です。

ネットワークアダプタは、USB給電ができれば無線LAN受信機でも大丈夫ですが、あいにく私の環境ではUSB受信機は使用できなかったのでRaspberry Piを経由してイーサネットからマジックパケットを送ることにしました。

イーサネットコンバーターを使用するという手も有りましたが、このために5kほどのお金が必要になってしまうので諦め。

設定

今回は、こんなかんじの設定にしてみました

f:id:zipsan:20150924165941p:plain

Windows 7とRaspberry Pi(Raspbian)をLANケーブルで接続して、Windows 7側のIPアドレスを192.168.100.1に、Raspberry Pi側のIPアドレスを192.168.100.2に設定しました。

外部からRaspberry PiにSSHで接続し192.168.100.1に対してマジックパケットを送ることでWin7を起動します。起動後、RDPは無線で直接接続します。

Windows側の設定

Windows以外の方は各自調べてください(:3 」∠)

BIOS

Wake On LanをEnableにしておく。
BIOSの設定は各マシンで異なるので省略します。

ネットワーク設定

コントロールパネル>ネットワークと共有センター>アダプタ―の設定の変更>ローカルエリア接続→プロパティ →インターネットプロトコルバージョン4(TCP/IPv4)選択からのプロパティ

f:id:zipsan:20150924170110p:plain

addressは192.168.100.1
サブネットマスクは255.255.255.0
DNSゲートウェイ設定は不要です。

MACアドレスを調べる

cmd.exeを起動し、以下のコマンドで調べる

> ipconfig /all

さきほど設定した192.168.100.1のところの物理アドレス-----をメモしておきましょう。(あとで使います)

イーサネット アダプター ローカル エリア接続:

接続固有の DNS サフィックス . . . :
説明. . . . . . . . . . . . . . . : Intel(R)                  Gigabit Network Connection
物理アドレス. . . . . . . . . . . : **-**-**-**-**-** # これ
DHCP 有効 . . . . . . . . . . . . : いいえ
自動構成有効. . . . . . . . . . . : はい
IPv4 アドレス . . . . . . . . . . : 192.168.100.1(優先)
サブネット マスク . . . . . . . . : 255.255.255.0
デフォルト ゲートウェイ . . . . . :
NetBIOS over TCP/IP . . . . . . . :

Windowsはこれくらい

Raspberry Pi側の設定

ネットワーク設定

はじめにネットワークの設定をします。

$ sudo vim /etc/network/interfaces ←ネットワーク設定

auto lo

# Ethernet(有線)側の設定
iface lo inet loopback
iface eth0 inet static
address 192.168.100.2
netmask 255.255.255.0


# 無線側の設定
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.10.1
netmask 255.255.255.0
gateway 192.168.0.1
broadcast 192.168.0.255
dns-nameservers 8.8.8.8
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf


iface default inet dhcp

eth0を再起動

$ sudo ifdown eth0 && sudo ifup eth0

addressは192.168.100.2 サブネットマスクは255.255.255.0 iface lo inet loopback の部分がEthernetの設定です。addressとnetmaskだけでいいと思います。 編集し終わったらeth0を再起動しておわり。

Wake On Lanの設定

設定というかなんというか?

今回はWOLはSENGOKU氏のwol.cを使用します。 wol.c:http://www.gcd.org/sengoku/docs/wol.c

ダウンロードしてコンパイル

$ cd
$ mkdir wol
$ cd wol
$ wget http://www.gcd.org/sengoku/docs/wol.c
$ gcc wol.c -o wol

とりあえず実行してみる

$ ./wol
Wake On Lan
Copyright(C)2000 by Hiroaki Sengoku <sengoku@gcd.org>
Usage: wol <IP> <MAC>

ターゲットのIPとMACアドレスが必要です。 さっきWindowsの方で設定したIPアドレスとメモしたMACアドレスをここに入れて実行すると

$ ./wol 192.168.100.1 **-**-**-**-**-**
$

何も表示されなければ送れてます(おそらく)
気になる方はtcpdumpで確認してみてください

Windowsの方の電源を落としてコマンドを叩くと起動するはずです。ぜひやってみてね。
起動しない場合は、機器がWOLに対応してるか、ネットワーク設定があっているか確認してみるといいかもです。
また、毎回毎回IPアドレスMACアドレスを入力するのはだるいのでシェルスクリプトを書いておくといいかもです。

$ vim sh_wol.sh
------- Vim -------
#!/bin/sh
./wol 192.168.100.1 **-**-**-**-**-**
------- Vim -------
$ chmod 700 sh_wol.sh
$./sh_wol.sh
$

かんたんかんたん

今はsshでRaspberry Piに接続してシェルスクリプトを走らせて起動してますが将来的にはWebから起動できるようにしたいなぁと目論んでます

いつになるやら