ホーム » 「セキュリティ」タグがついた投稿
タグアーカイブ: セキュリティ
Scureなapkを作るためのNative
こんにちは。kiwamizamuraiです。
今回はセキュアなapkの作り方について少しまとめます。apkってなんだ?という方は以下の記事をどうぞ。
そもそもこの記事を書こうと思ったのはJavaが原因なんですよね。

NDKはアプリケーションの一部をネイティブに変換するためのツールです。また、コンパイルされたsoファイル(共有ファイル、windowsの場合は.dll)はJNIによってJavaが扱えるようにされます。また、ネイティブを使うことによって早くなることもメリットの一つになります。
一方でデメリットもあります。一つはファイルが大きくなることです。アンドロイドはさまざまなアーキテクチャ上で動くことができるため、その分互換性のあるファイルを多く持つ必要があります。デコンパイルしたapkのlib内を確認してみます。
上の画像からわかるようにそれぞれのマイクロプロセッサーに対応する機械語のファイルがあることがわかります。

詳しくはドキュメントを読んでください。

JavaのコードはDEXと呼ばれるバイトコードに変換されます。これはARTで動くためです。最近のアプリケーションはARTで実行されます。一昔前はJavaVMで動いていました。で、問題はこのバイトコードがデコンパイルされやすいことです。デコンパイルの過程も復習します。

復習ですがsmaliファイルはdexのアセンブリでした。このデコンパイルが簡単な理由は次のようです。

簡単に言えば、コンパイルの最適化が単純なことが原因です。メタデータ(クラス名やメソッド名)が付与されることが大きい理由らしいです。で、なぜコンパイルが単純なのか僕なりに調べました。原因はJITです。
ちなみに、dexじゃなくて機械語にコンパイルすればいいじゃんということにもなります。GCJというコンパイラが一応ありますが詳しくはわかっておりません。
僕の中の回答はIDA Proの商用版で解析することです。Free版だと対応のCPUがありません。。。。まあせっかくなのでJavaでnativeが動くまでについても調べてみます。
ネイティブメソッドが走るには.so内のSystem.loadLibraryかSystem.loadが呼ばれる必要があるようです。そしてその時に先ほど紹介したJNIのJNI_OnLoad()とかが使われるらしいです。じゃあ具体的にNativeってJavaの中でどう書かれているの?と思うのでみてみます。

ちょっと複雑ですが簡単にいうとnativeがあればネイティブメソッドということです。詳しくは参照よりどおぞ。
今回はセキュアなapkの作り方について少しまとめます。apkってなんだ?という方は以下の記事をどうぞ。
そもそもこの記事を書こうと思ったのはJavaが原因なんですよね。
Recap
とりあえず3つの手法があるようです。Isolate Java Program
重要なClassをサーバー側に置いておくことです。クライアントとは通信によってそのファイルへアクセスさせます。こうすることでデコンパイル自体を不可能することができます。重要なデータについてもサーバー側に置いておくことでデクリプションの可能性もなくなります。Convert to Native Codes
アンドロイドアプリケーションはJava(Kotlin)が一般的です。しかしJavaはデコンパイルされやすいです。(理由は後述します。)そこでデコンパイルが難しいネイティブを組み込む方法です。ネイティブはデコンパイルしたところでアセンブリになります。画像をもって説明します。
一方でデメリットもあります。一つはファイルが大きくなることです。アンドロイドはさまざまなアーキテクチャ上で動くことができるため、その分互換性のあるファイルを多く持つ必要があります。デコンパイルしたapkのlib内を確認してみます。

Code Obfuscation
ProGuardなどのツールを用いてコードを難読化する方法です。クラス名やメソッド名が乱数になったりします。以下をしてくれます。- Shrinking – detects and removes unused classes, fields, methods, and attributes.
- Optimization – analyzes and optimizes the bytecode of the methods.
- Obfuscation – renames the remaining classes, fields, and methods using short meaningless names.

Why is Java easily cracked?
先ほど対策方法でネイティブを埋め込む理由としてJavaはデコンパイルされやすいと言いました。それについて少し深入りします。そもそもJavaのコンパイル、デコンパイルの流れを確認しましょう。


