crypto200-1 Write up
まともに解いたのこれくらいだった。。
cryptの基礎が詰まってて結構面白かったのでWrite upしておきます。
crypto 200-1
H4x0R got this weird code while coming back from school. can you get a 32char code flag that can make him happy ?
[bash]
//一行
1f8b08089c452c530003737465703900edd85b6ec3300c44d1ffae86dc
ffe61ac7e1437403e42b1a171745d02a946c890713383537f3c7cb3c7e
8e37ec7c99d7fb39cbe3afaa5bac89f1735e5c3597bf263e571ef52ab5
49d6d759bb5eed2de6d7c56bf76d3f6de47d76ac8e9567c9bdefb0d7db
e16c3d67ded997bbb71eae3d8d7db8d796d6fed7fda317f808fb5ceaf8
48f9b48ee1a3e833ebf868f9901f6d9f59c747cb87fca8faacfbc1079f
bbf8ccfa469f1ce323999f4b1d9f6b7d8f4f1e161ff2732b1ff2a3eda3
911f7cb47d78bed6f6213fef7c667da3cfa58e0ff9c1071f7cf0f986cf
ace3830f3e1f7fffb9d4f1c147dd67d6f7f8f43ee0d37d34f29387c547
d6a7c6f828faf48ee1e335191f611ff283cf673e35c647d1a7770c1f2d
9fb33ff8a8fa909f3bf8cc3a3e5a3ee447d9a7c6f8a8f9f8da157c14ff
7f80cf1f3e1af9895ee0a3e973cec147d5270f8b8fa40fcf07da3ed10b
7ca6cfacefcc8f8d3a3e2af9e1f3ed9d8f467ef2b0f8e8e6071f599fe8
053e9a3ee4e7063e39c647d287fce0830f3effd327f6808fa6cfd2317c
b47c7a1ff0d1f3213fda3ee447db87fc68fbb4fbe123e8e36b57f0499f
59df989fd6317ce4f2137bc067f1d1c8cfd99f65ddebe0a976fcfef905
9996b432616b0000
[/bash]
16進数っぽいので、とりあえずASCIIコードに変換・・・
してみるも、全く読めず。元データの長さが944だったので、16で割り切れるな?と思い、16文字のハッシュ探しても見つからなかった。8文字はあったけど、うーん。
ひと通り試してだめだったので、ASCIIコードに変換した時に見つけたstep9という文字から、もしかしたら何かのファイルなのかなということで、バイナリエディタで直接貼り付けて、ファイル化してfileコマンドを実行してみた。
[bash]
$ file raw.bin
raw.bin: gzip compressed data, was "step9", from Unix, last modified: Fri Mar 21 22:58:52 2014
[/bash]
[bash]
// raw2(一行)
010011000101010101100100010000100・・・(中略)・・・1000011011001110011110100111101
[/bash]
2進数でてきた。
読みづらいので16進数に変換してみる。
>>> raw2 = open("raw2.txt", "r")
>>> raw2tohex = open("raw2tohex.txt", "w")
>>> i = raw2.readline()
>>> raw2.close()
>>> h = hex(int(i, 2))
>>> raw2tohex.write(str(h))
>>> raw2tohex.close()
[/python]
開くと
[bash]
0x4C55644255316C42524651714A・・・(中略)・・・56436F6D4C544D7843673D3DL
[/bash]
0xとLを取ってASCIIコードに変換すると
[bash]
LUdBU1lBRFQqJi0yNS1H・・・(中略)・・・MzYtR0FTWUFEVComLTMxCg==
[/bash]
お、base64。デコードしてみる。
[bash]
-GASYADT*&-25-GASYADT*&-33-GASYADT*&-37-GASYADT*&-25-・・・(中略)・・・GASYADT*&-25-GASYADT*&-36-GASYADT*&-
[/bash]
GASYADTってなんぞ?とりあえずGASYADTを取り除いて数値だけ取り出す。
[bash]
//一行
253337253335253336253337253336253337253336253333253
333253631253332253636253332253636253336253333253336
253635253336253336253336253337253337253332253332253
635253336253338253336253636253336253338253336253331
253336253337253336253338253332253635253337253330253
336253332253337253631253332253636253333253337253333
253331253333253333253333253330253333253335253333253
335253333253334253332253636253330253631
[/bash]
だいぶ短くなってきた。
25が多いな?確か25は%だったから、URLエンコードかな?
というわけで、二文字おきに%でつないでURLデコード。
[python]
#coding: utf-8
def splitStr2(str, num):
l = []
for i in range(num):
l.append(str[i::num])
l = ["".join(i) for i in zip(*l)]
rem = len(str) % num # zip で捨てられた余り
if rem:
l.append(str[-rem:])
return l
s = "2533372533352533362533372533362533372533362533332533332
536312533322536362533322536362533362533332533362536352533362
533362533362533372533372533322533322536352533362533382533362
536362533362533382533362533312533362533372533362533382533322
536352533372533302533362533322533372536312533322536362533332
533372533332533312533332533332533332533302533332533352533332
53335253333253334253332253636253330253631"
s2 = splitStr2(s, 2)
ans = ""
for v in s2:
ans += "%" + v
print(ans)
[/python]
出てきたものをURLデコード。
[bash]
%37%35%36%37%36%37%36%33%33%61%32%66%32%66%36%33%36%65%36%36%36%37%37%32%32%65%36%38%36%66%36%38%36%31%36%37%36%38%32%65%37%30%36%32%37%61%32%66%33%37%33%31%33%33%33%30%33%35%33%35%33%34%32%66%30%61
[/bash]
もういっちょ!
[bash]
756767633a2f2f636e6667722e686f686167682e70627a2f373133303535342f0a
[/bash]
ASCIIコードに直してみる。
[bash]
uggc://cnfgr.hohagh.pbz/7130554/
[/bash]
むむむっ これは換字式暗号。rot13をとりあえず試してみる。
[bash]
http://paste.ubuntu.com/7130554/
[/bash]
URLゲット!
アクセスすると
[bash]
5d3144233c46404dba4afc766601b997
[/bash]
32文字のMD5をゲットしました。これがフラグでした。
長かったけど楽しかった。
backdoorCTFは割と簡単な問題が多かったっぽい感じがするので、復習しておかないとな。。
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全国大会に出場してきました!
in 東京電機大学。会場も大学自体もすごくキレイで、さすが私大だなぁと・・・羨ましい。駅にも近いし周りは色々なものがあるしいい場所です。
地方大会ではJeopady方式(問題を解いてFLAGを手に入れる)ですが、本戦では攻防戦。自分のチームのFLAGを書き込み続ければその分点数どんどん増えていく感じです。
出場チームは地方大会とOnline予選を通過した強豪ばかり。会場の顔ぶれもすごい。
こんなかんじで挑みました。MacBook Airとdynabook(Win8.1)。メインで使用するのはMBAです。
各チームのテーブルにはルーターとコンセント(3つ)があり、そこに接続して問題サーバーに接続するといった感じになってました。(http://2013.seccon.jp/seccon2013finalchallenge.html)
周りは手慣れた様子で着々と用意を進めてました。(こわい)
会場モニタにはネットワーク可視化システム、NIRVANA改が動いていました。(写真撮り忘れていた。。。)
イメージは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ページがあることと、CookieにCGIの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でエンコードされた文字があった。コピペして、Pythonでbase64をデコードして、出てきたバイナリを保存。
fileコマンドで見てみるとSysExファイルとの表示が。ググって調べるとどうやらMIDI関連のものらしい?アプリケーションで開いて探ってみましたが全くわからず、タイムアップ。よくわからないまま終わってしまった。
得点について
全国大会では地方予選と違い攻防戦なので、Keyを提出した点数と、自チームのFLAGを書き込み、守ることで得られる点数の2つがあります。
そのため、その両方を念頭に置いて挑まなければならないのですが、本戦はFLAGを守ることで得られる点数が非常に高かった模様。
私のチームはそのことを後回しにしていたせいで、後半の周りの伸びについていけず、大きく点数を落としてしまいました。
例えばPisa.towerの掲示板にFLAGを書き込む問題、最初から自動投稿するようにスクリプト化をしていたチームはそれだけでKey提出数回分の得点を得ていたみたいです。
点数配分は一応書いていたみたいなので、そこを読み飛ばしたのが悪いのですが。
一日目が終わっても競技は続く・・・
基本中の基本ですが一日目が終わってもファイル解析や落としたバイナリの穴探しは続けることができます。
Web系の問題は競技ネットワークが切られているので無理ですが、それでも話し合い位はできるので私のチームは居酒屋で酒を飲みながらやっていました(w
ホテルに到着してからもファイルの中を覗いたり色々とやっていましたが・・・うーん、難しかったw
全体的に
バイナリ系がなにもできなかったことが辛かったです。Web系の問題なども解けなかったので、メンバーさんに申し訳ない限り・・。
本戦形式の問題は、手がかりを探すことからはじめなければならないので、それに慣れていない私には厳しい大会でした。この辺りは経験が必要なのかな。
問題自体もスラスラと解けるようなものではなかったので、苦戦しました。
しかし、本戦出場は非常にいい経験になりました。チームメンバーには感謝してもしきれません。
来年のCTFで戦えるようにWriteupを見てバイナリとWebを中心に勉強しよう。
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
制御文字をそのまま突っ込むのではなく、対応するコマンドを実行した結果を送ってみてもいいみたいです
対応表はここがわかりやすいかも
- 雑多なメモ: http://d.hatena.ne.jp/miduhima/20050709
- MOVION.net ≫ [Linux]シェルでの入力操作(Ctrl-U,Ctrl-W)など:http://movion.net/2008/11/20/linux-command-line-options/
[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は途中まで解いたものがいくつか残ってるので、次の記事にでも書いてみようかなぁと思います。
バイナリは[お察しください]