MoqHaoのiOS用ランディングページの難読化処理

はじめに

こんにちは、morimolymolyです。
MoqHaoの検体をfuckする話はアクティブディフェンス研究所でネタにしましたが、最近はそのインフラについて調査を進めています。
blog.activedefense.co.jp

また、感染端末の電話番号をどのように悪用するのかも調査をしています。
blog.activedefense.co.jp

今回はランディングページに焦点を当てようと思います。

ランディングページ概要

ランディングページには大きく分けてPC、AndroidiOSの3つがあります。

SMSで配信されるURLについて、UserAgentを識別して分岐していきます。

PCには404を返し(最近の話ですが)、Androidには配信されるURLにある文字列をパスとして付与したページへ、iOSはduckdnsで取得されたページへ遷移していきます。

PC: 404
Android http://配信URL/特定の文字列
iOS hxxp://hogehoge[.]duckdns[.]org

難読化処理

さて、iOSのランディングページには難読化処理が施されており、IoCを隠す意図があると考えられます。
以下が実際に取得できたランディングページのソースコードです。
moqhao-ios-landing-page.html · GitHub

コードとしては単純で配列にある文字列の最後の要素をkeyとしてXORしてevalするだけです。

すると以下のようなコードが現れ、これを実行します。

alert("APP Storeアカウントは安全異常があるので、再度ログインしてください。");
location.replace('hxxp://yrdlaebbqt.duckdns.org');

たしかにIoCは一見すると取りづらいと思いますが、自動化の手法としてSeleniumなどを用いればかんたんに突破できます。

おわりに

MoqHaoの用いるランディングページの概要とその難読化処理を解説いたしました。
より発展した難読化処理が実装されるだろうことは予見されるため、一応備忘録的に記事を書いてみました。

大学院生活振り返り

B4(2018)

学部時代はBitVisorを拡張してハニーポットを作る研究をしていた。
精神的にはうつ状態と社交不安障害で参っていたが、とにかく開発やリサーチが楽しくて全く苦ではなかった。
ただ誰も助けてくれない環境だったので自分で強くなるしかなかった。
先の見えない研究は大変だった。

大学院1年(2019)

密かに思いついていた高速なVMIが行えるサンドボックスを未踏に応募しつつ、研究テーマを指導教官からもらいLLVMを触っていた。
大学院生活初の研究室内発表当日に未踏採択が決定し、研究テーマをぶん投げてサンドボックス制作に従事することにした。

未踏時代の振り返りは、色々な人に恵まれてスパクリまでたどり着くことができて、僕の力はそのうちの50%というところだった。
とにかく大学院1年は未踏で終わってしまった。
未踏にコミットしなければならない & プレッシャーが酷く(個人的な勘ぐりですが)、全力のパフォーマンスは出すことができなかった。
実際にミーティングを休むことや、重大なインシデントが発生してしまったりなどてんやわんやしていた。

私生活ではパーティやイベントなど何もかも参加せずに、自己嫌悪に苛まれながらコードを書いていた。
また、双極性障害(躁うつ病、双極症)が発覚し、絶望の中でリサーチとコーディングをしていた。

しかし、無事、成果報告会をクリアし、朝寝坊などもありつつも、未踏スーパークリエータの称号を得ることができた。

休学(2020)

双極性障害があまりにも酷く、まともに社会生活が送れないため休学をすることを決意した。
酷いというのは、精神のコントロールが一切聞かず、まったく動けない状態と、ありえないくらい活動的な状態をスイングしていた。
そんな中でコロナ渦に巻き込まれさらに精神状態がひどくなった。

休学期間中はろくなことをしていなかった気がする。
本当にろくでもないので、知りたい人には個別に教えたいと思います。

ただ、投薬治療がうまくいき数ヶ月に一回のムードスウィングで落ち着くようになった。
とはいえ、リクルーティングされた会社でもほとんど出社しないなど、不義理を働いてしまった。

就活はゆるりと進めていた。
いくつかの会社から内定をもらい、某JTBCに内定が決まったが、それを反故にし、別の会社に決めた。(2021年秋)

大学院2年(2021)

