News

Trend Micro CTF 2016 Writeup

Added by kanata about 5 years ago

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}

Open Source unConference 2016 Chiba を賑やかしに行きました

Added by kanata about 5 years ago

Open Source unConference 2016 Chiba を賑やかしに行きました!

Open Source unConference 2016 Chiba (2016/07/23 15:00〜)

飲食物が出ます!
ビールを飲みながらのLTは最高ですな~。

印象に残った面白そうな話

不正アクセスを検出して、iptablesにアクセス禁止を加えるというfail2banを参考に、に更にIPv6に対応したもの。イカス。

どんな話が繰り広げられているのか気になったw
車の話とか、女子トイレの話とか、あと、女子トイレの話とか

20160723_OSunC.jpg

katagaitai CTF勉強会#5 - 関東|med に参加してきました

Added by kanata over 5 years ago

5周年、おめでとうございます。今回も良い勉強会でございました。

katagaitai CTF勉強会 #5 - 関東|med : ATND

場所は安定の、人員の許容量が宇宙ヤバい秋葉原UDXで開催。広い。
途中、スピーカーへの音声インジェクション(混線とも言う)でpwnされるというハプニングがあって笑った。

trmrさんの部

スライド中でご紹介頂き、ありがとうございます~。

ハッシュ面白い~。
MD5をもう使うなって件は、単にハッシュ値が短くて、衝突しやすいから使うのやめようって話だと、ずっと思ってた。
実は総当りよりも遥かに少ない回数で衝突させることが出来るとは、ちょっと衝撃でした。
ツール(HashPump,FastColl,HashClash)も幾つか教えて頂いたので試してみようかと思っています。

暗号学の偉人伝は、実はかなり面白かった。
レトロハッカーズを思い出した。

bataさんの部

私が今一番知りたかったヒープの話があって、良かった。ありえん良さみが深かった。
たぶん、初めて参加した1年ぐらい前だと全然理解できなかったと思うんですが、今はお話が解るようになりました。
わ、私にも解かる、解かるぞ!(問題が解けるとは言っていない)

「全ての複雑なものは、単純なものの組み合わせで出来ている」

っていう私の好きな言葉があるんですが(誰が言ったか覚えていない)、今回まさにそれでした。ただ、、複雑過ぎて笑った。

個々の単純な部分まで分解して、説明して貰ったので、とても解りやすかったです。

発表したスライドは、後々slideshareで公開されるようなので、参加しなかった方も乞うご期待!!

ま、それが組み合わさって、解答に辿り着くまでの道筋は、なんというか、常軌を逸していたけれどw

ほんと、こんな問題よく作ったな。。。そしてよく解いたな。。。

ヒープについては、自分の勉強ノートに書けていないのですが、整理して書く良いきっかけになりました。

延長戦でのDWARFの話も大変興味深かったです。

20160716_katagaitaiCTF.jpg

頂きもの

ノートとペンを頂きました。ありがてぇ・・・ありがてぇ・・・

ノートはCamiApp対応で重宝しそう。
スマホで写してDropBoxへ転送。。捗る。

このペン実は、前回も前々回も頂いているんですが、隠れた高性能っぷりを発揮しておりまして、
普通の貰い物ボールペンは、途中でよくインク出なくなって終了したりするんですが、これはインク切れが無いんですよ!!
日々愛用させて頂いております。

20160716_katagaitaiCTF_NRIsecure.jpg

Trend Micro CTF 2016 (1 comment)

Added by kanata over 5 years ago

今年も
/attachments/download/106/20150715_aa.jpg

セキュリティ技術の競技大会「Trend Micro CTF 2016」を開催
~全世界の技術者が、IoTや制御システム関連のセキュリティ技術を競う~
http://www.trendmicro.co.jp/jp/about-us/press-releases/articles/20160701042341.html

Trend Micro CTF 2016
http://www.trendmicro.co.jp/jp/sp/ctf2016_jp/index.html

Trend Micro CTF 2016

しかしkatagaitai勉強会#6 - 関東|easyと被ってしまってるぅぅぅぅ。
うわぁああぁぁぁあああああああああああああああああ

katagaitai勉強会#6 - 関東|easy : ATND

シェル芸人のためのJupyter環境

Added by kanata over 5 years ago

Jupyter

シェル芸人のためのJupyter環境を構築しよう!!!11

