PragyanCTF 2019 writeup

Welcome

  • JPEGが渡されるが、binwalkをかけると中にzipがあるので取り出す
  • 取り出したzipを展開すると壊れたbmpとパスワード付きのzipが展開される
  • bmpファイルの末尾にはbase64エンコードされたような文字列があるのでデコードするとzipのパスワード
  • zipを展開するとpngファイルがでてくる
  • stegosolveで適当にぽちぽちやるとFLAG
  • pctf{st3gs0lv3_1s_u53ful}
  • Cookieにflagというフィールドがあり、MD5が設定されている
  • どこかのMD5クラックサイトで検索するとpcがでてくる
  • フラグフォーマットは、pctf{なのでひたすらこのCookieのMD5の元を考えれば良いとわかる
  • pctf{c0oki3s_@re_yUm_bUt_tHEy_@ls0_r3vEaL_@_l0t}

Feed_me

  • バイナリを読むと、渡された乱数3つがチェック用の値になっている
  • 入力文字列を10byteずつ分割してatoiに流し込んでいて、以下の式が成り立てばおkなので、あとは算数 x + y = a1 y + z = a2 x + z = a3
  • 自分が解いたときのケース Can you cook my favourite food using these ingredients :) -10026 ; -8250 ; -12490 ; -000007133-000002893-000005357 That's yummy.... Here is your gift: pctf{p1zz4_t0pp3d_w1th_p1n34ppl3_s4uc3}

Game of Faces

  • ページにアクセスすると3色のよくわからん正方形があるが、ソースを見るとファイルアップロードが見える
  • 適当にファイルをアップロードするとh1タグでbase64エンコードされた文字列が帰ってくるのでデコードするとファイル名がわかる
  • ファイル名で直接アクセスするとフラグ
  • pctf{You_L00K_Wi3Rd_IN_H3R3}

Easy RSA

  • e, c, nのパラメータが渡されるが、eが著しく大きいので、Wiener’s Attackだとわかる
  • コード書いて、秘密鍵dを計算すると12978409760901509356642421072925801006324287746872153539187221529835976408177だとわかる
  • あとは普通にRSAを解読したら、出てきた数値を16進数表記にして1byteずつasciiにすればフラグ
  • pctf{Sup3r_st4nd4rd_W31n3r_4tt4ck}

Late PR

  • 課題を提出しようとしてたけどパソコンがクラッシュしたという問題文とともにイメージファイルが渡される
  • vol.pyでプロセスを見るとchrome.exeがexitしていることがわかり、GoogleChromeCrashHandler.exeというプロセスの存在に気づくので、当該プロセスのメモリダンプを見てみるとフラグ
    • vol.py -f *.raw --profile Win7SP1x86_23418 pslist
    • vol.py -f *.raw --profile Win7SP1x86_23418 memdump --dump-dir .
    • strings 468.dmp | grep pctf
  • pctf{Late_submissions_can_be_good}

Mandatory PHP

  • 以下のPHPのコードが渡される
<?php 
include 'flag.php'; 
highlight_file('index.php'); 
$a = $_GET["val1"]; 
$b = $_GET["val2"]; 
$c = $_GET["val3"]; 
$d = $_GET["val4"]; 
if(preg_match('/[^A-Za-z]/', $a)) 
die('oh my gawd...'); 
$a=hash("sha256",$a); 
$a=(log10($a**(0.5)))**2; 
if($c>0&&$d>0&&$d>$c&&$a==$c*$c+$d*$d) 
$s1="true"; 
else 
    die("Bye..."); 
if($s1==="true") 
    echo $flag1; 
for($i=1;$i<=10;$i++){ 
    if($b==urldecode($b)) 
        die('duck'); 
    else 
        $b=urldecode($b); 
}     
if($b==="WoAHh!") 
$s2="true"; 
else 
    die('oops..'); 
if($s2==="true") 
    echo $flag2; 
die('end...'); 
?> 
  • val1INFになるので、val3val4でINFになるようにデカイ数を渡して、val2は10回urldecodeしてWoAHh!になるようにパラメータを渡せば良い
  • curl 'http://159.89.166.12:14000///index.php?ffval1=0&val2=WoAHh%2525252525252525252521&val3=101&val4=大きい値'
  • pctf{b3_c4r3fu1_w1th_pHp_f31145}

終了後に解いた問題

Magic PNGs

  • パスワード付きzipとpngファイルが渡されるが、fileコマンドを叩くとdata都市てか表示されないためヘッダーなどが間違っていると推測できる
  • 案の定Magic numberが間違っているので修正するが、それでも開かない
  • PNGは通常IDATチャンクがあるはずだが、そのキーワードがidatと小文字になっていたのでこれを修正すると開けて、h4CK3RM4nが読み取れる
  • ヒントから、この値をmd5してパスワードzipを展開するとフラグ
  • pctf{y0u_s33_m33_n0w!}
  • ファイルヘッダーとかが違うところに気づいていなかった

