プロジェクト

全般

プロフィール

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
![20160730_tmctf_seika.jpg](20160730_tmctf_seika.jpg)
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
![20160730_tmctf_scada100.jpg](20160730_tmctf_scada100.jpg)
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
![20160730_tmctf_seika.jpg](20160730_tmctf_seika.jpg)
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
![20160730_tmctf_scada100.jpg](20160730_tmctf_scada100.jpg)
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
~~~