研究テーマは現実的な路線として未踏のテーマを引き継ぐことにした。
本当は他にやりたいことが有り持ち込みをしたのだが、共同研究のしがらみでなしになった。
未踏のテーマを論文化して発表化するのみだったが、それもうまく行かず、ComSysで発表するのみになってしまった。
研究にコントリビュートしてくれた方には本当に申し訳ない。
ただいいわけではないが、入院期間などがあり、まともにコードを書くこともままならなかった期間があり、それが年末に重なってしまい自分でもどうしたらいいのかわからなかった。

アルバイトでは、日本を狙う脅威についてリサーチをしたり、R&Dをしたりした。

総括

1年ビハインドをつけたが、精神疾患の治療には有効であったと考えている。(現在はムードスウィングは4ヶ月に一回程度になっているし、よほどが重ならない限り軽くおさまる)
また興味関心のあるDBI、VMM、情報セキュリティ、マルウェア解析などにある程度明るくなることができてよかったと思う。

CS:GOのナイフが奪われた話

はじめに

こんにちは.morimolymolyです.
DeNA 21新卒×22新卒内定者 Advent Calendar 2021の8日目の記事です.

本日は僕が2年前にCS:GOのナイフ(スキン)が奪われて,1.8万の損害を出したことについて書きたいと思います.

CS:GOにおけるスキンとは武器の見た目を切り替えるだけのもので,高級なものだとウン十万円もする代物です.
僕は2万円以下と決めて購入していました.

本記事はインターネット詐欺の撲滅を啓発する目的です.

とある日

陽気な外国人からチャットが届きました.

「Hey, 君のスキンかっこいいね!僕のと交換しない?」

相手のインベントリをみるとなかなかかっこいいスキンがあったため了承しました.
すると相手はBitSkins.comやCS.MONEYなどの正規のウェブサイトで価格の比較をするように指示してきました.
定番のサイトばかりだったので指定されたサイトでログインして比較しました.

その後,相場がわかったので値段を伝えると,じゃあこのスキンと交換しようと,僕のものより少し高いくらいのスキンを提示されました.
喜んで取引を開始し特に何も見ずに承認をすると,手元には何も残っていませんでした.

何がおかしい?

今のやり取りで一体どこに罠があったでしょうか?

  • 提示されたサイトにログインしている
  • 取引内容をきちんとみていない

この2点に罠がありました.

詐欺の手法

詐欺の手法は以下の通りになっています.
まず詐欺師は正規のサイトに紛れ込ませフィッシングサイトにログインさせます.
被害者はまずトレードのリクエストを送ります.(from:被害者, to:詐欺師)
詐欺師は盗んだ認証情報を用いて,詐欺師のbotが自動的にリクエストをキャンセルし,新しい偽のトレードを作ります(from:被害者, to:詐欺師のbot).
詐欺師のbotは詐欺師と同じプロフィールをしています.
トレードを承認するためにモバイルアプリを用いますが,UIがあまりよくできておらず,偽のトレードだと気づくことが難しいです.(2019年当時)

フィッシングサイト

フィッシングサイトは以下のようになっています.
f:id:morimolymoly:20211202150034j:plain

一見分かりづらいですが,Steamのログイン画面はJSで作られたWindowsの窓にみせかけたフローティングウィンドウです.(picture-in-picture attack)
この攻撃に気が付かないとログイン画面は極めて正当にみえます(URLやSSL表示など)

詐欺サイトは誰が作ったのか?

早速ソースコードをダウンロードし,解析,OSINTを行いました.
github.com

このサイトを販売しているのは,Fakerと呼ばれる人物でした.
Telegram: https://t[.]me/savage67

また詐欺のチュートリアルマニュアルを発見いたしました.

Fakerの提供するサービスは以下のサイトにあります.
https://webdev0[.]com/services/

f:id:morimolymoly:20211202150754j:plain

おわりに

現在でもFakerの作成したフィッシングキットは使われているようです.
謎のウェブサイトにログインするときはpicture-in-picture attackなどにも気をつけてログインしましょう.
またトレードの際にはしっかりとトレード内容を確認するようにしましょう.

Out-of-the-box VMIでチートをした話

はじめに

こんにちは.morimolymolyです.
DeNA 21新卒×22新卒内定者 Advent Calendar 2021の2日目の記事です.
DeNAではセキュリティ技術グループでゲームのチート対策などを行っております.
詳しいことは僕のインターン参加ブログをご参照ください.

morimolymoly.hateblo.jp