スクリーンショット

screenshot1.png

Jupyterとは

スクリーンショットをご覧あれ。ブラウザでPython(Bashも)を実行出来る環境です。

  • Markdown形式のメモと一緒にWeb上で実行&保存できちゃうステキ機能
  • 書いた物は保存できて、いつでも再実行可。
  • スライドやhtmlにも変換できます。
  • GitHub Gistにエクスポートすれば、公開もできちゃう。

まさにPythonista(シェル芸人)のための環境ですねw

噂の買い切りVPSCloudAtCostに導入してみてもいいかもしれない。

Jupyter環境の構築

ググると幾つか出てきますが、minicondaを使用したインストール方法を以下にまとめます。

minicondaを利用する利点としては、こんな感じです。

  • 一般ユーザの環境に導入できる(システムに深く食い込まないので、アンインストールが簡単)
  • 既存のPython環境と別々に作ることができ、かつ、お互いに干渉しない環境が簡単に作れる
  • 容量がanacondaより小さく、必要最小限。

minicondaは、主にPythonの数値処理系のライブラリを加えたanacondaというものの最小のセットになります。

想定する環境

以下を想定しています

  • CentOS または RedHatLinux

実際にセットアップした環境は以下です。

CentOS Linux release 7.2.1511 (Core) 

minicondaのインストール

以下からセットアップ用のファイルをダウンロードします。
python3用のセットアップファイルをダウンロードしてください。

miniconda
http://conda.pydata.org/miniconda.html

$ wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh

余談ですけど、このシェルスクリプト、バイナリファイルと悪魔合体する黒魔術を使っているので、catしてみたりすると大変な事になりますw

実行。
途中、対話形式で入力を求められますが、以下のよう入力してください。

$ bash Miniconda3-latest-Linux-x86_64.sh
[Enter]
yes
[Enter] # or 任意のインストール先を入力
no      # システムに標準で入っているPython環境と使い分けをしたいため。.bashrcに追加されてもいい人は yes にしておく。

インストール時にnoを選択して .bashrc に追加しなかったので、以下の通り、任意に環境変数をセットするシェルスクリプトを作成しておきます。
これによって、こんな環境の切り替えができます。

  • 通常は、システムに入っているPythonが使われる。
  • このシェルスクリプトを実行して環境変数を取り込んだときだけ、miniconda環境が使われる。

環境変数(PATH)設定用のシェルスクリプトを作る。

$ vi setenv.sh
#!/bin/bash

PATH=[minicondaのインストールディレクトリ]/miniconda3/bin:$PATH
export PATH

ドット実行する。
環境変数PATHの先頭に[minicondaのインストールディレクトリ]/bin が含まれていることを確認する。

$ . setenv.sh
$ env |grep PATH
PATH=[minicondaのインストールディレクトリ]/miniconda3/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

Jupyterのインストール(minicondaインストール先にインストールされる)

$ conda install jupyter

Jupyter設定ファイルの生成。

$ jupyter notebook --generate-config

パスワードの作成(結果をメモしておく)

以下はパスワードを hoge にしているけど、適宜変更してね。

$ python
Python 3.5.1 |Continuum Analytics, Inc.| (default, Dec  7 2015, 11:16:01) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from notebook.auth import passwd
>>> passwd()
Enter password: hoge
Verify password: hoge
'sha1:86a104de86a2:d3f296d042d0be7c38df963b01670e51dd2ab081'
>>> quit()

Jupyter設定ファイルの編集

  1. ローカルホストからしか接続を認めない→どこからでもOKに修正
  2. Jupyterで書いたファイルの保存先を指定
  3. 認証パスワードを設定(上記Pythonのpasswd()の事項結果をコピペ)
  4. 接続先ポート番号を指定(デフォルトは8888)
$ cd ~/.jupyter
$ vi jupyter_notebook_config.py

- # c.NotebookApp.ip = 'localhost'
+ c.NotebookApp.ip = '*'

- # c.NotebookApp.notebook_dir = u''
+ c.NotebookApp.notebook_dir = u'ファイルを保存する任意のディレクトリ'

- # c.NotebookApp.password = u''
+ c.NotebookApp.password = u'sha1:86a104de86a2:d3f296d042d0be7c38df963b01670e51dd2ab081'

- # c.NotebookApp.port = 8888
+ c.NotebookApp.port = 8883