Just-In-Time Compiler
JITはJavaのコンパイラです。ネイティブのコンパイルとの違いはタイミングです。これはdexをnative codeに変換します。公式からワークフローを拾ってきました。 よくわからないのでコピペで引用します。JIT コンパイラは、ART の現行の事前(AOT)コンパイラを補完し、ランタイムのパフォーマンスの改善、ストレージ容量の節約、アプリとシステムのアップデートの高速化を実現します。また、アプリの自動アップデート中のシステム シャットダウンや無線(OTA)アップデート中のアプリの再コンパイルを回避することで、AOT コンパイラのパフォーマンスも改善します。ここはまだ理解できる気がしないので今後の課題にしておきます。
ちなみに、dexじゃなくて機械語にコンパイルすればいいじゃんということにもなります。GCJというコンパイラが一応ありますが詳しくはわかっておりません。
Reverse Engineering Native Code
Javaが単純なのでNativeで書こう、ということになりました。ではNative Codeは本当に安全なのでしょうか?少しだけ深入りします。
ネイティブメソッドが走るには.so内のSystem.loadLibraryかSystem.loadが呼ばれる必要があるようです。そしてその時に先ほど紹介したJNIのJNI_OnLoad()とかが使われるらしいです。じゃあ具体的にNativeってJavaの中でどう書かれているの?と思うのでみてみます。

感想
やはりネイティブ最高、リバエン最高ですねReferences
- https://stackoverflow.com/questions/6235290/how-to-make-apk-secure-protecting-from-decompile
- https://stackoverflow.com/questions/12450510/why-is-it-so-easy-to-decompile-java-code
- https://limbenjamin.com/articles/analysing-smali-code.html
- https://www.spigotmc.org/threads/why-is-c-c-significantly-harder-to-decompile-than-java.343897/
- https://stackoverflow.com/questions/13509961/which-method-eventually-calls-jni-onload
- https://www.virusbulletin.com/uploads/pdf/magazine/2018/VB2018-Stone.pdf
- https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html
Frida 入門
こんにちは。kzです。
今回はFridaを使ってAndroid用のCTFを解いてみます。
これが今回のapkです。Objectiveのところにあるように、secret stringを見つけて、root検出の回避が目標です。
とりあえず起動してみるとこんな感じ。(エミュレータを使用しています。実機ほしい、、、、)
おー、root detectedですね。これは端末がroot化されているものを検出したということです。たとえばiPhoneのJailbreakも同じようなものです。なぜroot化かするのか?ですがたとえばゲームがいい例です。ゲームでチートってあるじゃないですかあれとかができるようになります。他にもiPhoneの場合だとTweakというアプリが作れたりします。ただ、よくないので行わないでください。

root判定の部分がありました。

ふむふむ、Successとなるように分岐されるところのソースコードをみてみます。

Base64の文字列5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc=ともう一つ気になるHex?があります、8d127684cbc37c17616d806cf50473ccこれはなんだろう、、?その後にAESもありますね、ということは逆算してパスフレーズがわかりそうです。ぐぐるとJavaにはCipherというAES/ECB/PKCS7Padding暗号があるようです。
どうやらkeyと平文を引数とする関数のようです。さらにHexの方がKeyであることがソースコードよりわかります。
なのでPythonでちゃちゃっとやります。

パスフレーズがわかりました。イエーい。まあそれはおいておいて、今回はFridaがメインみたいなところありますからね、、

使い方は少々面倒ですが公式のドキュメントを頑張って読みましょう。
まずはfridaとfrida-serverのインストールです。frida-serverはアンドロイドに埋め込んでfridaを実行できる環境にするためのものです。

では、fridaのドキュメントを参考にしながらbypassのためのコードを書きます。exploit.jsと命名しました。アプリの挙動から考えて起動後最速でHookしたいですね。あ、Hookとはアプリケーション外に定義されたスクリプトを実行する行為のことを言います。
ここではアプリ起動時のroot detectedのスクリプトをHookingにより無効にします。そして入力可能な状況を確立し、先ほどのパスフレーズを入力して目標を達成します。他にもいろいろやり方はあるのでいろんなwrite-upを参考にしてくださいね。
最終的にはこんな感じ

あとはターミナルを開いてfrida-serverを立てたのちにpyを実行するだけです。

起動時

rootをbypassできました。先ほどのパスフレーズを入力してみると

簡単ですね。ちなみに、Pythonでなくてもjsでfrida CLIから実行する場合は

とはいえ、level1なだけあって簡単ですね。マルウェア解析もやっていきたいです。
今回はFridaを使ってAndroid用のCTFを解いてみます。

とりあえず起動してみるとこんな感じ。(エミュレータを使用しています。実機ほしい、、、、)

Source Code
Javaのコードをデコンパイルして覗いてみましょう。やり方は前回の記事にあります。こうすることでroot detectedの実装が確認できます。