そんなわけ(?)で今日はチートのかなりベーシックな手法をOut-of-the-box VMIで試したのでご紹介いたします.

Out-of-the-box VMIとは

Virtual Machine Introspectionとは,仮想マシン(VM)を監視・解析するための技術です.
VMIにはOut-of-the-boxとIn-the-boxの2種類存在し,前者はVMの外から,後者はVMの内部から監視・解析するものです.
Out-of-the-box VMIは完全にVMの外から監視・解析を行うことから,マルウェア解析などの用途に使われます.

libvmiやDRAKVUFなどが有名なプロダクトです.

https://libvmi.com/
drakvuf.com

Out-of-the-box VMIをチートに使うことにより,チートをしていると気づかれにくく,特権的な操作を行うことができます.
最近はアンチチートがカーネルドライバになっているケースがありますが(VALORANTのVanguardが有名),それはRing0つまりOSの権限で動くのですが,VMを管理するソフトウェアであるハイパーバイザは所謂Ring-1で動作します.したがって権限が絶対的に上になります.

そのためこれを用いたチートができないか調査をいたしました.

memflow

調査をした結果,memflowというライブラリがみつかりました.
以下に特徴を列挙いたします.

  • Rustで書かれている
  • Rustでツールがかける
  • KVM based
  • PCI Leech対応
  • Windowsの解析に対応

名目上,DMAライブラリとしていますが,明らかにチートツールに転用することができます.
関係ないですけどRustでかけるのがいいですね!!!!!

memflowの使い方

以下にmemflowの使い方を説明します.

まずmemflowupをします.
これはmemflowのconnectorをセットアップします.

git clone git@github.com:memflow/memflowup.git
cd memflowup
python3 memflowup.py

次に以下のリンクからReleaseされているkvmのconnector(KVMとのコミュニケーションをとるもの)をインストールします
github.com

sudo dkms install --archive memflow-0.1.4-source-only.dkms.tar.gz
sudo modprobe memflow

次にmemflow-cliのインストールをします.

git clone git@github.com:memflow/memflow-cli.git
make install

最後にKVMにWindows10なVMをつくり,接続テストをします.(VM名はwin10としました)

memflow conn new kvm -a win10

チートシナリオ

早速チートをしましょう!!!
対象となるゲーム?は以下のようなゲームです.
変数や関数のアドレスを表示しているのはデバッグ用でチートには使用しません.

f:id:morimolymoly:20211119173133p:plain
samplegame

連打してポイントを稼いで,10000000点以上になるとwin!と表示されます.
ソースコードは以下のようになっています.

#include <iostream>

void win(int counter) {
    if (counter >= 10000000) {
        std::cout << "win!!!" << std::endl;
    }
}

int main()
{
    std::cout << "Simple Counter!!!!\n";
    int counter = 0;
    std::cout << "counter address: 0x" << &counter << std::endl;
    std::cout << "win address: 0x" << &win << std::endl;

    while (1) {
        win(counter);
        getchar();
        std::cout << "counter:" << counter << std::endl;
        counter++;
    }
}

シナリオとしては以下のようなものを想定します.

  • 点数を自由に操作する
  • win!!!を毎回表示させて優勝してお酒が飲みたい

それでは行きましょう.

チートツールを書く

以下にチートツールのレポジトリを貼ります.
github.com


チートツールで行っているチートは以下のようになっています.

  • 点数を自由に操作する == スタック上の変数の改ざん
  • win!!!を毎回表示させて優勝してお酒が飲みたい == メモリ上のコード領域の改ざん

スタック上の変数の改ざんには独自のメモリ検索エンジンを実装し,スタック上から目的の変数を探して改ざんします.
メモリ上のコード領域の改ざんには優勝するために改ざんするべきコードを改ざんします.
これらはすべてOut-of-the-box VMIで行われています.
完全にVMからは不可視で改ざんを行います.

スタック上の変数の改ざん

今回は変数がスタック上にあることが事前にわかっているので,スタック領域を求めます.
これはTEBを用います.
en.wikipedia.org

TEBはThread Information Blockのことで,現在走っているスレッドの情報が格納されています.
スレッドの情報にはスタックについての情報も載っています.
memflowはTEBのアドレスを求めてくれる機能があるので,そこからオフセットを用いてメモリからスタックのベースアドレスとリミットアドレスを取得します.
その後はメモリ検索エンジンを自前で実装し,終了です.

