プロジェクト

全般

プロフィール

CTF Writeup SECCON 2016 » 履歴 » バージョン 1

kanata, 2025/04/13 15:13

1 1 kanata
# CTF Writeup SECCON 2016
2
3
{{toc}}
4
5
# 結果&感想
6
7
某チームでSECCON2016に参加しました。
8
今年は全体的に難易度が高かったですね。。ExploitとCryptoが多めでした。
9
10
どっちも専門知識や職人芸的な技能が試されるので、全体的に苦戦されたんじゃないかと思います。
11
12
13
いちおう200点問題ができたのと、ちょっとアシストできたと思われる100点の問題について、writeupを書きます。
14
15
# Vigenere
16
Crypto問 100点 777チーム回答
17
18
以下、問題前文
19
20
~~~
21
k: ????????????
22
p: SECCON{???????????????????????????????????}
23
c: LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ
24
25
k=key, p=plain, c=cipher, md5(p)=f528a6ab914c1ecf856a1d93103948fe
26
27
 |ABCDEFGHIJKLMNOPQRSTUVWXYZ{}
28
-+----------------------------
29
A|ABCDEFGHIJKLMNOPQRSTUVWXYZ{}
30
B|BCDEFGHIJKLMNOPQRSTUVWXYZ{}A
31
C|CDEFGHIJKLMNOPQRSTUVWXYZ{}AB
32
D|DEFGHIJKLMNOPQRSTUVWXYZ{}ABC
33
E|EFGHIJKLMNOPQRSTUVWXYZ{}ABCD
34
F|FGHIJKLMNOPQRSTUVWXYZ{}ABCDE
35
G|GHIJKLMNOPQRSTUVWXYZ{}ABCDEF
36
H|HIJKLMNOPQRSTUVWXYZ{}ABCDEFG
37
I|IJKLMNOPQRSTUVWXYZ{}ABCDEFGH
38
J|JKLMNOPQRSTUVWXYZ{}ABCDEFGHI
39
K|KLMNOPQRSTUVWXYZ{}ABCDEFGHIJ
40
L|LMNOPQRSTUVWXYZ{}ABCDEFGHIJK
41
M|MNOPQRSTUVWXYZ{}ABCDEFGHIJKL
42
N|NOPQRSTUVWXYZ{}ABCDEFGHIJKLM
43
O|OPQRSTUVWXYZ{}ABCDEFGHIJKLMN
44
P|PQRSTUVWXYZ{}ABCDEFGHIJKLMNO
45
Q|QRSTUVWXYZ{}ABCDEFGHIJKLMNOP
46
R|RSTUVWXYZ{}ABCDEFGHIJKLMNOPQ
47
S|STUVWXYZ{}ABCDEFGHIJKLMNOPQR
48
T|TUVWXYZ{}ABCDEFGHIJKLMNOPQRS
49
U|UVWXYZ{}ABCDEFGHIJKLMNOPQRST
50
V|VWXYZ{}ABCDEFGHIJKLMNOPQRSTU
51
W|WXYZ{}ABCDEFGHIJKLMNOPQRSTUV
52
X|XYZ{}ABCDEFGHIJKLMNOPQRSTUVW
53
Y|YZ{}ABCDEFGHIJKLMNOPQRSTUVWX
54
Z|Z{}ABCDEFGHIJKLMNOPQRSTUVWXY
55
{|{}ABCDEFGHIJKLMNOPQRSTUVWXYZ
56
}|}ABCDEFGHIJKLMNOPQRSTUVWXYZ{
57
~~~
58
59
問題タイトルから[ヴィジュネル暗号](https://ja.wikipedia.org/wiki/%E3%83%B4%E3%82%A3%E3%82%B8%E3%83%A5%E3%83%8D%E3%83%AB%E6%9A%97%E5%8F%B7)であることが解る。暗号の仕組みとしては難しくない。
60
61
暗号文、平文、キーの内、2つが分かっていれば暗号化・復号化ができる。
62
63
## 基本的な考え方
64
65
1文字目を例にキーを求めてみよう。
66
67
平文の1文字目(p):S
68
暗号文も1文字目(c):L
69
70
上の表のSの行を抜き出してみる
71
72
~~~
73
 |ABCDEFGHIJKLMNOPQRSTUVWXYZ{}
74
-+----------------------------
75
S|STUVWXYZ{}ABCDEFGHIJKLMNOPQR
76
~~~
77
78
表の中のLの位置を確認、対応する列はVになっている。
79
ということで、1文字目のキー(k)は、Vとなる。
80
81
これを繰り返すと、ここまで解る。
82
83
~~~
84
k: VIGENER?????VIGENER?????VIGENER?????VIGENER
85
p: SECCON{?????BCDEDEF?????KLMNOPQ?????VWXYYZ}
86
c: LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ
87
~~~
88
89
## 残り5文字について
90
91
正解時のMD5ハッシュが問題にあるので、総当りすればよい。
92
この手の古典案号のキーは、だいたい4~5文字だったら、現実的な時間で解けると考えてよさげ。
93
94
>あとヴィジュネル暗号の英語の綴りは"VIGENERE"なので、キーの次の文字は"E"であろうという予想がつきます。
95
96
CTF時はチームメイトがJavaScriptで総当りプログラムを作ってくれました。
97
98
ちょっと勉強がてらPythonで書いてみました。5文字の総当りだと、それなりに時間がかかります。
99
100
~~~python
101
#!/usr/bin/python
102
# -*- coding: utf-8 -*-
103
104
import hashlib
105
from itertools import combinations
106
107
charset= "ABCDEFGHIJKLMNOPQRSTUVWXYZ{}"*5
108
chiper = "LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ"
109
itr    = combinations(charset,5)
110
111
def decode(c, key):
112
  return charset[(charset.index(c)-charset.index(key))%28]
113
114
for i in itr:
115
  print i[0],i[1],i[2],i[3],i[4]
116
  a0 = decode('E',i[0])
117
  a1 = decode('D',i[1])
118
  a2 = decode('O',i[2])
119
  a3 = decode('E',i[3])
120
  a4 = decode('E',i[4])
121
  b0 = decode('K',i[0])
122
  b1 = decode('J',i[1])
123
  b2 = decode('W',i[2])
124
  b3 = decode('M',i[3])
125
  b4 = decode('N',i[4])
126
  c0 = decode('V',i[0])
127
  c1 = decode('U',i[1])
128
  c2 = decode('F',i[2])
129
  c3 = decode('W',i[3])
130
  c4 = decode('Y',i[4])
131
132
  # 不明なキーの最初の1文字目をEと決めつけて実施(VIGENEREの最後のE)
133
  # 以下3行をコメントアウトすれば5文字の総当たりになる
134
  a0 = decode('E','E')
135
  b0 = decode('K','E')
136
  c0 = decode('V','E')
137
138
  flag = 'SECCON{'+a0+a1+a2+a3+a4+'BCDEDEF'+b0+b1+b2+b3+b4+'KLMNOPQ'+c0+c1+c2+c3+c4+'VWXYYZ}' 
139
140
  md5 = hashlib.md5(flag).hexdigest()
141
  if md5 == "f528a6ab914c1ecf856a1d93103948fe":
142
    print 'Hit!',flag,md5
143
    exit()
144
~~~
145
146
## ちなみに
147
148
以下にヴィジュネル暗号のソルバを事前に準備しておいたんだけれど、今回はアルファベットの他に"{}"が入っているという仕様のため、使えなかった。
149
(あと英文じゃないので、復号結果が正しいか判断ができないとかある)
150
151
[CTF Crypto Vigenere暗号(ヴィジュネル暗号)](https://raintrees.net/projects/a-painter-and-a-black-cat/wiki/CTF_Crypto#Vigenere%E6%9A%97%E5%8F%B7%E3%83%B4%E3%82%A3%E3%82%B8%E3%83%A5%E3%83%8D%E3%83%AB%E6%9A%97%E5%8F%B7)
152
153
# pppppoxy
154
155
Web問 200点 43チーム回答
156
157
ダウンロードしたexeを実行すると、ローカル限定で接続できるWebサーバとブラウザが立ち上がり、idとpasswordの入力を求められる。
158
正しいパスワードを入力するのが今回の問題。
159
160
失敗すると「username or passwaord was incorrect!」が表示される。
161
162
![20161211_seccon_pppproxy_fig1.png](20161211_seccon_pppproxy_fig1.png)
163
164
ぶっちゃけ力技で解いた。
165
[うさみみハリケーン](http://hp.vector.co.jp/authors/VA028184/#TOOL)を使い起動中のpppppoxyのメモリ内容を参照。こちらから入力したパスワードの近辺を検索して参照し、怪しい文字列を見つけた。
166
167
![20161211_seccon_pppproxy_fig2.png](20161211_seccon_pppproxy_fig2.png)
168
169
という訳で、以下を入力してフラグ取得
170
171
~~~
172
-40.01.6102 ,ikazamaY ogieK? thgirypoC
173
~~~
174
175
![20161211_seccon_pppproxy_fig3.png](20161211_seccon_pppproxy_fig3.png)
176
177
と、言葉にするとすぐ終わるんだけど、実際この手法に行き着くまでに
178
179
* SSHトンネルして外に繋がるようにして、[hydra](http://sectools.org/tool/hydra/)でブルートフォース
180
  →制限時間内に明らかに終わらない事がわかり諦める。
181
182
* [ILSpy](http://ilspy.net/)でデコンパイルしてソースコードを眺める。
183
  →難読化(?)とか文字化けとかに遭遇して諦める。
184
185
という苦労をして時間を溶かしている。
186
187
# その他の問題のWriteup
188
189
あのTomoriNaoさんのページが、とても詳しいです。
190
191
TomoriNao SECCON 2016 Online
192
https://hackmd.io/s/HkGx_btmx#