httpsて通信するための設定

  • Let's Encrypt サーバー証明書を取得しましょう。
  • 詳細は、ServersManの Let's Encrypt サーバー証明書の取得と自動更新設定 を参照のこと。
  • 証明書が準備できたら、Jupyter設定ファイルの編集します。
  1. サーバ証明書の所在を設定
  2. 秘密鍵の所在を設定
$ cd ~/.jupyter
$ vi jupyter_notebook_config.py

- # c.NotebookApp.certfile = u''
+ c.NotebookApp.certfile = u'/etc/letsencrypt/live/<ドメイン名>/cert.pem'

- # c.NotebookApp.keyfile = u''
+ c.NotebookApp.keyfile = u'/etc/letsencrypt/live/<ドメイン名>/privkey.pem'

Jupyterに Bash のJupyterカーネルを導入する

Jupyterカーネルと呼ばれる以下を追加インストールすることで、
Bash版Jupyterになるのでありえん良さみが深い(Python3環境が前提、Python2だどダメ)。

A bash kernel for IPython
https://github.com/takluyver/bash_kernel

$ . setenv.sh
$ pip install bash_kernel
$ python -m bash_kernel.install

実は、他のいろんな言語も用意されているので、大半の言語はJupyter上で動かす事ができる。

参考:IPython kernels for other languages

Jupyterの起動

起動

$ jupyter-notebook

後はブラウザで、https://example.com:8883 にアクセスするべし。

minicondaでPython2環境も作って共存させる場合

同じ方法でpython2環境も起動できる。
ただし、python3とpython2のJupyter環境を同時に起動するには、
Jupyter設定ファイルのポート番号を別々にする必要がある

$ vi jupyter_notebook_config_for_python2.py

- # c.NotebookApp.port = 8888
+ c.NotebookApp.port = 8882 # python3の設定値とは別にする

起動は、作った設定ファイルを直接指定して起動できる。

$ jupyter-notebook --config=設定ファイルのパス

使い方

使い方はググると沢山出てくるので、そちらに譲ります。
(当ページ下部のMemoの所にもリンクを入れておきました)

シェル芸人のためのJupyterの使い方を説明します。

シェル芸人のためのJupyter使い方

まず、デフォルトのPythonカーネルでもシェル芸はできます。
行頭に%%bashと入力すればシェルを実行できます。

%%bash
date;echo hoge;date

screenshot2.png

ただ、カーネルを Bash に切り替えることで、この%%bashが不要になります。
あとは……わかるね?

date;echo hoge;date

screenshot3.png

Memo

Jupyter関連で役立ちそうなリンクのメモ。

Jupyter (iPython) Notebookを使って技術ノート環境を構築する方法 - MyEnigma
http://myenigma.hatenablog.com/entry/2016/02/20/183423

Jupyter (iPython) Notebookを使って技術ノート環境を構築する方法 - MyEnigma

Jupyter (iPython) Notebookを使ってプレゼンテーション資料を作る方法 - MyEnigma
http://myenigma.hatenablog.com/entry/2016/05/22/160209

Jupyter (iPython) Notebookを使ってプレゼンテーション資料を作る方法 - MyEnigma


Qiita

Jupyter事始め - Qiita
http://qiita.com/taka4sato/items/2c3397ff34c440044978

extensionを追加してもっと快適なJupyter環境を構築する - Qiita
http://qiita.com/sasaki77/items/30a19d2be7d94116b237

Condaで作ってる仮想環境の切り替えをJupyter上で簡単に行う方法 - Qiita
http://qiita.com/yoppe/items/38005f415a5b8b884c7d

Jupyter Notebookでブログ書きたい - Qiita
http://qiita.com/patraqushe/items/49a990cbdfb51afed620

Jupyter notebook で HTML も自動作成 - Qiita
http://qiita.com/junkoda/items/011d44dcc1c8bd0a936a

Jupyterでコンテナーを入れ子の枠で表現(図式化)、とそれを作る過程で調べたこと - Qiita
http://qiita.com/argius/items/17710321c8225bfb7417

Jupyterで好きなHTMLを埋め込む - Qiita
http://qiita.com/xeno1991/items/65b7da476d6f89d06388

Qiitaの記事とJupyter notebokとの相互変換 - Qiita
http://qiita.com/Tsutomu-KKE@github/items/168400d2e3ea44a70022