メモリ上のコード領域の改ざん

毎回優勝したい場合,10000000点以上を取らなければいけませんが,それは面倒くさいです.
なんなら変数の改ざんをしなくても済むようにコード領域を改変しましょう!

まずはどこにターゲットになるコードがあるかを解析しましょう!
まずはGhidraをおもむろに立ち上げて,exeファイルを読み込ませます.
その後に"win!!!"文字列を検索します.

f:id:morimolymoly:20211119172510p:plain
win!

みつかりました!
XREFをみるとwin!!!文字列を参照しているコードがどこにあるかがわかります.

早速みてみましょう!

f:id:morimolymoly:20211119172506p:plain
ターゲットコード

これをみるとベースアドレス+ 0x1119 にあるJL命令を潰してやれば良さそうです.
memflowの動的メモリ改ざん機能でここを0x90(NOP)で潰します.

結果

それではOut-of-the-box VMIなツールでチートをします!!!!
チートツールは以下のようになっています.

f:id:morimolymoly:20211119173047p:plain
cheat tool

結果は以下のようになっています!!!!

f:id:morimolymoly:20211119173057p:plain
チート結果

優勝しました!!!!!!!!!!!!!!!!!!!!!!1

対策方法

流石にチートしましただけではどうしようもないので思いつく対策を以下に列挙いたします.

  • 特徴的な文字列は暗号化する
  • 点数の値を暗号化する
  • VM検知をする(アーティファクトがどこかにあります)
  • コードのインテグリティチェックをする

……あまり参考になりませんね…….
Out-of-the-box VMI cheatを倒すにはどうしたら良いのでしょうか…….
これは今後の課題としてブログに対策方法を考えて書くことにします!!!

最後に

今回はかんたんなゲーム?に対してKVM + memflowを使ったOut-of-the-box VMIでのチートを行いました.
スタック上の変数の改ざんと,メモリ上のコード領域の改ざんでゲームをチートしました.
以上で今回の記事を終わりたいと思います.
ありがとうございました.

JIS版MagicKeyboardをLinuxで動作させるパッチがマージされた

ついにマージされてリリースされた

前回の記事

morimolymoly.hateblo.jp

前回の記事でつくったパッチがついにマージされてリリースまで行きました。

以下が情報科学若手の会で発表した資料になります。

speakerdeck.com

時系列

時系列をお話します。

  • 7/29 linux-inputにパッチ投稿
  • 9/15 linux-inputのメンテナからappliedされた連絡
  • 10/5 AUTOSELでbotにパッチがレビューされるように選ばれる
  • 10/14 あのGreg Kroah-Hartmanがマージするよ〜と連絡
  • 10/17 リリースされる

今後の展望

ハックできるところがあるかちょこちょこ探すかもしれない。 いまのところ心理的障壁はかなり軽減された。

関連リンク

github.com

git.kernel.org

hid-apple.c - drivers/hid/hid-apple.c - Linux source code (v5.16.10) - Bootlin

Solanaでスマートコントラクトを書いてみた

はじめに

こんにちは,morimolymolyです. 今回はSolanaという暗号資産のチェーン上で動くプログラム,スマートコントラクトを書いてみましたのでその感想を記します.

Solanaってなに?

Solanaとは第三世代ブロックチェーンの代表格とも呼ばれているらしい*1,新興チェーンではあるものの勢いがありかつ,実用性があるチェーンだそうです.(これ全部人づてなので諸説あるらしい)

Proof of Historyと呼ばれる新規性のある高速なコンセンサスアルゴリズムを提案,実装しています. ホワイトペーパーによると,

On a 1gbps network connection the maximum number of transactions 29 possible is 1 gigabit per second / 176 bytes = 710k tps max

とのことで,めちゃくちゃすごいTPSがでていることがわかります. しかしバリデータ要件がめちゃくちゃ高いらしいので気をつけて.

docs.solana.com

オタク的嬉しいポイントとして,すべてがRustでかかれている事が挙げられます. 以下のレポジトリはSolanaのコアになっています.

github.com

