CTF Writeup TMCTF2016

結果&感想

Trend Micro CTF 2016 に、某チームで参加しました。
結果は、去年より若干悪くなっている(と言っても、国内10位以内)んだけれど、予め申し上げておくと、今回、私は 得点できず でした。
いやぁ、難しかった。去年も難しかったけど、今年は輪をかけて難しかった。

そんな中でも、チームのc@tさんとリリりん♪さんは、やはりひと味違ってましたね。。

ままま、アシストできた問題と、良い所まで行った問題のwriteupというか、解った所までを書こうと思います。

20160730_tmctf_seika.jpg

Trend Micro CTF Asia Pacific & Japan 2016 オンライン予選 ランキングページ
https://ctf.trendmicro.co.jp/ranking.html

Analysis - defensive 100

Decode me!

で、こんなファイルが渡される。

decodeme_decodeme.php

<?php
$GLOBALS['key'] = "6c7f4d49729e58d7a458999b570e0151bc034ca7"; 
$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/");?>

お、PHPやんけ!実行したろ。。と思って、実行するとhtmlが出力されるが、特にflagやヒント等は書かれていない。

    <html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'><meta http-equiv='Content-Language' content='en-us'>                                                               
    <title>decodeme</title>                                       
    <style type='text/css'>                                       
    <!--                                                          
    body{ background-color:darkred; color:white; }                
    hr{ background-color:dimgray; color:dimgray; border:0 none; height: 2px; }                                                      
    -->                                                           
    </style>                                                      
    </head>                                                       
    <body>                                                        
    <br><br>                                                      
    <form method='post'>                                          
    <center>                                                      
    <input type='password' id='key' name='key'>                   
    <p>enter ****</p>                                             
    </center>                                                     
    </form>                                                       
    </body></html>                                               

デコード

その時「元のサイズが32kもあるんだから、そんな短いhtmlになるのはおかしい。eval直前の値を取り出したら良いのでは」

と c@tさんが教えてくれた

あぁ、そうか、なるほど。ちょっと解りにくくしてあるけど、コードを整理してみよう。

<?php
$GLOBALS['key'] = "6c7f4d49729e58d7a458999b570e0151bc034ca7"; 
$func="create_function";
$decodeme=$func('$x','eval("?>".gzinflate(base64_decode($x)));');
$decodeme("7f1n0+zMcSgIfh...base64っぽい文字列が続く...tP34vUP6/");?>

こうなってる。で、こんな感じに修正して、eval直前の値を取り出す。
evalの所をprintに修正する。

<?php
$GLOBALS['key'] = "6c7f4d49729e58d7a458999b570e0151bc034ca7"; 
$func="create_function";
$decodeme=$func('$x','print("?>".gzinflate(base64_decode($x)));');
$decodeme("7f1n0+zMcSgIfh...base64された文字列が続く...tP34vUP6/");?>

すると、でた。沢山でた。

?><?php
// reference: https://github.com/b374k/b374k/blob/master/LICENSE.md
function chk_password(){
    if(!isset($GLOBALS['key'])){ die(); }
    if(trim($GLOBALS['key'])==''){ die(); }
    $glob = $GLOBALS['key'];

    $post = '';
    $cook = '';
    if (isset($_POST['key'])) { $post = $_POST['key']; }
    if (isset($_COOKIE['key'])) { $cook = $_COOKIE['key']; }
    if ($cook==$glob) { return; }

    if($post != ''){
        $key = sha1(md5($post));
        if($key==$glob){
            setcookie("key", $key, time()+36000, "/");
            $qstr = (isset($_SERVER["QUERY_STRING"])&&(!empty($_SERVER["QUERY_STRING"])))?"?".$_SERVER["QUERY_STRING"]:"";
            header("Location: ".htmlspecialchars($_SERVER["REQUEST_URI"].$qstr, 2 | 1));
            $cook = $_COOKIE['key'];
        }
    }

    $output = "
    <html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'><meta http-equiv='Content-Language' content='en-us'>
    <title>decodeme</title>
    <style type='text/css'>
    <!--
    body{ background-color:darkred; color:white; }
    hr{ background-color:dimgray; color:dimgray; border:0 none; height: 2px; }
    -->
    </style>
    </head>
    <body>
    <br><br>
    <form method='post'>
    <center>
    <input type='password' id='key' name='key'>
    <p>enter ****</p>
    </center>
    </form>
    </body></html>";

    echo $output;
    die();

}
chk_password();
?>