どうやらkeyと平文を引数とする関数のようです。さらにHexの方がKeyであることがソースコードよりわかります。


Frida
Fridaとはモバイルアプリケーションの動的解析ツールです。静的解析と違ってソースコードを書き換えてリビルドしてアプリを起動する、といった一連の流れをスキップして動的に解析が可能です。

ここではアプリ起動時のroot detectedのスクリプトをHookingにより無効にします。そして入力可能な状況を確立し、先ほどのパスフレーズを入力して目標を達成します。他にもいろいろやり方はあるのでいろんなwrite-upを参考にしてくださいね。
exploit.js
ではHooking用のスクリプトを書きます。このjsのコードをpythonのファイルに埋め込んでpythonのAPIより実行します。





Root Detection
iOSのJailbreak検出の実際の手法をいくつか紹介だけしておきます。- System Files Check
- Symbolic Links Detection
- Calling Cydia’s URL Scheme
- Loaded Libraries
とはいえ、level1なだけあって簡単ですね。マルウェア解析もやっていきたいです。
References
Ghidraでマルウェア解析入門
こんにちは。
本日はマルウェア解析のチュートリアルです。
使うツールはなんとGhidraです。2019年3月5日、NSA(アメリカ国家安全保障局)が、Ghidraを公開してくれました!わーい。
これはリバースエンジニアリングのツールです。逆アセンブルとも言えますでしょうか。今まではHopper Disassembler v4とかが同じツールでありますが個人的にアレの使い方がよくわからなかったのでこれを機に乗り換えます。では早速、インストールに移りましょう。個人的にJavaのインストールにかなり手間取ったのでその辺詳しく説明します。

docsをダブルクリックしてみると 
このようになると思うのでダブルクリックで起動。

Yesをクリックしてオプションを選択させられますが無視してAnalyzeをクリック。警告など出ればとりあえずOK押してください。
さて、string1をダウンロードしたサイトによればFLAGを見つける問題のようなので探します。CTFですね。
アセンブラにはあまり詳しくないのですがここをみるとmd5_hashという関数がハッシュ化する関数だということが予測できます。そしてスクロールダウンすると

おっと、ありましたね、しかもFLAGって書いてあります。ここをダブルクリックしてみると

たくさんフラグがありますね。他のものは無視して
FLAG{CAN-I-MAKE-IT-ANYMORE-OBVIOUS}
をコピペして先ほどのサイトに入力します。
CHECK FLAGをクリックすると正解と出ました。やったあああ。
本日はマルウェア解析のチュートリアルです。
使うツールはなんとGhidraです。2019年3月5日、NSA(アメリカ国家安全保障局)が、Ghidraを公開してくれました!わーい。

Ghidraのインストール(Mac)
まずはGhidra本体のダウンロードを行います。 上のリンクからダウンロードを押すだけです。そしてフォルダの中身を見てみると次のようになっているかと思います
installationGuide.html
というものがあるのでそれを読んでみるとJDK11が必要であることがわかります。なのでインストールしていきましょう。
まずは上をダウンロードして
- $ tar xvf ./Downloads/openjdk-11.0.2_osx-x64_bin.tar
- $ vim ~/.bashrc
- export PATH=~/jdk-11.0.2.jdk/bin:$PATH の1行を追加
- $ java –version
- $ /usr/libexec/java_home -V
pkg
をダブルクリックでインストールするとjavaがインストールできたはずです!
Ghidraの起動
先ほどダウンロードしたGhidraのフォルダの中にghidraRunという実行ファイルがあるのでダブルクリックすると起動します。(batじゃないよ)またはターミナルで次をタイプします。- $ /Users/username/ghidra_9.0.4/ghidraRun ; exit;
Malware解析の超絶入門
ではマルウェア解析の練習、いや、基礎の基礎、いや、Ghidraの使い方、を学びましょう。 から練習問題をダウンロードします。そしてGhidraを起動し、Newprojectを適当に作ってから先ほどダウンロードしたstring1を解答したもの(exe)をドラッグします。すると

さて、string1をダウンロードしたサイトによればFLAGを見つける問題のようなので探します。CTFですね。
strings1.exe contains an un-encrypted flag stored within the executable. When run, the program will output an MD5 hash of the flag but not the original. Can you extract the flag?なぜか僕の環境ではダブルクリックで開くことができなかったんですがそれはおいておいて、hash化されているようなので左のFilterでhashとフィルタリングします。



FLAG{CAN-I-MAKE-IT-ANYMORE-OBVIOUS}
をコピペして先ほどのサイトに入力します。