また,オタク的嬉しいポイント2としてeBPF形式でコントラクトが動くというところがあります. 以下がeBPF VMの実装です. eBPFなバイナリが出力できる言語であればいいので,C/C++はもちろん,Rustもいけますね!!!(LLVMはeBPFのバックエンドをもつので)

github.com

つまりすべてがRustに収束するのです.いやーめでたい.

スマートコントラクトとは

スマートコントラクトはブロックチェーンの上で動くプログラムのことです. 一体何ができるのか?僕にもまだ詳しくはわかりませんが,DeFiなどの非中央集権的経済取引のアプリケーションを書くことができます. いままで証券会社や銀行が中央にいた経済に比べ,手数料が安く取引などが可能に,しかも信頼性のある形でできるようです. 今回は詳しく説明しませんが,日銀が注目するほどなので何やらすごいのでしょう.

coinpost.jp

ともかく,僕はネットワークの上で動く謎のコンピュータをいじってみたい!と言う動機でやってみました.

Rustでスマートコントラクトを書く

スマートコントラクトをRustで書くときにはsolana_sdkかAnchorを使う必要がありますが,テストコードがかんたんにかける,色々ラップしてくれて嬉しいということでAnchorを使いました.入門は以下の記事を読めばいいと思います.

project-serum.github.io

以下にハマリポイントを書いていきます

ハマリポイント: M1 Macでうまく動かない問題

M1 Macだとsolana-test-validatorと呼ばれる必ず一度は呼ばないといけないコマンドが現在叩けません. 以下の記事でがんばってくれ!

dev.to

全然Anchorの情報がない

これがマジできつかった.チュートリアル以上のことをやろうとするとすぐ詰まる. さらに破壊的変更がすぐ入って,数ヶ月前の記事が使えないことが起きる.

ここでひとつ,コホン.

テストコードがドキュメントです.

以下の場所からそれっぽいコードをみて理解しろ!

github.com

何を作ったの?

Anchorのチュートリアル的な記事として,このようなものがありました.

dev.to

この記事はかんたんなカウンターを作って,スマートコントラクトで回すアプリを作っています. しかし,フロント側で毎回カウンター用のアカウント(ややこしいのですが,Solanaでいうストレージのようなものです)を使い捨てるため,カウンターが毎回初期化される問題と言うか仕様がありました.それを解決するために,PDA(Program Derived Address)を用いて問題を解決してみました.(これが正しいかはわからんしらん存ぜぬ)

docs.solana.com

PDAを使うとプログラムにアカウントを紐付けることができるので,プログラム側でアカウントの管理ができます.基本コントラクトはステートレスなのでややこしいですね. このようにして,ウォレットに紐付いたカウンターが生成されました.

www.youtube.com

github.com

脆弱性

GeT_Pwn3d!でセキュリティ絡まないのも変なので,脆弱性を埋め込んでおきました!!!(というのは嘘であきて実装を放り投げたのです)

脆弱性1: 弱い認証

PDAのseedとして,ウォレットの公開鍵の10文字のみを使用している.hashがうまいこと衝突すると問題になる.guessもかんたんだ.

脆弱性2: 認証がない

認証がないのでスマートコントラクトを呼び出す際の引数にウォレットのアドレスを入れてしまえば勝手にカウンターを操作できます.

おわりに

初心者がわけわからん散文かいてすみませんの気持ちしかありませんが,これいけてないよーとかこれこうしたほうがいいよーとかあったらコメントください!

*1:第1世代はBitcoin,第二世代はEthereum

LinuxをJIS版Magic Keyboardに対応させた

こんばんは。morimolymolyです。
今回はJIS版Magic KeyboardをLinuxで使用できるようにパッチを当てました。結構前に。*1
また、それに対応した独立したドライバをリリースしました。

ぺちぺちしたチープなうち心地、シュッとしたデザイン、かな・英数の独立キー、⌘キー、いいですよねえMagic Keyboard。
1万円で購入しワクワクしてLinuxマシンとペアリングさせたところ、かな、英数、ろ、|の4つのキーが使用不可能でした。(パイプで繋げなかったら何すればいいんだ?ソリティアか?)
溝に捨てた気分になるのは嫌なので、早速調査を開始しました。

デバッグのためにフルボッコにしたカーネルです。HID関連を調査しました。
github.com

printkデバッグで大体の原因がわかったところで、先人が既に同じようなことをしているのを発見いたしました。
qiita.com