<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="en-us">
<title>decodeme</title>
<style type="text/css">
<!--
body{ background-color:darkred; color:white; }
hr{ background-color:dimgray; color:dimgray; border:0 none; height: 2px; }
-->
</style>
</head>

<?php
$GLOBALS['images']['version']= "iVBORw0KGgoAAAANSUhEUgAA...以下、省略

ざっと、全体を眺めてみると webshell を実現する何かみたい。
さてさて、怪しそうな所は・・・

デコードされたコードを読む・認証の仕組み

このデコードしたソースには、認証の方式がコーディングされている

ここ

    if($post != ''){
        $key = sha1(md5($post));
        if($key==$glob){

入力した値をMD5でハッシュ化して、さらにSHA1でハッシュ化したものと比べている。
比較している $globは・・・
これだろうな。

$GLOBALS['key'] = "6c7f4d49729e58d7a458999b570e0151bc034ca7"; 

あと、これもヒントだね。認証画面での入力は、4文字を期待しているっぽい。

    <form method='post'>
    <center>
    <input type='password' id='key' name='key'>
    <p>enter ****</p>
    </center>
    </form>

整理すると、こうだ。

  • flagは4文字
  • flagをmd5して、それを更にsha1すると 6c7f4d49729e58d7a458999b570e0151bc034ca7 になる

チームメンバがPNGファイルの中からExifを見つけてくれる

デコードしたソースは、このページでは省略しているけど、本当は、Base64でエンコードされた画像データが、いくつか埋まっていた。
ソース中に、こんなのがいくつかある。

$GLOBALS['images']['lock']= "iVBORw0KGgoAAAANSU...中略

    <img align="left" src="data:image/png;base64,<?php echo $GLOBALS['images']['lock']; ?>" alt="figure" />

その中の一つのpng画像に、Exifがあって、そこにBase64の文字列が入っていることをチームのメンバが発見してくれたのでした!

PNGはExif情報をサポートしてないから、無理やり入れたんだろうな。。

$ xxd image7.png |head
0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR
0000010: 0000 0047 0000 0072 0803 0000 0141 de0c  ...G...r.....A..
0000020: a500 0000 a67a 5458 7452 6177 2070 726f  .....zTXtRaw pro
0000030: 6669 6c65 2074 7970 6520 6578 6966 0000  file type exif..
0000040: 78da 558e cb0d 4331 0804 efae 2225 9805  x.U...C1...."%..
0000050: 16bb 1cfb c596 d241 ca0f ef73 c94a 6860  .......A...s.Jh`
0000060: 0412 657d 3fbb bcce 8858 318f c64e d68c  ..e}?....X1..N..
0000070: 75eb 18d9 b47a 0759 bbca 457f 146f 4abd  u....z.Y..E..oJ.
0000080: bd3d ab05 47fd 0b36 1606 36f3 901e a4f0  .=..G..6..6.....
0000090: 4023 28a1 74a5 9a6f 1a9d ca8b 6880 0f8f  @#(.t..o....h...
$

デコードすると、以下のようになるとのこと。

echo 'flag is sha1(password)';

4文字のパスワードをsha1したのが答えですって事なんでしょう。

結果

それで、flagの4文字は、どうやって見つけるんだろう、総当りしかないのかしら?
と思っていろいろ調べてたんだけど、結局、c@tさんが一瞬で解いてくれました(総当りでw)

答え

h4ck

それを更にSHA1

TMCTF{e17e98788d6b4ac922b2df100ef9398ae0f229ad}

余談(ハッシュ値の総当り)

c@tさんに頂いたrubyスクリプトを参考に、総当りするPythonスクリプトとシェルスクリプトを書いてみた。

  • Python - 総当り
#!/usr/bin/env python

import sys
import hashlib
from itertools import permutations

answer = "6c7f4d49729e58d7a458999b570e0151bc034ca7"
itr = permutations("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",4)

for i in itr:
  password  = "".join(map(str,i))
  hash = hashlib.sha1(hashlib.md5(password).hexdigest()).hexdigest()
  if hash == answer:
    print password
    sys.exit(0)

print "Not found."
sys.exit(1)

実行結果

$ time python 20160802_TMCTF_defence100.py

h4ck

real    1m39.699s
user    0m38.926s
sys     0m0.106s
  • ShellScript - 総当り
#!/bin/bash

python permutations.py 4 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ > list.txt

MAX=`cat list.txt|wc -l`
I="0"

while read WORD
do
  HASH=`echo -n $WORD |md5sum |awk '{print $1}'|tr -d '\n'|sha1sum|awk '{print $1}'`
  if [ "$HASH" = "6c7f4d49729e58d7a458999b570e0151bc034ca7" ]
  then
    echo $WORD
    exit 0
  fi
  #I=$((I + 1))
  #printf "%d/%d\r" "$I" "$MAX"
done < list.txt

echo "Not found."
exit 1

順列の算出(総当りの元)は、やむを得ずPythonスクリプトを使った。
egzactが使えたかもしれない。

permutations.py

#!/usr/bin/env python

import sys
from itertools import permutations

itr = permutations(sys.argv[2],int(sys.argv[1]))

for i in itr:
  print "".join(map(str,i))

実行結果

$ time solv.sh
h4ck
6894.03user 13979.57system 26:07:07elapsed 22%CPU (0avgtext+0avgdata 1464maxresident)k
35744inputs+8outputs (78major+8601248019minor)pagefaults 0swaps

なんか26時間程かかっていた模様。実用に耐えないなw

余談(md5sum,sha1sumコマンドのハマり所)

普段何気なくシェル芸してハッシュ値を確認するんだけど、 ハッシュした値を更にハッシュする は、やった経験がなくて、微妙にハマった。

  • ハマった理由
■ダメな理由
$ echo -n h4ck |md5sum 
0ed5f1f056b1d96122afaae306d3dd65  -
                                ^^^
                                邪魔!

ゆえに、単純にパイプして出力すると期待したハッシュ値が得られない

■NG
$ echo -n h4ck |md5sum |sha1sum 
7265ca1966827b7cda1e61183cee77996aeca50d  -
■OK
$ echo -n h4ck |md5sum |awk '{print $1}'|tr -d '\n'|sha1sum 
6c7f4d49729e58d7a458999b570e0151bc034ca7  -

整理すると以下になる。ハッシュ値以外の余計なものを出力するやつは、途中にパイプを挟んでハイフンやら改行やらの削除が必要。

  • PHPの実行結果
$ cat md5.php 
<?php
$ans = md5($argv[1]);
echo $ans;
?>
$ php md5.php h4ck
0ed5f1f056b1d96122afaae306d3dd65
$ cat sha1.php 
<?php
$ans = sha1($argv[1]);
echo $ans;
?>
$ php sha1.php h4ck
e17e98788d6b4ac922b2df100ef9398ae0f229ad
$ cat md5_sha1.php 
<?php
$ans = sha1(md5($argv[1]));
echo $ans;
?>
$ php md5_sha1.php h4ck
6c7f4d49729e58d7a458999b570e0151bc034ca7
  • KaliLinuxでの実行結果

KaliLinuxには、md5deep,sha1deepというコマンドがあった。違いは知らん。ただ、語尾のハイフンが付いていない。

$ echo -n h4ck |md5sum
0ed5f1f056b1d96122afaae306d3dd65  -
$ echo -n h4ck |md5deep 
0ed5f1f056b1d96122afaae306d3dd65
$ echo -n h4ck |sha1deep 
e17e98788d6b4ac922b2df100ef9398ae0f229ad
$ echo -n h4ck |sha1sum 
e17e98788d6b4ac922b2df100ef9398ae0f229ad  -
$ echo -n h4ck |md5sum |awk '{print $1}'|tr -d '\n'|sha1sum 
6c7f4d49729e58d7a458999b570e0151bc034ca7  -
$ echo -n h4ck |md5deep |tr -d '\n'|sha1deep 
6c7f4d49729e58d7a458999b570e0151bc034ca7
  • CentOSでの実行結果

CentOSに md5deep,sha1deep というコマンドは無い。

$ echo -n h4ck |md5sum 
0ed5f1f056b1d96122afaae306d3dd65  -
$ echo -n h4ck |sha1sum 
e17e98788d6b4ac922b2df100ef9398ae0f229ad  -
$ echo -n h4ck |md5sum |awk '{print $1}'|tr -d '\n'|sha1sum 
6c7f4d49729e58d7a458999b570e0151bc034ca7  -

SCADA 100

Setup a free account on Shodan.io. 
Somewhere on the Class C network xxx.xxx.x.1-255 you will find a suspicious looking Gas Station.

Without directly interacting with the server (it will be offline during the qualifier),
but only using what Shodan has found for you - attempt to determine the flag

※ipアドレス xxx.xxx.x.1-255は、なんか迷惑がかかってもいけないので、伏せました。

Shodan先生を使った調査作業ですね。
こいつは結局最後まで解けなくて、そして、これに最も時間を費やしたw
解けそうで解けなかった。もどかしかった。。

問題の意図を確認

Setup a free account on Shodan.io.

Shodanのフリーアカウントを作りなさい

Somewhere on the Class C network xxx.xxx.x.1-255 you will find a suspicious looking Gas Station.

ガソリンスタンドのIPアドレスが xxx.xxx.x.1-255 にあるから、見つけなさい

Without directly interacting with the server (it will be offline during the qualifier),

発見したIPアドレスに接続は不要(どのみちオフラインだよ)

but only using what Shodan has found for you - attempt to determine the flag

Shodanだけ使ってflagを発見するのです!

なぜフリーアカウントを作るのか

フリーアカウントを作れという事は、アカウントがないと使えない機能があるということでしょう。

登録ページに Developer API が使えるっぽい事が書いてあるので、それを利用するんだなと予想しました。

ちなみに、①登録→②メールが来る→③メールにあるアドレスにアクセス→④ログインできるようになる。
んだけど、②のメールが迷惑メールフォルダに入ってて、気づかなくてハマった。

チームメンバが怪しいIPを発見してくれる

さっそく見つけてくれました。便宜上、ここでは xxx.xxx.x.189 としておきます。

得られた情報は、こんな感じ。

5900
tcp
http-simple
 RFB 003.007
authentication disabled

20160730_tmctf_scada100.jpg

10001
tcp
automated-tank-gauge
 I20100
07/20/2016 23:38

TMCTF FUEL STATION
Yubinbango151-0053
Mines Tower
Shinjuku

IN-TANK INVENTORY

TANK PRODUCT             VOLUME TC VOLUME   ULLAGE   HEIGHT    WATER     TEMP
  1  TMTANK1               3538      3647     7695    37.57     9.52    51.42
  2  TMTANK1               8902      9068     9781    73.94     9.17    59.27
  3  TMTANK3               8478      8614     3081    26.52     3.60    52.58
  4  TMTANK4               7552      7642     3081    55.77     6.51    50.54

スクリーンショットに怪しい値 "00 00 17 15 08 30 74 15 1e 12 0d 0f 0c 4e" が見えます。

ハマりポイント

さてさて、ログイン無しで得られる情報は、ここまでのようです。
さっそく Developer API を使ってみましょう。フリーアカウントを作ると、APIキーが発行されます。

ここでは便宜上 {SHODAN_API_KEY} と表現することにします。
Developer APIを使う時、APIキーが必要になります。

使える言語は、以下

SHODAN DEVELOPER Clients/ Libraries
https://developer.shodan.io/api/clients

RubyやPythonも使えますが、自分的には一番楽なRESTを使います。
RESTだったら、ブラウザか、curlコマンド一発で出ますし。おすし。

以下の使い方をみて、コーディング。
1行で書けるのは気持ちがいい。

SHODAN DEVELOPER REST API Documentation
https://developer.shodan.io/api

こんな感じ。jqを通しているのは、受信したJSONを整形したいので。

$ curl https://api.shodan.io/shodan/host/xxx.xxx.x.189?key={SHODAN_API_KEY}&history=true | jq .

これで、過去5回分ぐらいのスキャン結果が得られました!
これを舐めまわすように調べます。執拗に調べます。スクリーンショットにあった謎の数値も関係あるのでしょう。そこも意識して。

結果。

20160730_tmctf_seika.jpg

何の成果も得られませんでした。
キース隊長ばりにハゲるかと思った。

唐突に見つける別のIP

もぅ何も見つけられなくて、ぼんやりしながら、
そう言えば、このガソリンスタンドは TMCTF FUEL STATION って言うんだな、ふーん。

って、横になりながら
"TMCTF FUEL STATION" をShodanで検索してみると、別のIP(便宜上 yy.yyy.yyy.yy とします)が出た。

あれ・・・

Somewhere on the Class C network xxx.xxx.x.1-255 you will find a suspicious looking Gas Station.

ガソリンスタンドのIPアドレスが xxx.xxx.x.1-255 にあるから、見つけなさい

xxx.xxx.x.1-255の範囲じゃないのかww

こんな結果が出る!怪しい!怪しいぞ!

5353
udp
mdns
 \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
10001
tcp
automated-tank-gauge
 I20100
07/11/2016 17:39

TMCTF FUEL STATION
Yubinbango151-0053
Mines Tower
Shinjuku



IN-TANK INVENTORY

TANK PRODUCT             VOLUME TC VOLUME   ULLAGE   HEIGHT    WATER     TEMP
  1  TMTANK1               9035      9136     6367    41.96     8.56    58.70
  2  TMTANK1               4312      4500     9107    62.78     4.42    59.44
  3  TMTANK3               7537      7689     3670    53.21     5.15    52.79
  4  TMTANK4               6454      6505     3670    28.29     9.14    54.19

なんだこのexploit的なコードが怪しい。

さぁもう一度 DEVELOPER API

DEVELOPER API を使って再度情報を取得

こんな感じ。さっきとやり方は同じ。

$ curl https://api.shodan.io/shodan/host/yy.yyy.yyy.yy?key={SHODAN_API_KEY}&history=true | jq .

すると。。
いっぱい情報ががが!

怪しいとろこを抜き出すと以下の通り

  "vulns": [
    "!CVE-2014-0160",
    "!CVE-2014-0160",
    "!CVE-2014-0160",

CVE-2014-0160は、懐かしのHeartbleedの脆弱性!

      "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",

SIZE 10240000 …でかいサイズを要求し、Hearbleedの脆弱性を利用して鍵情報の流出を狙っているんじゃないだろうか。

      "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",
      "ssh": {
        "fingerprint": "ae:89:cd:05:90:4d:ec:56:9b:b9:f1:41:28:24:e3:77",
        "mac": "hmac-sha2-256",
        "cipher": "aes128-ctr",
        "key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQC4HCDyPMoybg5G+Tk7z84msC+BovKHFmdZduUXX+T1WwRw\nb51AWsXrbHnoCWvhWj1KJNkhzIQ4p1y3/TDpRCuCcUr+iMialVlJj8vkHMBCpbqnNe2NprMmvFdN\nL7PXtwfvCOIJKABalT/QgQ23RBsDlXomWP8ja+Bb5kRdJh18zRb5b3bZEyq52F5Uq//plH4Hx8Yd\n5WeuyxlsltO51ZhZBDunRRycYoV2exgpZX2o5oChPvEKwjwlwDV5VRN/JKl82Cdf23ekMDOrc7bN\nk9E8RycGAkDbIbHS/6mYxB62eRp+25g69IIIBnbRsaffl+UmzudvEVixzxLn+MNJ5hpJ\n",
        "kex": {
          "languages": [
            ""
          ],
          "server_host_key_algorithms": [
            "ssh-rsa",
            "ssh-dss",
            "ecdsa-sha2-nistp256",
            "ssh-ed25519"
          ],
          "encryption_algorithms": [
            "aes128-ctr",
            "aes192-ctr",
            "aes256-ctr",
            "arcfour256",
            "arcfour128",
            "aes128-gcm@openssh.com",
            "aes256-gcm@openssh.com",
            "chacha20-poly1305@openssh.com",
            "aes128-cbc",
            "3des-cbc",
            "blowfish-cbc",
            "cast128-cbc",
            "aes192-cbc",
            "aes256-cbc",
            "arcfour",
            "rijndael-cbc@lysator.liu.se"
          ],
          "kex_follows": false,
          "unused": 0,
          "kex_algorithms": [
            "curve25519-sha256@libssh.org",
            "ecdh-sha2-nistp256",
            "ecdh-sha2-nistp384",
            "ecdh-sha2-nistp521",
            "diffie-hellman-group-exchange-sha256",
            "diffie-hellman-group-exchange-sha1",
            "diffie-hellman-group14-sha1",
            "diffie-hellman-group1-sha1"
          ],
          "compression_algorithms": [
            "none",
            "zlib@openssh.com"
          ],
          "mac_algorithms": [
            "hmac-md5-etm@openssh.com",
            "hmac-sha1-etm@openssh.com",
            "umac-64-etm@openssh.com",
            "umac-128-etm@openssh.com",
            "hmac-sha2-256-etm@openssh.com",
            "hmac-sha2-512-etm@openssh.com",
            "hmac-ripemd160-etm@openssh.com",
            "hmac-sha1-96-etm@openssh.com",
            "hmac-md5-96-etm@openssh.com",
            "hmac-md5",
            "hmac-sha1",
            "umac-64@openssh.com",
            "umac-128@openssh.com",
            "hmac-sha2-256",
            "hmac-sha2-512",
            "hmac-ripemd160",
            "hmac-ripemd160@openssh.com",
            "hmac-sha1-96",
            "hmac-md5-96"
          ]
        },
        "type": "ssh-rsa"
      }

鍵情報が出ちゃってるんじゃないだろうかw

あと、こういう怪しそうな情報が散見される。

      "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",
      "data": "\\x03\\x00\\x00\\x0b\\x06\\xd0\\x00\\x00\\x00\\x00\\x00",
        "raw": "000084000001000200000000095f7365727669636573075f646e732d7364045f756470056c6f63616c00000c0001c00c000c00010000000a00140c5f776f726b73746174696f6e045f746370c023c00c000c00010000000a000e0b5f756469736b732d737368c047"

この鍵は・・・なんだ・・・?で、時間切れ

さて、この鍵、Base64形式だね。

間に \n が入っているので注意

AAAAB3NzaC1yc2EAAAADAQABAAABAQC4HCDyPMoybg5G+Tk7z84msC+BovKHFmdZduUXX+T1WwRw\nb51AWsXrbHnoCWvhWj1KJNkhzIQ4p1y3/TDpRCuCcUr+iMialVlJj8vkHMBCpbqnNe2NprMmvFdN\nL7PXtwfvCOIJKABalT/QgQ23RBsDlXomWP8ja+Bb5kRdJh18zRb5b3bZEyq52F5Uq//plH4Hx8Yd\n5WeuyxlsltO51ZhZBDunRRycYoV2exgpZX2o5oChPvEKwjwlwDV5VRN/JKl82Cdf23ekMDOrc7bN\nk9E8RycGAkDbIbHS/6mYxB62eRp+25g69IIIBnbRsaffl+UmzudvEVixzxLn+MNJ5hpJ\n

Base64形式だったので、デコードしてダンプみる。

$ xxd key.bin 
0000000: 0000 0007 7373 682d 7273 6100 0000 0301  ....ssh-rsa.....
0000010: 0001 0000 0101 00b8 1c20 f23c ca32 6e0e  ......... .<.2n.
0000020: 46f9 393b cfce 26b0 2f81 a2f2 8716 6759  F.9;..&./.....gY
0000030: 76e5 175f e4f5 5b04 706f 9d40 5ac5 eb6c  v.._..[.po.@Z..l
0000040: 79e8 096b e15a 3d4a 24d9 21cc 8438 a75c  y..k.Z=J$.!..8.\
0000050: b7fd 30e9 442b 8271 4afe 88c8 9a95 5949  ..0.D+.qJ.....YI
0000060: 8fcb e41c c042 a5ba a735 ed8d a6b3 26bc  .....B...5....&.
0000070: 574d 2fb3 d7b7 07ef 08e2 0928 005a 953f  WM/........(.Z.?
0000080: d081 0db7 441b 0395 7a26 58ff 236b e05b  ....D...z&X.#k.[
0000090: e644 5d26 1d7c cd16 f96f 76d9 132a b9d8  .D]&.|...ov..*..
00000a0: 5e54 abff e994 7e07 c7c6 1de5 67ae cb19  ^T....~.....g...
00000b0: 6c96 d3b9 d598 5904 3ba7 451c 9c62 8576  l.....Y.;.E..b.v
00000c0: 7b18 2965 7da8 e680 a13e f10a c23c 25c0  {.)e}....>...<%.
00000d0: 3579 5513 7f24 a97c d827 5fdb 77a4 3033  5yU..$.|.'_.w.03
00000e0: ab73 b6cd 93d1 3c47 2706 0240 db21 b1d2  .s....<G'..@.!..
00000f0: ffa9 98c4 1eb6 791a 7edb 983a f482 0806  ......y.~..:....
0000100: 76d1 b1a7 df97 e526 cee7 6f11 58b1 cf12  v......&..o.X...
0000110: e7f8 c349 e61a 49     

ん?んん・・・これpem形式じゃないし・・・なんの形式かしら?どうやって使うのかしら?
と、調べている間に時間切れ・・・

OpenSSH形式の鍵フォーマットなんじゃないかな。というあたりまでは解った。

どう使うかあたりは、もっと調査が必要だったと思われ。
以下が参考になるんじゃないかな(まだちゃんと見てないけど)。

Signing data with ssh-agent
http://blog.oddbit.com/2011/05/09/signing-data-with-ssh-agent/

Converting OpenSSH public keys
http://blog.oddbit.com/2011/05/08/converting-openssh-public-keys/

こうやって解くんじゃない?

実はこのスクリーンショットの怪しい数字

20160730_tmctf_scada100.jpg

00 00 17 15 08 30 74 15 1e 12 0d 0f 0c 4e

これを前述の鍵で複合すればflagなんでしょ!?

も、もぅ、知ってるんだからねっ(*/ω\*)

誰か続きを頼む

あともうちょっとだと思うんだけどな~

こ、これ本当に100点なのかw
こいつはアレだ。。競技時間は終わったけど、調査は続けられるハズ。
誰か解いて教えてくれ。。

答えがわかった

2016.8.6 追記

Trend Micro CTF 2016 Online Qualifier | #Scada | SCADA 100 Points
https://www.youtube.com/watch?v=YyHbJDmSQWc

なんとも言えないこの徒労感。このエスパー感がたまらない。

00 00 17 15 08 30 74 15 1e 12 0d 0f 0c 4e と TMTANK3TMTANK3 で xor

$ cat solv.sh 
#!/bin/bash

printf "%b" $(printf '%s%x' '\x' $((0x54 ^ 0x00)))
printf "%b" $(printf '%s%x' '\x' $((0x4d ^ 0x00)))
printf "%b" $(printf '%s%x' '\x' $((0x54 ^ 0x17)))
printf "%b" $(printf '%s%x' '\x' $((0x41 ^ 0x15)))
printf "%b" $(printf '%s%x' '\x' $((0x4e ^ 0x08)))
printf "%b" $(printf '%s%x' '\x' $((0x4b ^ 0x30)))
printf "%b" $(printf '%s%x' '\x' $((0x33 ^ 0x74)))
printf "%b" $(printf '%s%x' '\x' $((0x54 ^ 0x15)))
printf "%b" $(printf '%s%x' '\x' $((0x4d ^ 0x1e)))
printf "%b" $(printf '%s%x' '\x' $((0x54 ^ 0x12)))
printf "%b" $(printf '%s%x' '\x' $((0x41 ^ 0x0d)))
printf "%b" $(printf '%s%x' '\x' $((0x4e ^ 0x0f)))
printf "%b" $(printf '%s%x' '\x' $((0x4b ^ 0x0c)))
printf "%b" $(printf '%s%x' '\x' $((0x33 ^ 0x4e)))

$ ./solv.sh 
TMCTF{GASFLAG}

20160730_tmctf_seika.jpg - 何の成果も!!得られませんでした!! (4.88 KB) kanata, 08/01/2016 08:51 PM

20160730_tmctf_scada100.jpg - SCADA100 (21.2 KB) kanata, 08/02/2016 08:32 PM

Add picture from clipboard (Maximum size: 100 MB)