iPython でスライド作り - Qiita
http://qiita.com/sosuke/items/e42b5b81878e361249b6

junpyter notebookをCUIで実行&保存 - Qiita
http://qiita.com/nzw0301/items/83814189bd93224b7c51

nbviewerでスライド表示もできるようになった!【Jupyter】 - Qiita
http://qiita.com/ssh0/items/de6cc6aacd004a2e57dd

データサイエンティストに向けたコーディング環境Jupyter Notebookの勧め - Qiita
http://qiita.com/y__sama/items/17aedf0c05187edd61c3


nbviewer - A simple way to share Jupyter Notebooks
http://nbviewer.jupyter.org/

once upon a time, - JupyterからSpark clusterを操作できるlivy + sparkmagicを試してみた
http://chezou.hatenablog.com/entry/2016/07/12/115000

Jupyter Notebook の Tips をまとめてみた
https://adtech.cyberagent.io/techblog/archives/2317

技術書典に行ってキマシタワー

Added by kanata over 5 years ago

技術書典に行ってきました。

技術書典:技術書オンリーイベント

技術書の同人誌販売な感じのイベント。

小生、コミケとかそういうの行ったことがないのだけれど、初めてそれっぽいイベントに行ってきました。早めに行ったから早めに入れたんだけど、めっちゃ並んでた。

20160625_techbookfest1.jpg

初めて薄い本を買いました

めっちゃ人いる!これがコミケか…

以下を買いました。読むのが楽しみ。

O'Creilly - ソフトウェア技術書同人サークル supported by NCC

  • KIJAK'SAY(きじゃくせい)

セキュリティ関係の本(うっすら変態仮・・・げふんげふん)

20160625_techbookfest2.jpg

秋葉原は、ありえん肉みが深い。

久しぶりに秋葉原に来たら、肉度がかなり上がっている。

とんかつ - 商店 - ケバブ - 商店 - ラーメン - 商店

という感じである。異常事態である。何が起きたんだ。その中で会場にほど近い肉汁麺ススムに行ってきました。

味が濃いのだけれど癖になる。これでレベル2(レベル4まである)ありえん肉みが深い。完飲。

20160625_niku.jpg

「シチズンフォー スノーデンの暴露」を見てきました (1 comment)

Added by kanata over 5 years ago

シチズンフォー スノーデンの暴露というエドワード・スノーデンを題材にしたドキュメンタリーを見てきました!

映画「シチズンフォー スノーデンの暴露」

ここの記事を事前に読んでおくと更に楽しめます。

THE ZERO/ONE - 正義の告発者か買収されたスパイか スノーデンの素顔に迫るドキュメンタリー映画『シチズンフォー スノーデンの暴露』

正義の告発者か買収されたスパイか スノーデンの素顔に迫るドキュメンタリー映画『シチズンフォー スノーデンの暴露』
https://the01.jp/p0002479/

THE ZERO/ONE - ハッカーの系譜 エドワード・スノーデン

米国で繰り返される「諜報」と「内部告発」の歴史(1/6)
https://the01.jp/p0001924/

米諜報機関が生んだハッカーの葛藤(2/6)
https://the01.jp/p0001950/

闇に葬られないための入念な「告発準備」(3/6)
https://the01.jp/p0001968/

世界に衝撃を与えた米国の盗聴プログラム「プリズム」(4/6)
https://the01.jp/p0001998/

「世紀の告発者」への第一歩を踏み出す(5/6)
https://the01.jp/p0002027/

香港からの脱出、そしてロシアへ(6/6)
https://the01.jp/p0002038/

THE ZERO/ONE - ハッカーの系譜 ジュリアン・アサンジ

ウィキリークス「反骨」の原風景(1/6)
https://the01.jp/p0002395/

少年ハッカー「メンダックス」の冒険(2/6)
https://the01.jp/p0002414/

サイファーパンクスとの出会い(3/6)
https://the01.jp/p0002449/

少年ハッカーから国家と戦うハクティビストに(4/6)
https://the01.jp/p0002464/

※連載中(2016.6.18現在)

いちエンジニアとしての感想

当初より、エドワード・スノーデンさんのリークした情報の真偽が疑われたりしています。
また、現在に至るまで名だたるIT関連企業は、関与した事実を認めていません。