EXORcism

  • 大量の1と0があるファイルを渡される
  • 100x100の正方形に整形して、1をスペース、0は黒として描画するとQRコードになる
  • QRコードを読み取ると、160f15011d1b095339595138535f135613595e1a
  • タイトルがXORなので、この文字列となにかをxorする必要があると推測できる
  • フラグフォーマットのpctf{になるようにxorする値を計算するとflagfになるので、flagを繰り返してxorすれば良いとわかるので、それで計算するとフラグ
  • pctf{wh4_50_53r1u5?}
  • そもそもQRコードになるなんて想像ができなかった

Save Earth

  • USBパケットのデータが渡されて入力した値を求めさせる
  • データ内にasciiがないので、間隔つまりモールス信号だと推測する
  • USBパケットの末尾のデータ部から4をスペース、1と2をそれぞれモールス信号にするとフラグが得られる
  • CTFS4V3

BesidesCTF 2019 writeup

  • apkが渡されるのでunzipして、classes.dexをdex2jarでjarファイルに変換
  • jarファイルをunzipして、classファイルをjadで一括逆コンパイル
  • 適当にファイルを眺めていると/com/example/blink/r2d2.jadにbase64でエンコードされた文字列があるのでデコード
  • CTF{PUCKMAN}と書かれた画像が出てくる

zippy

  • pcapngが渡されるのでFollo TCP Streamをするとsupercomplexpasswordがzipのパスワードだとわかる
  • パケットからzipファイルを通信してるパケットを見つけて抽出
  • パスワードを使ってunzipすると中のflag.txtにCTF{this_flag_is_your_flag}

futurella

  • HTMLのソースを見るとCTF{bring_it_back}

kookie

  • cookie/monsterでログインできるのでログインする
  • その際のCookieを見ると、cookieになっているので、これをadminに変更
  • その後reloadするとCTF{kookie_cookies}

binarycookiesファイル解析ツールbincookie

はじめに

iOSやMacのフォレンジックでは、アーティファクトの1つとしてCookie情報を利用します。macOSでは、/User/ユーザ名/Library/Cookies/Cookies.binarycookies に存在します。しかしながら、本ファイルは拡張子からもわかるようにバイナリ形式になっています。そこで、本記事ではこのバイナリファイルを解析するツールをご紹介します。

bincookie

bincookie
拙作のGolangで実装された解析ツールです。goユーザならgo getで入りますし、Releaseからバイナリのダウンロードもできます。
本ツールの特徴として、curlコマンドで利用できる形式として出力する点です。私の手元にあった/Users/ユーザ名/Library/Cookies/com.apple.iTunes.binarycookiesに対して適用した例が以下です。

$ bincookie /Users/ユーザ名/Library/Cookies/com.apple.iTunes.binarycookies
# Netscape HTTP Cookie File
# This file was generated by owlinux1000's bincookie
# https://github.com/owlinux1000/bincookie

.apple.com	TRUE	/	TRUE	1566914111	xp_ci	hogehogehoge
.apple.com	TRUE	/	TRUE	1566914111	xp_ab	hogehogehoge
.xp.apple.com	TRUE	/	TRUE	1566914111	xp_aci	hogehogehog

また、同様のソフトウェアとして以下の2つが存在します。

おわりに

binarycookiesファイル解析ツールbincookieの宣伝をしました。binarycookiesファイルを解析する際には、ぜひbincookie使ってみてください。バグか何かあったらissueやPR待ってます。

iOSデバイスフォレンジック入門

はじめに

本記事では、iOSフォレンジックをやったことない人向けに基本的な情報をまとめてみました。取っ掛かりとしては簡単に読める内容だと思います。主にiOSデバイスのバックアップデータやその解析ツールについてご紹介しています。

準備

本記事では主に以下のデバイスやソフトウェアを使って検証しています。当該デバイスやバージョンでない場合同じ結果や解釈にならない可能性もありますのでご了承ください。

  • iPad mini4 (iOS 12.1.1 非Jailbreak)
  • MacBookPro (High Sierra 10.13.6)
  • iTunes (12.8.3)

iOS 概要

iOSは、iPhoneやiPad、Apple Watch等で利用されているOSです。iOSは大きく分けて、以下の4つのシステムから構成されています。

  • Cocoa Touch
  • Media
  • Cocoa Service
  • Core OS

Cocoa Touchは、名前からもわかるようにタッチ操作を始めとするユーザーインタフェースのシステムです。Mediaは、動画像や音楽などMedia用のシステムです。Cocoa Serviceは、アプリケーションにとって必要な基本的なシステムを提供しています。最後のCore OSは、ハードウェアに近いより低レイヤーなネットワークやメモリ管理、スレッドの機能などを提供しています。

次に、iOSで用いられているファイルシステムについて簡単にご紹介いたします。近年のiOSではAPFS(Apple File System)と呼ばれるファイルシステムが利用されています。従来はHFS、HFS+が使われていましたが、2017年のiOS 10.3からAPFSが導入されました。APFSの特徴としては、inodeが64bitに拡張されたためより多くのファイルが扱えるようになったり、CoW(Copy on Write)のサポート、タイムスタンプがナノ秒単位まで記録するようになったりなど従来のファイルシステムに比べ大きく変わっています。より詳細な情報としては以下のWebページなどが参考になると思います。

iTunesバックアップ

iOSデバイスにおけるデータを抽出する方法としては、物理と論理の2通りの方法があります。しかしながら、物理デバイスから情報を抽出するためには、機材が必要であったり、論理面でも有償のツールが必要なことが多く入門には不向きです。そこで本記事では、iTunesのバックアップデータを元にiOSデバイスのフォレンジック調査に役立つ情報をまとめていこうと思います。もしすでにホストマシンにiTunesを用いてバックアップをとっている人はそのデータをお使いできます。もしなければ、iOSデバイスを接続し、iTunesの画面よりバックアップをとってください。

iOSデバイスのバックアップデータは、以下の場所に格納されます。

  • Mac:/User/ユーザ名/Library/Application Support/MobileSync/Backup
  • Windows:\AppData\Roaming\Apple Computer\MobileSync\Backup\
  • Windowsストアアプリ経由でiTunesを入れた場合:%USERPROFILE%\Apple\MobileSync\Backup

バックアップを行っている状態で、上記フォルダにアクセスするとハッシュ値が名前のフォルダがあると思います。それがバックアップデータの本体です。バックアップデータのフォルダの中には、主に以下のファイルやフォルダが格納されていると思います。

  • Manifest.plist
  • Manifest.db
  • Info.plist
  • Status.plist
  • 大量のフォルダ

Manifest.plistは、主にバックアップの内容について記載されています。例えばバックアップした日時、バックアップを暗号化しているかどうか、インストールしたアプリケーション一覧などがあげられます。Manifest.dbは、SQLiteのデータベースファイルで、バックアップデータに含まれるファイルやフォルダの情報が格納してあります。fileIDカラムには、SHA1が格納されており、これはファイル名を表しています。そのため、バックアップフォルダの中で、このハッシュ値を使って検索したりします。
以下の図は、DB Browser for SQLiteでManifest.dbを読み込んだときの図です。CUIのsqlite3コマンドなどでも良いのですが、フォレンジック業務をやるときには、フィルターやソート、検索などが手軽に使えるほうが効率が良いので、こういったGUIツールを使っています。

Manifest.db

Info.plistは、主にバックアップ対象のデバイス情報について記載されています。例えば、IMEIやシリアルナンバー、最後にバックアップした日などが挙げられます。Status.plistは、主にバックアップ状況について記載されています。

バックアップフォルダの中に格納されている主要なアーティファクトは、SANSの公開資料のDFIR-Smartphone-Forensics-Poster.pdf に掲載されています。とても便利なのでダウンロードしておくことをおすすめします。

iTunesバックアップ解析ツール

今まで見てきたバックアップデータなどを解析する際に役立つツールをご紹介します。

plutil

拡張子plistのバイナリファイルの中身を解析する際には、plutilコマンドが便利です。Macの場合は標準でインストールされているのですぐに使えます。Windowsでは、plist Editor Pro for Windowsというものが存在するので、それを利用できそうです(未検証)。

本来plutilコマンドはいろいろな操作ができますが、今回はフォレンジックでよく使うplistファイルを別のファイルに変換する操作をご紹介します。以下は、Info.plistファイルをxmlファイルに変換する場合の例です。plistファイルはバイナリファイルなので、こういった変換を行うことが必要となってきます。

$ plutil -t convert xml1 Info.plist -o Info.xml

-oオプションを忘れてしまうとplistファイル自体の中身が書き換わってしまうので注意してください。
その他Pythonが利用できる環境であれば、plistlibライブラリが利用できるので、これを用いてプログラマブルに解析することも可能です。

iExplorer

iExplorer

iExplorerは、高機能なiOSデバイスファイルブラウザーです。iExplorer よりダウンロードできます。iExplorerは、Manifest.dbなどの情報を自動でパースし、より人間にわかりやすい形で表示してくれます。正直これがあれば、バックアップデータの閲覧には困らないと思います。全体的に眺めたい際などは、こちらを使って足りない場合、前述したplutilコマンドなどを使って解析します。同様のツールとしてiBackupBotiBackup Viewerなどがあるので、使い比べてみて自分にあったものを使うと良いでしょう。

おわりに

今回は、iOSの基本構造やバックアップデータを用いた解析方法などについて簡単にご紹介しました。次は、気が向けば個々のアーティファクトについてより詳細にとりあげて記事を今度書こうかなと思っています。

参考資料

フォレンジックのためのシステム時刻入門

  • フォレンジックなどをやっていると様々な時刻形式と直面することがあります。いざ調べてみると時刻形式は、プラットフォームによって異なる場合が多いことに気づきました。時刻の情報はタイムライン作成では、とても重要な要因となってくるので、適切に時刻を解釈することが必要です。本記事では、よく見る3つの時刻表記についてご紹介します。

UNIX time

  • UNIX timeはDFIRだけに限らず多くの場面でよく見かける時刻形式の1つです。UTC(協定世界時)の1970年1月1日0時0分0秒からの経過秒数で表す時刻形式です。主要なプログラミング言語の代表的な時刻を扱うライブラリなどでは、UNIX timeをサポートしています。例えばRubyでは以下の様に、UNIX timeを扱うことができます。
require 'time'
JST_OFFSET = 3600 * 9
puts Time.parse("1970-01-01 00:00:00").to_i + JST_OFFSET #=> 0
puts Time.at(0) #=> 1970-01-01 09:00:00 +0900

Apple Cocoa Core Data timestamp

  • Apple Cocoa Core Data timestampは、主にMac OSやiOSで見かける時刻形式です。Cocoaとは、macOS用のフレームワークです。また、Mac absolute timeと表記されることもあります。本時刻形式は、UTCの2001年1月1日0時0分0秒からの経過秒数で表す時刻形式です。UNIX timeとの差分は、978307200なので、これを考慮すればUNIX timeからすぐ算出することができます。

WebKit/Chrome time

  • WebKit/Chrome timeは、Google Chrome、OperaやSafariなどのデータで使われている時刻形式です。本時刻形式は、UTCの1601年1月1日0時0分0秒からの経過マイクロ秒で表す時刻形式です。UNIX timeなどと異なりマイクロ秒なので値が大きいという特徴があります。

便利なツールやサイト

以下の2つは、システム時刻変換をする際に、使いやすかったツールです。

  • Epoch Converter
    • 本記事で説明した時刻形式などは概ねカバーしているツールです
  • DCode
    • Epoch Converterと同様の機能を有しているWindowsアプリケーション

参考文献

新年なのでHugo でGitHub Pages にデプロイ

  • あけましておめでとうございます。本年もよろしくお願いいたします。
    新年なので、Hugo で技術ブログを作成してみました。私ははてなブログやMedium などいろいろサイトを持っているわけですが、このブログには自分の備忘録的なことを書いて行こうと思います。

1. Hugo のインストールと事前準備

  • まずはHugo をインストールし、使いたいテーマ(今回はoneというテーマ)をsubmoduleとして取り込む。今回は、GitHub にblog というリポジトリを作成(アクセスする際には、https://owlinux1000.github.io/blog/) して、GitHubの設定で masterブランチのdocs/ を公開対象として設定する。

  • config.toml を編集する際には、publishDir = "docs" を追加しておく。これはGitHub 側で公開するディレクトリをdocs にしているから。

$ brew install hugo
$ hugo new site blog
$ cd blog
$ git init
$ cd themes
$ git submodule add https://github.com/resugary/hugo-theme-one one
$ cp one/exampleSite/config.toml ../../../
$ emacs config.toml # 適宜パラメータを修正する

2. 記事作成

  • hugo コマンドで記事を作成してまずは、server サブコマンドを使ってPreview を見てみる。大丈夫そうならGitHub にpushする
$ hugo new posts/helloworld # この記事
$ emacs content/posts/helloworld.md # draft: false に変更
$ hugo # Webページを生成。これでdocsに吐かれる
$ hugo server # アクセスして見れるか確認する
$ git add .
$ git commit -m "1st commit!"
$ git remote add origin git@github.com:owlinux1000/blog.git
$ git push -u origin master

おわりに

  • Hugo を初めて使ってみた感想として結構めんどくさくなかったと思った。ネット上見てるとCIでがんばったりいろいろ見ていたので、プロジェクトサイトでのデプロイにした。毎月1本程度では継続していきたい。