パッチを当てたのはdrivers/hid/hid-apple.cのたった数行。
HIDデバイスから返されるReport Descriptorを修正するパッチ。
Report Descriptorについては以下を参照。
https://wiki.onakasuita.org/pukiwiki/?%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%BF


Magic KeyboardのJIS版はなぜかLogical MaximumとUsage Maximumが本来なら0xE7のところ、0x65になっていた。

HIDデバイスはdrivers/hid/hid-core.cのhid_add_field関数でレポートの登録が行われるが、その前段階のパース部分か、キーボード自体が不正な値を返すようだ。(現段階の調査だとキーボード自体がおかしい可能性がある)

パッチの作成方法としてはまず、hidrdで実際の値を確認する。
github.com

その後、sys/kernel/debug/hid/dev/rdescを確認し、ディスクリプタの値をゲット、不正なINDEXの調査をする。

不正なINDEXの部分を正常な値に書き換えるようにreport_fixupで設定を行い、パッチは完成する。

現在、パッチをメーリングリストに投げてレビュー待ちのところだ。
patchwork.kernel.org

また、独立したドライバをカーネルに取り込まれる前にリリースした。
テストするだけならmake installするだけ、マジにインストールするならREADME.mdから自力で頑張ってください。
github.com

手元のマシンでは正常に動作しており、目的は達成された。
やったね!

それでは。

*1:面倒くさくてブログを書くのが遅れた。面倒くさくて。

Smishingマルウェアについて思うところ #BP6 #Moqhao

はじめに

こんにちは、morimolymolyです。
最近どうも調子が悪くて、アニメをみれたらみる、それ以外はたまにコンピュータに触れる、そんな生活を送っています。

さて、最近トレンドマイクロとJC3からとある発表*1 *2がなされました。

僕が以前解析していたSmishingマルウェアを動かすアクターがJC3とトレンドマイクロによりBP6と名付けられたようです。(その他にも連携をとっているであろうBP1やCPシリーズなど多数のグループが背後にいるそうです。こわいですね)

そんな中で、BP6と思われるアクターが操作する携帯電話から、また私の携帯電話にSMSが送られてきたので解析しました。
検体に関してはXLoader(Moqhao)そのもので、以前書いた記事と酷似しているため詳細は省き、IOCのみを共有いたします。

morimolymoly.hateblo.jp

IOCはこちらです。
otx.alienvault.com

初めてAlienVault OTXを使いましたが、便利そうなので今後も使うと思います。

NTTSecurity.apkについて

Twitter上でとある情報共有がなされていました。

検体名が面白かったし、ランディングページがはりきって作られているので少しだけ解析をしました。
これがBP6によるものかは明らかになっていません。

こちらの検体は、jiagu packerと呼ばれるパッキング技術を採用しているようでした。
検体のjiagu packerのライブラリをVTに食わせた結果が以下の通りです。

https://www.virustotal.com/gui/file/8eaab75d3ab9597b988d0f3bc6463e35c5dd90261dae29e5260f7b4a758fea5f/summary

jiagu packerはQihoo360が開発、提供しているモバイルアプリの耐タンパー性能を向上させるツールのようです。
jiagu.360.cn

実際に検体がパッキングされていることがデータの解析により判明いたしました。

f:id:morimolymoly:20210515210628p:plain

参考にしたjiagu packerの解析記事は以下のとおりです。
blog.zimperium.com

またこのパッカーは、仮想マシン型のパッキングを行っているそうです。

詳細な解析は気が向いたら行いますが、今後モバイル向けの高性能なパッカーを用いるアクターが増えることが予想されます。

最後に

解析を少ししかしていないので情報量が少なくなってしまいましたが、BP6などのSmishingアクターを追いかけるアナリスト、リサーチャーのお役に立てると幸いです。
今回、jiagu packerなる高性能なパッカーを採用している検体に遭遇し驚きました。

BP6なるアクターがXLoader(Moqhao)から、別の検体を配信していることは観測しています。
morimolymoly.hateblo.jp

今後も新たなマルウェアを用いた攻撃が増加する可能性があります。
これからも注視していきましょう。

それでは。

*1:[トレンドマイクロの記事 blog.trendmicro.co.jp]

*2:[JC3によるプレスリリース www.jc3.or.jp]

