CTF Writeup TMCTF2016 » 履歴 » バージョン 1
kanata, 2025/04/13 15:11
1 | 1 | kanata | # CTF Writeup TMCTF2016 |
---|---|---|---|
2 | |||
3 | {{toc}} |
||
4 | |||
5 | # 結果&感想 |
||
6 | |||
7 | Trend Micro CTF 2016 に、某チームで参加しました。 |
||
8 | 結果は、去年より若干悪くなっている(と言っても、国内10位以内)んだけれど、予め申し上げておくと、今回、私は **得点できず** でした。 |
||
9 | いやぁ、難しかった。去年も難しかったけど、今年は輪をかけて難しかった。 |
||
10 | |||
11 | そんな中でも、チームのc@tさんとリリりん♪さんは、やはりひと味違ってましたね。。 |
||
12 | |||
13 | ままま、アシストできた問題と、良い所まで行った問題のwriteupというか、解った所までを書こうと思います。 |
||
14 | |||
15 |  |
||
16 | |||
17 | Trend Micro CTF Asia Pacific & Japan 2016 オンライン予選 ランキングページ |
||
18 | https://ctf.trendmicro.co.jp/ranking.html |
||
19 | |||
20 | # Analysis - defensive 100 |
||
21 | |||
22 | ~~~ |
||
23 | Decode me! |
||
24 | ~~~ |
||
25 | |||
26 | で、こんなファイルが渡される。 |
||
27 | |||
28 | decodeme_decodeme.php |
||
29 | |||
30 | ~~~ |
||
31 | <?php |
||
32 | $GLOBALS['key'] = "6c7f4d49729e58d7a458999b570e0151bc034ca7"; |
||
33 | $func="cr"."eat"."e_fun"."cti"."on";$decodeme=$func('$x','ev'.'al'.'("?>".gz'.'in'.'fla'.'te(ba'.'se'.'64'.'_de'.'co'.'de($x)));');$decodeme("7f1n0+zMcSgIfh...base64っぽい文字列が続く...tP34vUP6/");?> |
||
34 | ~~~ |
||
35 | |||
36 | お、PHPやんけ!実行したろ。。と思って、実行するとhtmlが出力されるが、特にflagやヒント等は書かれていない。 |
||
37 | |||
38 | ~~~ |
||
39 | <html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'><meta http-equiv='Content-Language' content='en-us'> |
||
40 | <title>decodeme</title> |
||
41 | <style type='text/css'> |
||
42 | <!-- |
||
43 | body{ background-color:darkred; color:white; } |
||
44 | hr{ background-color:dimgray; color:dimgray; border:0 none; height: 2px; } |
||
45 | --> |
||
46 | </style> |
||
47 | </head> |
||
48 | <body> |
||
49 | <br><br> |
||
50 | <form method='post'> |
||
51 | <center> |
||
52 | <input type='password' id='key' name='key'> |
||
53 | <p>enter ****</p> |
||
54 | </center> |
||
55 | </form> |
||
56 | </body></html> |
||
57 | ~~~ |
||
58 | |||
59 | ## デコード |
||
60 | |||
61 | >その時「元のサイズが32kもあるんだから、そんな短いhtmlになるのはおかしい。eval直前の値を取り出したら良いのでは」 |
||
62 | |||
63 | と c@tさんが教えてくれた |
||
64 | |||
65 | あぁ、そうか、なるほど。ちょっと解りにくくしてあるけど、コードを整理してみよう。 |
||
66 | |||
67 | ~~~ |
||
68 | <?php |
||
69 | $GLOBALS['key'] = "6c7f4d49729e58d7a458999b570e0151bc034ca7"; |
||
70 | $func="create_function"; |
||
71 | $decodeme=$func('$x','eval("?>".gzinflate(base64_decode($x)));'); |
||
72 | $decodeme("7f1n0+zMcSgIfh...base64っぽい文字列が続く...tP34vUP6/");?> |
||
73 | ~~~ |
||
74 | こうなってる。で、こんな感じに修正して、eval直前の値を取り出す。 |
||
75 | evalの所をprintに修正する。 |
||
76 | |||
77 | ~~~ |
||
78 | <?php |
||
79 | $GLOBALS['key'] = "6c7f4d49729e58d7a458999b570e0151bc034ca7"; |
||
80 | $func="create_function"; |
||
81 | $decodeme=$func('$x','print("?>".gzinflate(base64_decode($x)));'); |
||
82 | $decodeme("7f1n0+zMcSgIfh...base64された文字列が続く...tP34vUP6/");?> |
||
83 | ~~~ |
||
84 | |||
85 | すると、でた。沢山でた。 |
||
86 | |||
87 | ~~~ |
||
88 | ?><?php |
||
89 | // reference: https://github.com/b374k/b374k/blob/master/LICENSE.md |
||
90 | function chk_password(){ |
||
91 | if(!isset($GLOBALS['key'])){ die(); } |
||
92 | if(trim($GLOBALS['key'])==''){ die(); } |
||
93 | $glob = $GLOBALS['key']; |
||
94 | |||
95 | $post = ''; |
||
96 | $cook = ''; |
||
97 | if (isset($_POST['key'])) { $post = $_POST['key']; } |
||
98 | if (isset($_COOKIE['key'])) { $cook = $_COOKIE['key']; } |
||
99 | if ($cook==$glob) { return; } |
||
100 | |||
101 | if($post != ''){ |
||
102 | $key = sha1(md5($post)); |
||
103 | if($key==$glob){ |
||
104 | setcookie("key", $key, time()+36000, "/"); |
||
105 | $qstr = (isset($_SERVER["QUERY_STRING"])&&(!empty($_SERVER["QUERY_STRING"])))?"?".$_SERVER["QUERY_STRING"]:""; |
||
106 | header("Location: ".htmlspecialchars($_SERVER["REQUEST_URI"].$qstr, 2 | 1)); |
||
107 | $cook = $_COOKIE['key']; |
||
108 | } |
||
109 | } |
||
110 | |||
111 | $output = " |
||
112 | <html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'><meta http-equiv='Content-Language' content='en-us'> |
||
113 | <title>decodeme</title> |
||
114 | <style type='text/css'> |
||
115 | <!-- |
||
116 | body{ background-color:darkred; color:white; } |
||
117 | hr{ background-color:dimgray; color:dimgray; border:0 none; height: 2px; } |
||
118 | --> |
||
119 | </style> |
||
120 | </head> |
||
121 | <body> |
||
122 | <br><br> |
||
123 | <form method='post'> |
||
124 | <center> |
||
125 | <input type='password' id='key' name='key'> |
||
126 | <p>enter ****</p> |
||
127 | </center> |
||
128 | </form> |
||
129 | </body></html>"; |
||
130 | |||
131 | echo $output; |
||
132 | die(); |
||
133 | |||
134 | } |
||
135 | chk_password(); |
||
136 | ?> |
||
137 | |||
138 | <html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="en-us"> |
||
139 | <title>decodeme</title> |
||
140 | <style type="text/css"> |
||
141 | <!-- |
||
142 | body{ background-color:darkred; color:white; } |
||
143 | hr{ background-color:dimgray; color:dimgray; border:0 none; height: 2px; } |
||
144 | --> |
||
145 | </style> |
||
146 | </head> |
||
147 | |||
148 | <?php |
||
149 | $GLOBALS['images']['version']= "iVBORw0KGgoAAAANSUhEUgAA...以下、省略 |
||
150 | ~~~ |
||
151 | |||
152 | ざっと、全体を眺めてみると webshell を実現する何かみたい。 |
||
153 | さてさて、怪しそうな所は・・・ |
||
154 | |||
155 | ## デコードされたコードを読む・認証の仕組み |
||
156 | |||
157 | このデコードしたソースには、認証の方式がコーディングされている |
||
158 | |||
159 | ここ |
||
160 | |||
161 | ~~~ |
||
162 | if($post != ''){ |
||
163 | $key = sha1(md5($post)); |
||
164 | if($key==$glob){ |
||
165 | ~~~ |
||
166 | |||
167 | 入力した値をMD5でハッシュ化して、さらにSHA1でハッシュ化したものと比べている。 |
||
168 | 比較している $globは・・・ |
||
169 | これだろうな。 |
||
170 | |||
171 | ~~~ |
||
172 | $GLOBALS['key'] = "6c7f4d49729e58d7a458999b570e0151bc034ca7"; |
||
173 | ~~~ |
||
174 | |||
175 | あと、これもヒントだね。認証画面での入力は、4文字を期待しているっぽい。 |
||
176 | |||
177 | ~~~ |
||
178 | <form method='post'> |
||
179 | <center> |
||
180 | <input type='password' id='key' name='key'> |
||
181 | <p>enter ****</p> |
||
182 | </center> |
||
183 | </form> |
||
184 | ~~~ |
||
185 | |||
186 | 整理すると、こうだ。 |
||
187 | |||
188 | * flagは4文字 |
||
189 | * flagをmd5して、それを更にsha1すると 6c7f4d49729e58d7a458999b570e0151bc034ca7 になる |
||
190 | |||
191 | ## チームメンバがPNGファイルの中からExifを見つけてくれる |
||
192 | |||
193 | デコードしたソースは、このページでは省略しているけど、本当は、Base64でエンコードされた画像データが、いくつか埋まっていた。 |
||
194 | ソース中に、こんなのがいくつかある。 |
||
195 | |||
196 | ~~~ |
||
197 | $GLOBALS['images']['lock']= "iVBORw0KGgoAAAANSU...中略 |
||
198 | |||
199 | <img align="left" src="data:image/png;base64,<?php echo $GLOBALS['images']['lock']; ?>" alt="figure" /> |
||
200 | ~~~ |
||
201 | |||
202 | その中の一つのpng画像に、Exifがあって、そこにBase64の文字列が入っていることをチームのメンバが発見してくれたのでした! |
||
203 | |||
204 | >PNGはExif情報をサポートしてないから、無理やり入れたんだろうな。。 |
||
205 | |||
206 | ~~~ |
||
207 | $ xxd image7.png |head |
||
208 | 0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR |
||
209 | 0000010: 0000 0047 0000 0072 0803 0000 0141 de0c ...G...r.....A.. |
||
210 | 0000020: a500 0000 a67a 5458 7452 6177 2070 726f .....zTXtRaw pro |
||
211 | 0000030: 6669 6c65 2074 7970 6520 6578 6966 0000 file type exif.. |
||
212 | 0000040: 78da 558e cb0d 4331 0804 efae 2225 9805 x.U...C1...."%.. |
||
213 | 0000050: 16bb 1cfb c596 d241 ca0f ef73 c94a 6860 .......A...s.Jh` |
||
214 | 0000060: 0412 657d 3fbb bcce 8858 318f c64e d68c ..e}?....X1..N.. |
||
215 | 0000070: 75eb 18d9 b47a 0759 bbca 457f 146f 4abd u....z.Y..E..oJ. |
||
216 | 0000080: bd3d ab05 47fd 0b36 1606 36f3 901e a4f0 .=..G..6..6..... |
||
217 | 0000090: 4023 28a1 74a5 9a6f 1a9d ca8b 6880 0f8f @#(.t..o....h... |
||
218 | $ |
||
219 | ~~~ |
||
220 | |||
221 | デコードすると、以下のようになるとのこと。 |
||
222 | |||
223 | ~~~ |
||
224 | echo 'flag is sha1(password)'; |
||
225 | ~~~ |
||
226 | |||
227 | 4文字のパスワードをsha1したのが答えですって事なんでしょう。 |
||
228 | |||
229 | ## 結果 |
||
230 | |||
231 | それで、flagの4文字は、どうやって見つけるんだろう、総当りしかないのかしら? |
||
232 | と思っていろいろ調べてたんだけど、結局、c@tさんが一瞬で解いてくれました(総当りでw) |
||
233 | |||
234 | 答え |
||
235 | |||
236 | ~~~ |
||
237 | h4ck |
||
238 | ~~~ |
||
239 | |||
240 | それを更にSHA1 |
||
241 | |||
242 | ~~~ |
||
243 | TMCTF{e17e98788d6b4ac922b2df100ef9398ae0f229ad} |
||
244 | ~~~ |
||
245 | |||
246 | ## 余談(ハッシュ値の総当り) |
||
247 | |||
248 | c@tさんに頂いたrubyスクリプトを参考に、総当りするPythonスクリプトとシェルスクリプトを書いてみた。 |
||
249 | |||
250 | * Python - 総当り |
||
251 | |||
252 | ~~~python |
||
253 | #!/usr/bin/env python |
||
254 | |||
255 | import sys |
||
256 | import hashlib |
||
257 | from itertools import permutations |
||
258 | |||
259 | answer = "6c7f4d49729e58d7a458999b570e0151bc034ca7" |
||
260 | itr = permutations("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",4) |
||
261 | |||
262 | for i in itr: |
||
263 | password = "".join(map(str,i)) |
||
264 | hash = hashlib.sha1(hashlib.md5(password).hexdigest()).hexdigest() |
||
265 | if hash == answer: |
||
266 | print password |
||
267 | sys.exit(0) |
||
268 | |||
269 | print "Not found." |
||
270 | sys.exit(1) |
||
271 | ~~~ |
||
272 | |||
273 | 実行結果 |
||
274 | |||
275 | ~~~ |
||
276 | $ time python 20160802_TMCTF_defence100.py |
||
277 | |||
278 | h4ck |
||
279 | |||
280 | real 1m39.699s |
||
281 | user 0m38.926s |
||
282 | sys 0m0.106s |
||
283 | ~~~ |
||
284 | |||
285 | * ShellScript - 総当り |
||
286 | |||
287 | ~~~ |
||
288 | #!/bin/bash |
||
289 | |||
290 | python permutations.py 4 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ > list.txt |
||
291 | |||
292 | MAX=`cat list.txt|wc -l` |
||
293 | I="0" |
||
294 | |||
295 | while read WORD |
||
296 | do |
||
297 | HASH=`echo -n $WORD |md5sum |awk '{print $1}'|tr -d '\n'|sha1sum|awk '{print $1}'` |
||
298 | if [ "$HASH" = "6c7f4d49729e58d7a458999b570e0151bc034ca7" ] |
||
299 | then |
||
300 | echo $WORD |
||
301 | exit 0 |
||
302 | fi |
||
303 | #I=$((I + 1)) |
||
304 | #printf "%d/%d\r" "$I" "$MAX" |
||
305 | done < list.txt |
||
306 | |||
307 | echo "Not found." |
||
308 | exit 1 |
||
309 | ~~~ |
||
310 | |||
311 | 順列の算出(総当りの元)は、やむを得ずPythonスクリプトを使った。 |
||
312 | [egzact](http://qiita.com/greymd/items/3515869d9ed2a1a61a49)が使えたかもしれない。 |
||
313 | |||
314 | permutations.py |
||
315 | |||
316 | ~~~python |
||
317 | #!/usr/bin/env python |
||
318 | |||
319 | import sys |
||
320 | from itertools import permutations |
||
321 | |||
322 | itr = permutations(sys.argv[2],int(sys.argv[1])) |
||
323 | |||
324 | for i in itr: |
||
325 | print "".join(map(str,i)) |
||
326 | ~~~ |
||
327 | |||
328 | 実行結果 |
||
329 | |||
330 | ~~~ |
||
331 | $ time solv.sh |
||
332 | h4ck |
||
333 | 6894.03user 13979.57system 26:07:07elapsed 22%CPU (0avgtext+0avgdata 1464maxresident)k |
||
334 | 35744inputs+8outputs (78major+8601248019minor)pagefaults 0swaps |
||
335 | ~~~ |
||
336 | |||
337 | なんか26時間程かかっていた模様。実用に耐えないなw |
||
338 | |||
339 | ## 余談(md5sum,sha1sumコマンドのハマり所) |
||
340 | |||
341 | 普段何気なくシェル芸してハッシュ値を確認するんだけど、 **ハッシュした値を更にハッシュする** は、やった経験がなくて、微妙にハマった。 |
||
342 | |||
343 | * ハマった理由 |
||
344 | |||
345 | ~~~ |
||
346 | ■ダメな理由 |
||
347 | $ echo -n h4ck |md5sum |
||
348 | 0ed5f1f056b1d96122afaae306d3dd65 - |
||
349 | ^^^ |
||
350 | 邪魔! |
||
351 | ~~~ |
||
352 | |||
353 | ゆえに、単純にパイプして出力すると期待したハッシュ値が得られない |
||
354 | |||
355 | ~~~ |
||
356 | ■NG |
||
357 | $ echo -n h4ck |md5sum |sha1sum |
||
358 | 7265ca1966827b7cda1e61183cee77996aeca50d - |
||
359 | ■OK |
||
360 | $ echo -n h4ck |md5sum |awk '{print $1}'|tr -d '\n'|sha1sum |
||
361 | 6c7f4d49729e58d7a458999b570e0151bc034ca7 - |
||
362 | ~~~ |
||
363 | |||
364 | 整理すると以下になる。ハッシュ値以外の余計なものを出力するやつは、途中にパイプを挟んでハイフンやら改行やらの削除が必要。 |
||
365 | |||
366 | * PHPの実行結果 |
||
367 | |||
368 | ~~~ |
||
369 | $ cat md5.php |
||
370 | <?php |
||
371 | $ans = md5($argv[1]); |
||
372 | echo $ans; |
||
373 | ?> |
||
374 | $ php md5.php h4ck |
||
375 | 0ed5f1f056b1d96122afaae306d3dd65 |
||
376 | ~~~ |
||
377 | |||
378 | ~~~ |
||
379 | $ cat sha1.php |
||
380 | <?php |
||
381 | $ans = sha1($argv[1]); |
||
382 | echo $ans; |
||
383 | ?> |
||
384 | $ php sha1.php h4ck |
||
385 | e17e98788d6b4ac922b2df100ef9398ae0f229ad |
||
386 | ~~~ |
||
387 | |||
388 | ~~~ |
||
389 | $ cat md5_sha1.php |
||
390 | <?php |
||
391 | $ans = sha1(md5($argv[1])); |
||
392 | echo $ans; |
||
393 | ?> |
||
394 | $ php md5_sha1.php h4ck |
||
395 | 6c7f4d49729e58d7a458999b570e0151bc034ca7 |
||
396 | ~~~ |
||
397 | |||
398 | * KaliLinuxでの実行結果 |
||
399 | |||
400 | KaliLinuxには、md5deep,sha1deepというコマンドがあった。違いは知らん。ただ、語尾のハイフンが付いていない。 |
||
401 | |||
402 | ~~~ |
||
403 | $ echo -n h4ck |md5sum |
||
404 | 0ed5f1f056b1d96122afaae306d3dd65 - |
||
405 | $ echo -n h4ck |md5deep |
||
406 | 0ed5f1f056b1d96122afaae306d3dd65 |
||
407 | $ echo -n h4ck |sha1deep |
||
408 | e17e98788d6b4ac922b2df100ef9398ae0f229ad |
||
409 | $ echo -n h4ck |sha1sum |
||
410 | e17e98788d6b4ac922b2df100ef9398ae0f229ad - |
||
411 | $ echo -n h4ck |md5sum |awk '{print $1}'|tr -d '\n'|sha1sum |
||
412 | 6c7f4d49729e58d7a458999b570e0151bc034ca7 - |
||
413 | $ echo -n h4ck |md5deep |tr -d '\n'|sha1deep |
||
414 | 6c7f4d49729e58d7a458999b570e0151bc034ca7 |
||
415 | ~~~ |
||
416 | |||
417 | * CentOSでの実行結果 |
||
418 | |||
419 | CentOSに md5deep,sha1deep というコマンドは無い。 |
||
420 | |||
421 | ~~~ |
||
422 | $ echo -n h4ck |md5sum |
||
423 | 0ed5f1f056b1d96122afaae306d3dd65 - |
||
424 | $ echo -n h4ck |sha1sum |
||
425 | e17e98788d6b4ac922b2df100ef9398ae0f229ad - |
||
426 | $ echo -n h4ck |md5sum |awk '{print $1}'|tr -d '\n'|sha1sum |
||
427 | 6c7f4d49729e58d7a458999b570e0151bc034ca7 - |
||
428 | ~~~ |
||
429 | |||
430 | # SCADA 100 |
||
431 | |||
432 | ~~~ |
||
433 | Setup a free account on Shodan.io. |
||
434 | Somewhere on the Class C network xxx.xxx.x.1-255 you will find a suspicious looking Gas Station. |
||
435 | |||
436 | Without directly interacting with the server (it will be offline during the qualifier), |
||
437 | but only using what Shodan has found for you - attempt to determine the flag |
||
438 | |||
439 | ※ipアドレス xxx.xxx.x.1-255は、なんか迷惑がかかってもいけないので、伏せました。 |
||
440 | ~~~ |
||
441 | |||
442 | [Shodan](https://www.shodan.io/)先生を使った調査作業ですね。 |
||
443 | こいつは結局最後まで解けなくて、そして、これに最も時間を費やしたw |
||
444 | 解けそうで解けなかった。もどかしかった。。 |
||
445 | |||
446 | ## 問題の意図を確認 |
||
447 | |||
448 | Setup a free account on Shodan.io. |
||
449 | |||
450 | > Shodanのフリーアカウントを作りなさい |
||
451 | |||
452 | Somewhere on the Class C network xxx.xxx.x.1-255 you will find a suspicious looking Gas Station. |
||
453 | |||
454 | > ガソリンスタンドのIPアドレスが xxx.xxx.x.1-255 にあるから、見つけなさい |
||
455 | |||
456 | Without directly interacting with the server (it will be offline during the qualifier), |
||
457 | |||
458 | > 発見したIPアドレスに接続は不要(どのみちオフラインだよ) |
||
459 | |||
460 | but only using what Shodan has found for you - attempt to determine the flag |
||
461 | |||
462 | > Shodanだけ使ってflagを発見するのです! |
||
463 | |||
464 | ## なぜフリーアカウントを作るのか |
||
465 | |||
466 | フリーアカウントを作れという事は、アカウントがないと使えない機能があるということでしょう。 |
||
467 | |||
468 | 登録ページに **Developer API** が使えるっぽい事が書いてあるので、それを利用するんだなと予想しました。 |
||
469 | |||
470 | ちなみに、①登録→②メールが来る→③メールにあるアドレスにアクセス→④ログインできるようになる。 |
||
471 | んだけど、②のメールが迷惑メールフォルダに入ってて、気づかなくてハマった。 |
||
472 | |||
473 | ## チームメンバが怪しいIPを発見してくれる |
||
474 | |||
475 | さっそく見つけてくれました。便宜上、ここでは xxx.xxx.x.189 としておきます。 |
||
476 | |||
477 | 得られた情報は、こんな感じ。 |
||
478 | |||
479 | ~~~ |
||
480 | 5900 |
||
481 | tcp |
||
482 | http-simple |
||
483 | RFB 003.007 |
||
484 | authentication disabled |
||
485 | ~~~ |
||
486 | |||
487 |  |
||
488 | |||
489 | ~~~ |
||
490 | 10001 |
||
491 | tcp |
||
492 | automated-tank-gauge |
||
493 | I20100 |
||
494 | 07/20/2016 23:38 |
||
495 | |||
496 | TMCTF FUEL STATION |
||
497 | Yubinbango151-0053 |
||
498 | Mines Tower |
||
499 | Shinjuku |
||
500 | |||
501 | IN-TANK INVENTORY |
||
502 | |||
503 | TANK PRODUCT VOLUME TC VOLUME ULLAGE HEIGHT WATER TEMP |
||
504 | 1 TMTANK1 3538 3647 7695 37.57 9.52 51.42 |
||
505 | 2 TMTANK1 8902 9068 9781 73.94 9.17 59.27 |
||
506 | 3 TMTANK3 8478 8614 3081 26.52 3.60 52.58 |
||
507 | 4 TMTANK4 7552 7642 3081 55.77 6.51 50.54 |
||
508 | ~~~ |
||
509 | |||
510 | スクリーンショットに怪しい値 "00 00 17 15 08 30 74 15 1e 12 0d 0f 0c 4e" が見えます。 |
||
511 | |||
512 | ## ハマりポイント |
||
513 | |||
514 | さてさて、ログイン無しで得られる情報は、ここまでのようです。 |
||
515 | さっそく **Developer API** を使ってみましょう。フリーアカウントを作ると、APIキーが発行されます。 |
||
516 | |||
517 | ここでは便宜上 {SHODAN_API_KEY} と表現することにします。 |
||
518 | Developer APIを使う時、APIキーが必要になります。 |
||
519 | |||
520 | 使える言語は、以下 |
||
521 | |||
522 | SHODAN DEVELOPER Clients/ Libraries |
||
523 | https://developer.shodan.io/api/clients |
||
524 | |||
525 | RubyやPythonも使えますが、自分的には一番楽なRESTを使います。 |
||
526 | RESTだったら、ブラウザか、curlコマンド一発で出ますし。おすし。 |
||
527 | |||
528 | 以下の使い方をみて、コーディング。 |
||
529 | 1行で書けるのは気持ちがいい。 |
||
530 | |||
531 | SHODAN DEVELOPER REST API Documentation |
||
532 | https://developer.shodan.io/api |
||
533 | |||
534 | こんな感じ。jqを通しているのは、受信したJSONを整形したいので。 |
||
535 | |||
536 | ~~~ |
||
537 | $ curl https://api.shodan.io/shodan/host/xxx.xxx.x.189?key={SHODAN_API_KEY}&history=true | jq . |
||
538 | ~~~ |
||
539 | |||
540 | これで、過去5回分ぐらいのスキャン結果が得られました! |
||
541 | これを舐めまわすように調べます。執拗に調べます。スクリーンショットにあった謎の数値も関係あるのでしょう。そこも意識して。 |
||
542 | |||
543 | 結果。 |
||
544 | |||
545 |  |
||
546 | |||
547 | 何の成果も得られませんでした。 |
||
548 | [キース隊長](https://www.google.co.jp/search?q=%E4%BD%95%E3%81%AE%E6%88%90%E6%9E%9C%E3%82%82%E5%BE%97%E3%82%89%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F%E3%81%81&biw=1153&bih=855&source=lnms&tbm=isch&sa=X&sqi=2&ved=0ahUKEwjb7bzz1KLOAhXCmJQKHXeFA5UQ_AUIBigB)ばりにハゲるかと思った。 |
||
549 | |||
550 | ## 唐突に見つける別のIP |
||
551 | |||
552 | もぅ何も見つけられなくて、ぼんやりしながら、 |
||
553 | そう言えば、このガソリンスタンドは TMCTF FUEL STATION って言うんだな、ふーん。 |
||
554 | |||
555 | って、横になりながら |
||
556 | "TMCTF FUEL STATION" をShodanで検索してみると、別のIP(便宜上 yy.yyy.yyy.yy とします)が出た。 |
||
557 | |||
558 | あれ・・・ |
||
559 | |||
560 | Somewhere on the Class C network xxx.xxx.x.1-255 you will find a suspicious looking Gas Station. |
||
561 | |||
562 | >ガソリンスタンドのIPアドレスが xxx.xxx.x.1-255 にあるから、見つけなさい |
||
563 | |||
564 | xxx.xxx.x.1-255の範囲じゃないのかww |
||
565 | |||
566 | こんな結果が出る!怪しい!怪しいぞ! |
||
567 | |||
568 | ~~~ |
||
569 | 5353 |
||
570 | udp |
||
571 | mdns |
||
572 | \x00\x00\x84\x00\x00\x01\x00\x04\x00\x00\x00\x00\t_services\x07_dns-sd\x04_udp\x05local\x00\x00\x0c\x00\x01\xc0\x0c\x00\x0c\x00\x01\x00\x00\x00\n\x00\x13\x0b_udisks-ssh\x04_tcp\xc0#\xc0\x0c\x00\x0c\x00\x01\x00\x00\x00\n\x00\x08\x05_http\xc0F\xc0\x0c\x00\x0c\x00\x01\x00\x00\x00\n\x00\x07\x04_rfb\xc0F\xc0\x0c\x00\x0c\x00\x01\x00\x00\x00\n\x00\x0f\x0c_workstation\xc0F |
||
573 | 10001 |
||
574 | tcp |
||
575 | automated-tank-gauge |
||
576 | I20100 |
||
577 | 07/11/2016 17:39 |
||
578 | |||
579 | TMCTF FUEL STATION |
||
580 | Yubinbango151-0053 |
||
581 | Mines Tower |
||
582 | Shinjuku |
||
583 | |||
584 | |||
585 | |||
586 | IN-TANK INVENTORY |
||
587 | |||
588 | TANK PRODUCT VOLUME TC VOLUME ULLAGE HEIGHT WATER TEMP |
||
589 | 1 TMTANK1 9035 9136 6367 41.96 8.56 58.70 |
||
590 | 2 TMTANK1 4312 4500 9107 62.78 4.42 59.44 |
||
591 | 3 TMTANK3 7537 7689 3670 53.21 5.15 52.79 |
||
592 | 4 TMTANK4 6454 6505 3670 28.29 9.14 54.19 |
||
593 | ~~~ |
||
594 | |||
595 | なんだこのexploit的なコードが怪しい。 |
||
596 | |||
597 | ## さぁもう一度 DEVELOPER API |
||
598 | |||
599 | DEVELOPER API を使って再度情報を取得 |
||
600 | |||
601 | こんな感じ。さっきとやり方は同じ。 |
||
602 | |||
603 | ~~~ |
||
604 | $ curl https://api.shodan.io/shodan/host/yy.yyy.yyy.yy?key={SHODAN_API_KEY}&history=true | jq . |
||
605 | ~~~ |
||
606 | |||
607 | すると。。 |
||
608 | いっぱい情報ががが! |
||
609 | |||
610 | 怪しいとろこを抜き出すと以下の通り |
||
611 | |||
612 | ~~~ |
||
613 | "vulns": [ |
||
614 | "!CVE-2014-0160", |
||
615 | "!CVE-2014-0160", |
||
616 | "!CVE-2014-0160", |
||
617 | ~~~ |
||
618 | |||
619 | CVE-2014-0160は、懐かしの[Heartbleed](https://www.google.co.jp/search?q=HEARTBLEED&oq=HEARTBLEED&ie=UTF-8)の脆弱性! |
||
620 | |||
621 | |||
622 | ~~~ |
||
623 | "data": "220 flawless-server ESMTP Postfix (Ubuntu)\r\n250-flawless-server\r\n250-PIPELINING\r\n250-SIZE 10240000\r\n250-VRFY\r\n250-ETRN\r\n250-STARTTLS\r\n250-ENHANCEDSTATUSCODES\r\n250-8BITMIME\r\n250 DSN\r\n", |
||
624 | ~~~ |
||
625 | SIZE 10240000 …でかいサイズを要求し、Hearbleedの脆弱性を利用して鍵情報の流出を狙っているんじゃないだろうか。 |
||
626 | |||
627 | ~~~ |
||
628 | "data": "SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2\nKey type: ssh-rsa\nKey: AAAAB3NzaC1yc2EAAAADAQABAAABAQC4HCDyPMoybg5G+Tk7z84msC+BovKHFmdZduUXX+T1WwRw\nb51AWsXrbHnoCWvhWj1KJNkhzIQ4p1y3/TDpRCuCcUr+iMialVlJj8vkHMBCpbqnNe2NprMmvFdN\nL7PXtwfvCOIJKABalT/QgQ23RBsDlXomWP8ja+Bb5kRdJh18zRb5b3bZEyq52F5Uq//plH4Hx8Yd\n5WeuyxlsltO51ZhZBDunRRycYoV2exgpZX2o5oChPvEKwjwlwDV5VRN/JKl82Cdf23ekMDOrc7bN\nk9E8RycGAkDbIbHS/6mYxB62eRp+25g69IIIBnbRsaffl+UmzudvEVixzxLn+MNJ5hpJ\nFingerprint: ae:89:cd:05:90:4d:ec:56:9b:b9:f1:41:28:24:e3:77", |
||
629 | ~~~ |
||
630 | ~~~ |
||
631 | "ssh": { |
||
632 | "fingerprint": "ae:89:cd:05:90:4d:ec:56:9b:b9:f1:41:28:24:e3:77", |
||
633 | "mac": "hmac-sha2-256", |
||
634 | "cipher": "aes128-ctr", |
||
635 | "key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQC4HCDyPMoybg5G+Tk7z84msC+BovKHFmdZduUXX+T1WwRw\nb51AWsXrbHnoCWvhWj1KJNkhzIQ4p1y3/TDpRCuCcUr+iMialVlJj8vkHMBCpbqnNe2NprMmvFdN\nL7PXtwfvCOIJKABalT/QgQ23RBsDlXomWP8ja+Bb5kRdJh18zRb5b3bZEyq52F5Uq//plH4Hx8Yd\n5WeuyxlsltO51ZhZBDunRRycYoV2exgpZX2o5oChPvEKwjwlwDV5VRN/JKl82Cdf23ekMDOrc7bN\nk9E8RycGAkDbIbHS/6mYxB62eRp+25g69IIIBnbRsaffl+UmzudvEVixzxLn+MNJ5hpJ\n", |
||
636 | "kex": { |
||
637 | "languages": [ |
||
638 | "" |
||
639 | ], |
||
640 | "server_host_key_algorithms": [ |
||
641 | "ssh-rsa", |
||
642 | "ssh-dss", |
||
643 | "ecdsa-sha2-nistp256", |
||
644 | "ssh-ed25519" |
||
645 | ], |
||
646 | "encryption_algorithms": [ |
||
647 | "aes128-ctr", |
||
648 | "aes192-ctr", |
||
649 | "aes256-ctr", |
||
650 | "arcfour256", |
||
651 | "arcfour128", |
||
652 | "aes128-gcm@openssh.com", |
||
653 | "aes256-gcm@openssh.com", |
||
654 | "chacha20-poly1305@openssh.com", |
||
655 | "aes128-cbc", |
||
656 | "3des-cbc", |
||
657 | "blowfish-cbc", |
||
658 | "cast128-cbc", |
||
659 | "aes192-cbc", |
||
660 | "aes256-cbc", |
||
661 | "arcfour", |
||
662 | "rijndael-cbc@lysator.liu.se" |
||
663 | ], |
||
664 | "kex_follows": false, |
||
665 | "unused": 0, |
||
666 | "kex_algorithms": [ |
||
667 | "curve25519-sha256@libssh.org", |
||
668 | "ecdh-sha2-nistp256", |
||
669 | "ecdh-sha2-nistp384", |
||
670 | "ecdh-sha2-nistp521", |
||
671 | "diffie-hellman-group-exchange-sha256", |
||
672 | "diffie-hellman-group-exchange-sha1", |
||
673 | "diffie-hellman-group14-sha1", |
||
674 | "diffie-hellman-group1-sha1" |
||
675 | ], |
||
676 | "compression_algorithms": [ |
||
677 | "none", |
||
678 | "zlib@openssh.com" |
||
679 | ], |
||
680 | "mac_algorithms": [ |
||
681 | "hmac-md5-etm@openssh.com", |
||
682 | "hmac-sha1-etm@openssh.com", |
||
683 | "umac-64-etm@openssh.com", |
||
684 | "umac-128-etm@openssh.com", |
||
685 | "hmac-sha2-256-etm@openssh.com", |
||
686 | "hmac-sha2-512-etm@openssh.com", |
||
687 | "hmac-ripemd160-etm@openssh.com", |
||
688 | "hmac-sha1-96-etm@openssh.com", |
||
689 | "hmac-md5-96-etm@openssh.com", |
||
690 | "hmac-md5", |
||
691 | "hmac-sha1", |
||
692 | "umac-64@openssh.com", |
||
693 | "umac-128@openssh.com", |
||
694 | "hmac-sha2-256", |
||
695 | "hmac-sha2-512", |
||
696 | "hmac-ripemd160", |
||
697 | "hmac-ripemd160@openssh.com", |
||
698 | "hmac-sha1-96", |
||
699 | "hmac-md5-96" |
||
700 | ] |
||
701 | }, |
||
702 | "type": "ssh-rsa" |
||
703 | } |
||
704 | ~~~ |
||
705 | |||
706 | 鍵情報が出ちゃってるんじゃないだろうかw |
||
707 | |||
708 | あと、こういう怪しそうな情報が散見される。 |
||
709 | |||
710 | ~~~ |
||
711 | "data": "\\x00\\x00\\x84\\x00\\x00\\x01\\x00\\x02\\x00\\x00\\x00\\x00\\t_services\\x07_dns-sd\\x04_udp\\x05local\\x00\\x00\\x0c\\x00\\x01\\xc0\\x0c\\x00\\x0c\\x00\\x01\\x00\\x00\\x00\\n\\x00\\x14\\x0c_workstation\\x04_tcp\\xc0#\\xc0\\x0c\\x00\\x0c\\x00\\x01\\x00\\x00\\x00\\n\\x00\\x0e\\x0b_udisks-ssh\\xc0G", |
||
712 | ~~~ |
||
713 | |||
714 | ~~~ |
||
715 | "data": "\\x03\\x00\\x00\\x0b\\x06\\xd0\\x00\\x00\\x00\\x00\\x00", |
||
716 | ~~~ |
||
717 | |||
718 | |||
719 | ~~~ |
||
720 | "raw": "000084000001000200000000095f7365727669636573075f646e732d7364045f756470056c6f63616c00000c0001c00c000c00010000000a00140c5f776f726b73746174696f6e045f746370c023c00c000c00010000000a000e0b5f756469736b732d737368c047" |
||
721 | ~~~ |
||
722 | |||
723 | ## この鍵は・・・なんだ・・・?で、時間切れ |
||
724 | |||
725 | さて、この鍵、Base64形式だね。 |
||
726 | |||
727 | > 間に \n が入っているので注意 |
||
728 | |||
729 | ~~~ |
||
730 | AAAAB3NzaC1yc2EAAAADAQABAAABAQC4HCDyPMoybg5G+Tk7z84msC+BovKHFmdZduUXX+T1WwRw\nb51AWsXrbHnoCWvhWj1KJNkhzIQ4p1y3/TDpRCuCcUr+iMialVlJj8vkHMBCpbqnNe2NprMmvFdN\nL7PXtwfvCOIJKABalT/QgQ23RBsDlXomWP8ja+Bb5kRdJh18zRb5b3bZEyq52F5Uq//plH4Hx8Yd\n5WeuyxlsltO51ZhZBDunRRycYoV2exgpZX2o5oChPvEKwjwlwDV5VRN/JKl82Cdf23ekMDOrc7bN\nk9E8RycGAkDbIbHS/6mYxB62eRp+25g69IIIBnbRsaffl+UmzudvEVixzxLn+MNJ5hpJ\n |
||
731 | ~~~ |
||
732 | |||
733 | Base64形式だったので、デコードしてダンプみる。 |
||
734 | |||
735 | ~~~ |
||
736 | $ xxd key.bin |
||
737 | 0000000: 0000 0007 7373 682d 7273 6100 0000 0301 ....ssh-rsa..... |
||
738 | 0000010: 0001 0000 0101 00b8 1c20 f23c ca32 6e0e ......... .<.2n. |
||
739 | 0000020: 46f9 393b cfce 26b0 2f81 a2f2 8716 6759 F.9;..&./.....gY |
||
740 | 0000030: 76e5 175f e4f5 5b04 706f 9d40 5ac5 eb6c v.._..[.po.@Z..l |
||
741 | 0000040: 79e8 096b e15a 3d4a 24d9 21cc 8438 a75c y..k.Z=J$.!..8.\ |
||
742 | 0000050: b7fd 30e9 442b 8271 4afe 88c8 9a95 5949 ..0.D+.qJ.....YI |
||
743 | 0000060: 8fcb e41c c042 a5ba a735 ed8d a6b3 26bc .....B...5....&. |
||
744 | 0000070: 574d 2fb3 d7b7 07ef 08e2 0928 005a 953f WM/........(.Z.? |
||
745 | 0000080: d081 0db7 441b 0395 7a26 58ff 236b e05b ....D...z&X.#k.[ |
||
746 | 0000090: e644 5d26 1d7c cd16 f96f 76d9 132a b9d8 .D]&.|...ov..*.. |
||
747 | 00000a0: 5e54 abff e994 7e07 c7c6 1de5 67ae cb19 ^T....~.....g... |
||
748 | 00000b0: 6c96 d3b9 d598 5904 3ba7 451c 9c62 8576 l.....Y.;.E..b.v |
||
749 | 00000c0: 7b18 2965 7da8 e680 a13e f10a c23c 25c0 {.)e}....>...<%. |
||
750 | 00000d0: 3579 5513 7f24 a97c d827 5fdb 77a4 3033 5yU..$.|.'_.w.03 |
||
751 | 00000e0: ab73 b6cd 93d1 3c47 2706 0240 db21 b1d2 .s....<G'..@.!.. |
||
752 | 00000f0: ffa9 98c4 1eb6 791a 7edb 983a f482 0806 ......y.~..:.... |
||
753 | 0000100: 76d1 b1a7 df97 e526 cee7 6f11 58b1 cf12 v......&..o.X... |
||
754 | 0000110: e7f8 c349 e61a 49 |
||
755 | ~~~ |
||
756 | |||
757 | ん?んん・・・これpem形式じゃないし・・・なんの形式かしら?どうやって使うのかしら? |
||
758 | と、調べている間に時間切れ・・・ |
||
759 | |||
760 | [OpenSSH形式](http://qiita.com/hotpepsi/items/128f3a660cee8b5467c6)の鍵フォーマットなんじゃないかな。というあたりまでは解った。 |
||
761 | |||
762 | どう使うかあたりは、もっと調査が必要だったと思われ。 |
||
763 | 以下が参考になるんじゃないかな(まだちゃんと見てないけど)。 |
||
764 | |||
765 | Signing data with ssh-agent |
||
766 | http://blog.oddbit.com/2011/05/09/signing-data-with-ssh-agent/ |
||
767 | |||
768 | Converting OpenSSH public keys |
||
769 | http://blog.oddbit.com/2011/05/08/converting-openssh-public-keys/ |
||
770 | |||
771 | ## こうやって解くんじゃない? |
||
772 | |||
773 | 実はこのスクリーンショットの怪しい数字 |
||
774 | |||
775 |  |
||
776 | |||
777 | ~~~ |
||
778 | 00 00 17 15 08 30 74 15 1e 12 0d 0f 0c 4e |
||
779 | ~~~ |
||
780 | |||
781 | これを前述の鍵で複合すればflagなんでしょ!? |
||
782 | |||
783 | も、もぅ、知ってるんだからねっ(*/ω\*) |
||
784 | |||
785 | ## 誰か続きを頼む |
||
786 | |||
787 | あともうちょっとだと思うんだけどな~ |
||
788 | |||
789 | こ、これ本当に100点なのかw |
||
790 | こいつはアレだ。。競技時間は終わったけど、調査は続けられるハズ。 |
||
791 | 誰か解いて教えてくれ。。 |
||
792 | |||
793 | ## 答えがわかった |
||
794 | |||
795 | 2016.8.6 追記 |
||
796 | |||
797 | Trend Micro CTF 2016 Online Qualifier | #Scada | SCADA 100 Points |
||
798 | https://www.youtube.com/watch?v=YyHbJDmSQWc |
||
799 | |||
800 | なんとも言えないこの徒労感。このエスパー感がたまらない。 |
||
801 | |||
802 | |||
803 | 00 00 17 15 08 30 74 15 1e 12 0d 0f 0c 4e と TMTANK3TMTANK3 で xor |
||
804 | |||
805 | ~~~ |
||
806 | $ cat solv.sh |
||
807 | #!/bin/bash |
||
808 | |||
809 | printf "%b" $(printf '%s%x' '\x' $((0x54 ^ 0x00))) |
||
810 | printf "%b" $(printf '%s%x' '\x' $((0x4d ^ 0x00))) |
||
811 | printf "%b" $(printf '%s%x' '\x' $((0x54 ^ 0x17))) |
||
812 | printf "%b" $(printf '%s%x' '\x' $((0x41 ^ 0x15))) |
||
813 | printf "%b" $(printf '%s%x' '\x' $((0x4e ^ 0x08))) |
||
814 | printf "%b" $(printf '%s%x' '\x' $((0x4b ^ 0x30))) |
||
815 | printf "%b" $(printf '%s%x' '\x' $((0x33 ^ 0x74))) |
||
816 | printf "%b" $(printf '%s%x' '\x' $((0x54 ^ 0x15))) |
||
817 | printf "%b" $(printf '%s%x' '\x' $((0x4d ^ 0x1e))) |
||
818 | printf "%b" $(printf '%s%x' '\x' $((0x54 ^ 0x12))) |
||
819 | printf "%b" $(printf '%s%x' '\x' $((0x41 ^ 0x0d))) |
||
820 | printf "%b" $(printf '%s%x' '\x' $((0x4e ^ 0x0f))) |
||
821 | printf "%b" $(printf '%s%x' '\x' $((0x4b ^ 0x0c))) |
||
822 | printf "%b" $(printf '%s%x' '\x' $((0x33 ^ 0x4e))) |
||
823 | |||
824 | $ ./solv.sh |
||
825 | TMCTF{GASFLAG} |
||
826 | ~~~ |