映画はドキュメンタリーでしたので、エドワード・スノーデンさん自身が、ものすごく、ものすご~く、情報の取り扱いに気を使っていたのを生で見ることが出来ました。(VOIP電話のコード抜いたり、スマホを冷蔵庫に入れたり、全てPGPで暗号化したり)

さてさて、信じられないような情報が数々がリークされた訳ですが、いちエンジニアとして、その真偽について感想を述べたいと思います。

まず、

  • 技術的に矛盾した話は無かった。
  • ちょっと、大げさに情報漏えいを恐れていたようにも感じたが、(VOIP電話のコード抜いたり、スマホを冷蔵庫に入れたり)、技術的には盗聴が可能という側面と、自分の命がかかってるので解る。
  • 逆にそこまで気にしないといけないNSA怖い。

国家規模の盗聴に関して言うと、

  • 実現するには、国家規模で、ものすごいリソースの用意が必要。(特にディスクとメモリが。どの位必要なのか想像もできない。)
  • さらに、IT関連の複数の大企業の協力が必要(顧客のプライバシーを守ると声高に宣言している企業の協力が)。
  • さらに、国家間で秘密裏に協定を結んだり、もしくは勝手に他国へもネットワークを広げることが必要。

という、普通なら実現不可能に思えました。
特に、「IT関連の複数の大企業の協力が必要」というあたりは、CEOだけが墓場まで持って行けばよいという訳でもなくて、そんな工事・作業するのにも複数人の関係者が必要になります。彼らの口を全て塞ぐのは難しいんじゃないんですかね。まさか
でも、でも、もしかしたら国が本気出せばできるのかもしれません。。

2016.6.21追記
と、思ったんだけど次のコンボで特に疑われずにNSAは動けるね。コメント欄に書いたTEDの動画見て思った。
米国には裁判所の命令があれば、合法的に盗聴できる。→それを理由に盗聴する仕組みを各IT企業に作る。→(本当は裁判所の命令がないと盗聴できないけど)後は、勝手に盗聴する。

盗聴されると、どうなるのかしら

そんな訳で、国家規模で盗聴されていると仮定すると何がどうなるか想像してみます。

まず日常的に使っている検索エンジンやメール、ネットショッピングの内容が全て筒抜けになります。
普通に生活している分には、データ収集されても、あまり影響がないような気もしますが、技術的には改竄も可能なので、

  • 「検索語A」で検索したのに「検索語B」の結果が返ってきたり
  • メールに書いてある待合せ場所と時間を書き換えられたり
  • クレジットカードの番号を盗まれて勝手に買い物される

そんなリスクまで考えられます。国がやろうと思ったら、ですけど。

「自分ネットする時、絶対HTTPS(SSL/TLS)しか使わないんで大丈夫っすよ」
と思われる方もいるかもしれませんが、HTTPSは、みなさんのPCとサービスを提供する企業の入り口までを暗号化しているのであって、それ以降は筒抜けになります。ここから抜かれるとどうしようもありません。

                              ┏━━━━━━━━━━ IT企業のデータセンタ ━━━━━━━━━┓
                              ┃                                                            ┃
自分のPC(ブラウザ) <---------->[HTTPSをHTTPに複合する機能]<---------->[ロードバランサ等]<---┃
                       HTTPS  ┃                              HTTP                          ┃
                   暗号化して┗━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┛
                    安全な区間                                │
                                                   この区間で盗聴されると平文
                                      (普通の常識だとデータセンターの中なので、盗聴は無理)

個人でできる情報の秘匿 - PGPを使う

こんな情報筒抜けな世の中だとしても、誰にも内緒で情報を伝える手段は存在します。
エドワード・スノーデンさんも頻繁に使っておりましたが、公開鍵暗号方式で暗号化して送ればいいんですね。

映画ではPGPを使っておりました。
日常的に使うには、ちょっと面倒なんですが、届いた相手のPCでしか複合できない仕組みなので確実です。

余談ですが、PGPを使う際には鍵長は最大(恐らく2048bit)を設定しましょう。短い鍵長だと、計算能力が高いコンピュータで割り当てられてしまうかもしれません。ちなみに鍵破りコンテストが随時開催中で、640bitの鍵長までは破られています。

参考:MathWorld Headline News RSA-640 Factored