DeNAのセキュリティチームでインターンをして笑顔になった話

はじめに

こんにちは.morimolymolyです. 絶賛セキュリティを軸に就活しています. セキュリティ就活の軸は,事業会社でのセキュリティ,専門会社でのセキュリティの2つあります. 今回は事業会社のセキュリティとして就活する中で,DeNAのセキュリティチームでインターンをさせていただきました. この記事ではそんなインターンを振り返ります.(技術的なところはかなりぼかしています.ゴメンね)

DeNAのセキュリティチームってどんな感じ?

一瞬,セキュリティベンダーかな?と疑ってしまうような幅広い守備範囲を兼ね備え,CSIRT,SOC,脆弱性診断,ネットワーク診断,中にはマルウェア解析を行っている方もいらっしゃるみたいです. では,何故ここまで強いチームができあがったのか.それは内製化によるところが大きいようです. これに関してはも出版されており,どれだけ力を入れてチームを作っていったのかが伺えます.

DeNAといえば膨大な数のゲームやWebサービス. 相当な数の攻撃を受けるので内製チームだけで回すにはとんでもない練度が必要なのは間違いないでしょう.その一端を一ヶ月間垣間見ることができました.

インターン内容

インターンでは主にスマートフォンアプリの診断トレーニングを行いました. セキュリティチーム(内部ではセキュリティ技術グループとよばれています)では,配属された人に様々なトレーニングを提供し,スキルアップしてもらうようです. 今回はスマホアプリのみですが,Webアプリなどのコンテンツも揃っているようでした.

課題は大きく2つ,

  • ネイティブライブラリを使ったCocos2d-x製アプリをチートすること
  • Unity製アプリをチートすること

でした.

課題1

1つ目の課題は暗号化された通信をときつつ,メモリ改ざんも含めチートをしようという課題でした.

Burp Suiteで通信を傍受し,暗号化がかんたんなため通信内容のみから暗号を解くように指示されました.

実際,やってみると勘があたりすぐ解くことができました.

答え合わせでGhidraとIDA Proで確認すると,なるほど!となりました(ちなみにGhidraで解析できないが,IDA Proでは解析できるケースに遭遇し興奮したのはこのとき)

暗号化の中身がわかったあとは,Burp SuiteのExtenderをPythonで書きました.

簡単に言うと暗号化を解いて通信改ざんができるようになるチートツールです.

Pythonで書くと死ぬほど辛いので書かんといてくださいよ!!

メモリ改ざんは子供の頃にやったことがあり,難なくクリア. メモリに含む内容は暗号化しないとダメですね.

課題2

2つ目の課題はSSL Pinningを解き,アプリ改ざん,通信改ざん,メモリ改ざんを全部やれというようなトレーニングでした.

ちなみにroot化なしです.

ここらへんは詳しいことは言えないですが,SSL Pinningを外すために動的と静的な手法で試し,通信改ざんをするためにリバースエンジニアリングして暗号化手法を特定し,Burp Suite用のExtenderを書き,メモリ改ざんをしてランキング1位を取ったりしました.

IDA Proをガシガシ使えて,GhidraとIDA Proのデコンパイラの精度を比較できて楽しかったです. また触ったことのない技術を使えたので学びもすごかったです.

課題総括

ここを直したらもう少しセキュアになるよね?とかこういう攻撃をするなら守り方はこれだ!みたいな気付きがかなり多かったです.それを誘導する課題を作った誰かに感謝です.素直に凄すぎです.

やはり攻撃してみないと見えてこない視点はあるので,トレーニングの機会があれば何でも挑戦したいですね.

内製ツールの話

今回はメモリ改ざんツールとOSSになっているPacket Proxyを触りました. 特にPacket Proxyの出来がよくて,UIが見やすいし,gRPCなどの通信にも対応していて,Burpのように拡張もできます. 拡張に関しては迷うことのない簡潔なインターフェイスが用意されていて,間違いないツールだなと思いました.

DeNAはその他にも難読化ツールDeClangOSSで公開しています. チーム自体がものづくりに関して積極的で,プログラミングが好きなセキュリティエンジニアが集まっているなと思いました.

単純に無いからつくるっていう精神は最高ですね.

まとめ

今回はDeNAのセキュリティチームでのインターンを軽く振り返りました. 一ヶ月間,迎えてくれたチームの皆様,人事の皆様,労務の皆様,ありがとうございました!!!!!!!!!!