スノーデンさんの件に関しては、真偽についても賛否についても、ご意見ある方いらっしゃると思いますが、いちエンジニアとして技術的に大変興味深く拝見させて頂いた映画でした。

なんか書いてて怖くなってきた。
あれ、誰か来たみたい。

ニコナレで公開されているスライドをpdfでダウンロードするコマンド

Added by kanata over 5 years ago

niconare-dl

niconareは、2019年8月15日(木)をもってサービス終了とのことです。

niconareで公開されているスライドをpdfでダウンロードするコマンド

2019.2.18追記 ニコナレの仕様が変わちゃったので現状は動きません

Installation

ファイルダウンロードして実行権限をつけるだけ

$ wget https://raintrees.net/attachments/download/422/niconare-dl
$ chmod u+x ./niconare-dl

動作環境

x86_64のLinuxで動作すると思われます。

以下で、動作確認しました。

  • CentOS Linux release 7.2.1511 x86_64
  • Kali GNU/Linux 2.0 (sana) x86_64

Debian系だと、若干表示がおかしくなることもあるみたいだけど(゚ε゚)キニシナイ!!

Usage

$ ./niconare-dl [URL]

$ niconare-dl http://niconare.nicovideo.jp/watch/kn1275
initializing..
downloading.. 59 slides
converting.. 恐怖!シェルショッカーのPOSIX原理主義シェルスクリプト.pdf
complete
$ls
恐怖!シェルショッカーのPOSIX原理主義シェルスクリプト.pdf

URLは'(シングルコーテーション)で囲んでおいた方が無難。

URLの中に & が入っているとシェルがバックグラウンド実行の記号と解釈しちゃうので。。

Specification

一時作業領域として、コマンド実行中にカレントディレクトリに以下のディレクトリが作成されます。
コマンド実行後には、削除されます。

niconare-dl_temp_[プロセスID]

もし、なんらかの理由でこのディレクトリが残っていたら、不要ですので削除してかまいません。

注意事項

スライド形式はダウンロードできるんですが、動画形式(?)には対応していません。
許してつかぁさい。堪忍してつかぁさい。。

Background

何故作ったか

最近なんかSlide Share以外に、Speacker Deckニコナレを使う人が出てきたみたい。(Speaker Deckは標準でPDFダウンロード機能がある)

Slide ShareSpeacker Deckは、ダウンロードして、電車の中で読むというのをしておりまして。
ニコナレも・・・!と、思って気がついたら作ってた。

動的リンクの実行ファイルを静的リンクに変換する

Added by kanata over 5 years ago

statifierというのを使ってみました。

Statifier

経緯

とあるコマンドをインストールしようと思った・・・・が・・・・・ 駄目っ・・・・・!
パッケージの依存関係がすごい。つまり、1つコマンドを導入するのに、入れたくないパッケージを山のように入れなければならない。。

そのコマンド1つだけ実行したいだけなのに・・・

そこで思いつく悪魔の発想・・・っ!

fig2.png
fig1.png

1バイナリで動くようにすれば、他の環境に楽に持っていける。理論上は出来るはず・・・と思い、調べたら出てきた。

statifierというのを使えば可能であることがわかった。

ELF STATIFIER MAIN PAGE

メンテナンスはあまり活発ではないようだが、x86_64にも対応してくれているっぽい。

その他の案として、参照している動的リンクライブラリを全部洗い出してコピーし、LD_PRELOAD環境変数に突っ込んだ上で実行すればいけるかなぁ。とか、思ったんだけど、試してはいない。

概要

結局、なにがしたいかと言うと、

$ cat test.c 
#include <stdio.h>

int main(){
  printf("Helloworld");
  return 0;
}
$ gcc test.c 
$ ldd a.out 
        linux-vdso.so.1 =>  (0x00007fffc62d0000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f886214a000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f8862517000)

この単純なプログラムですら、3つの動的リンクライブラリを必要としている事がわかる。
このライブラリがシステムに存在しないと、プログラムは動かない。
だったら・・・プログラム(a.out)の中に、この3つの動的リンクライブラリを取り込んだらいいじゃない。
という発想。

Install

まず、自分はこのソフトのコンパイルのため、コンパイル用の仮想環境を用意した。
statifierを導入するために、依存関係となっている複数パッケージを導入する・・・のは本末転倒である。
コンパイル済みのものだけを目的の環境にコピーしてやればよいではないか。

という訳で、ここから最新版のtar.gzをダウンロードする。

自分が実施した時は、statifier-1.7.4.tar.gz でした。

適当なところに展開しておく。

$ tar xvfz statifier-1.7.4.tar.gz

コンパイル時に必要となるパッケージをインストール。

# yum install glibc.i686 glibc-devel.i686 libgcc.x86_64 libgcc.i686 

makeする。

$ cd xvfz statifier-1.7.4
$ bash ./configure
$ make

というのが、めんどうな方のために自分がコンパイルしたものをここに置いておく。

statifier-1.7.4_for_x86_64.tar.gz

実行環境について

さっそく動作確認してみる。
dateコマンドを静的リンクにしてみよう。

$ ldd /bin/date 
        linux-vdso.so.1 =>  (0x00007fff3432f000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f61fcf4f000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f61fd31c000)
$ cd statifier-1.7.4
$ setarch `uname -m` -R src/statifier.sh /bin/date /tmp/date2

これでstaticなdateコマンドが出来たはず。

$ setarch `uname -m` -R /tmp/date2
2016年  6月  5日 日曜日 17:30:56 JST
$ ldd /tmp/date2
        動的実行ファイルではありません

うん、たぶんうまく動いてるんだと思われる。

超注意:ASLRの怪

なんか、おまじないのようなコマンドがくっついているのが、おわかり頂けただろうか・・・

$ setarch `uname -m` -R

実は、これ、LinuxのASLRというセキュリティ機能を一時的に無効にするコマンドになります。
ASLRについては、ググるか、CTF_Pwnをみてね。
なんか、いろいろやってみたけど、動かなくてね~。

どうやら、「静的リンクの実行体に変換する時」と、「実際に動作させる時」にメモリアドレスが同じになってないといけないっぽい。

なので、必ず「setarch uname -m -R」を頭につけて変換&実行しておくれ。

想定される使い方

よっしゃー。これで、1バイナリになって、どの環境でも動くぞイヤッッホォォォオオォオウ!

と、ならないのが世の定め。。

ちょっとLinuxディストリビューションの違うLinuxに持ち込んでみたが動かない。。
まぁ全部試した訳ではないのだけれど、
同じディストリビューションだと動いているっぽい。

たぶん、kernelのバージョンが違ってたりすると、取り込んだlibcでそれを吸収できないとか、そんな感じになっている気がする。
調べてないけど。

そう考えると1バイナリになるGo言語って結構考えられてますね。ファイルサイズが大きくなるだろうから、そこらへんトレードオフなんだろうけど。

なので、自分は同じLinuxディストリビューションで2環境用意して運用している。

  • VMでコンパイル用環境を作る(足りない物は、なんでもかんでもyum install。使い捨て)
  • 本番環境。できるだけパッケージを入れない。

補足

statifier には、こんな記述が

Recent Linux kernels introduced VDSO (Virtual Dynamic Shared Object) and stack randomization. Those things, while valuable features, don't play well with Statifier.

意訳:ASLRとVDSOを使うバイナリは上手く動かないぜ

この statifier を作った方達は、Ermine というソフトを販売しております。

Ermine works in a fashion similar to Statifier, creating self-contained executables from dynamically-linked >applications. But Ermine-packed applications are not snapshots: instead they can be thought of as small virtual machines.
And because of this an Ermine-packed application does not suffer from the problems created by VDSO/stack randomization

意訳:Ermineなら問題ないんだぜ

Ermine
http://www.magicermine.com/

15日トライアルもできるらしい。

参考

bkブログ - statifier で動的リンクの実行ファイルを擬似的に静的リンクにする
http://0xcc.net/blog/archives/000089.html

ELF Statifierを使って実行形式ファイルをシステム間で移動する
https://osdn.jp/magazine/08/12/02/012255

WAFを知らない人に説明する試み

Added by kanata over 5 years ago

仕事で使うかもしれんのでまとめてみた。

WAFとIPSとFireWallとウィルス対策ソフトと何が違うの?
とか、確かに説明しづらい気がする。WAF知らない人に対しても、できるだけ簡潔に説明したい。

詳細は、Security#WAF参照。

WAF~><

1 ... 7 8 9 10 11 ... 15 (81-90/146)

Also available in: Atom

Add picture from clipboard (Maximum size: 100 MB)