これで報告を終わりたいと思います.ありがとうございました.

アカツキのセキュリティチームのインターンに行ってきた

はじめに

こんにちは。morimolymolyです。 今回は、アカツキの就業型短期インターンに参加しましたので、そちらの振り返りをしたいと思います。

アカツキとは

皆様御存知、八月のシンデレラナインなどで有名なゲームを軸に事業を展開している会社です。 なんでセキュリティやっている人間がゲーム会社のインターンを受けたのかというと、就活を進めるにあたり、セキュリティエンジニアとしてのポジションがある会社を探していたところ、アカツキにめぐりあったからです(!?)。

インターンの流れ

今回は、フルリモートでの参加となりました。 MacBook Proの15インチモデルをお借りし、業務の一端を担うことになります。 いくつかタスクが与えられ、それをこなし最終報告会で報告すると無事インターンクリアとなります。

振られたタスク

今回のインターンで振られたタスクは以下の2つになります。

  • Web脆弱性診断入門
  • アンチチートライブラリ開発

前者は、僕がWebの脆弱性診断をした経験がない(CTFのめちゃくちゃ簡単な問題で有名な脆弱性に触れる程度)ことから少し不安でした。後者はリサーチに近いものである程度裁量をもって進めることができました。(インターンなのに)

Web脆弱性診断入門

OWASP(Webセキュリティの団体)がトレーニング用に開発したやられアプリ、RailsGoatに対して攻撃し、脆弱性を発見、レポートをまとめるというトレーニングを受けました。

github.com

診断に使ったツールはBurp Suite Community Editionとniktoだけで、全部手動で診断を行いました。

最終的に20個の脆弱性を見つけてレポートにまとめることができました。 最初はクリティカルな脆弱性がみつからず、頭を捻っていましたが、メンターの方のアドバイスにより、網羅性を考え全リクエストを確認することを意識し始めたら、発見できる脆弱性の数が増えていきました。脆弱性診断には網羅性が大事なのだということを再認識することができました。

また、脆弱性診断の要となるのがレポートで、開発者にどのような脆弱性がどれほどの影響があるのかということを簡潔にわかりやすく伝える必要がありましたが、僕にはその力が欠けていたため、何度も推敲して良さげな文章を生成しました。 結果、レポートのテンプレートに10件ほどマージされることになりました。 苦労の甲斐がありました。

アンチチートライブラリ開発

アカツキではチート対策のためのライブラリの開発を行っていました。 まだ、成熟したものではないため、ある程度インターン生でも裁量を持って機能の実装などが行うことができました。

今回、振られたタスクは以下の通り。

  • フォーマッタ導入
  • ディレクトリ構成やUnitTestの導入
  • 文字列難読化処理の実装

フォーマッタの導入はclang-formatを導入するだけとお手軽。 ディレクトリ構成はLLVMなどを参考にしつつ、見通しの良いように変更しました。 UnitTestはそもそも導入されていなかったので、今回の担当箇所のみテストコードを書きました。フレームワークはGoogleTest、テストランナーはCTestにしました。

文字列難読化処理は、マルウェア解析での知見を活かして、独自の難読化処理を実装しました。IDA Proなどで実際に難読化を施したバイナリを解析して耐性を確かめたりしました。 解析していてこれ嫌だなっていう地味な嫌がらせが実装できたのではないかと思います。

総括

フルリモートでの就業型インターンでしたが、本当に充実していました。 朝はギリギリまで寝ていられるし、仕事が終わった瞬間に家なので、爆速で支度してジムに行くことだって可能なわけです。(気力があれば) コミュニケーションは基本的にSlackとZoomで行われ、毎日行われるメンターとの昼会、インターン生や社員さんとの交流のためのランチなど、なんなら出社するよりコミュニケーションが取れているのでは!?と思うほどでした。(コミュ障なので)

業務に関しては、脆弱性診断の一端を見ることができ、ゲーム会社独自のセキュリティへの取り組みというものもみることができました。

最後に

僕を受け入れてくれたチームの皆様、メンターの方、労務・人事の皆様、誠にありがとうございました。最後まで楽しくインターンできてよかったです。 以上で私のインターン報告とさせていただきます。

ありがとうございました。