16 KiB
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
-
The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
-
公式のPEASS&HackTricksのグッズを手に入れましょう。
-
💬 Discordグループまたはtelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
-
ハッキングのトリックを共有するには、hacktricksリポジトリとhacktricks-cloudリポジトリにPRを提出してください。
カスタムURLスキームは、アプリがカスタムプロトコルを介して通信することを可能にします。アプリはスキームを宣言し、それらのスキームを使用する着信URLを処理する必要があります。
URLスキームは、アプリへの潜在的な攻撃経路を提供するため、すべてのURLパラメータを検証し、形式が正しくないURLを破棄するようにしてください。さらに、ユーザーのデータを危険にさらすことのない利用可能なアクションを制限してください。
例えば、URI myapp://hostname?data=123876123
は、スキーム mydata
を登録しているアプリケーション(mydata
というアプリケーション)の、hostname
に関連するアクションを呼び出し、値が 123876123
のパラメータ data
を送信します。
脆弱な例として、2010年に発見されたSkype Mobileアプリの次のバグがあります。Skypeアプリは skype://
プロトコルハンドラを登録しており、他のアプリが他のSkypeユーザーや電話番号に対して通話をトリガーできるようにしていました。残念ながら、Skypeは通話を行う前にユーザーに許可を求めることなく、任意の番号に電話をかけることができました。攻撃者は、不可視の <iframe src="skype://xxx?call"></iframe>
(xxx
はプレミアム番号に置き換えられる)を設置することで、誤って悪意のあるウェブサイトを訪れたSkypeユーザーはプレミアム番号に電話をかけてしまいました。
アプリケーションが登録したスキームは、アプリの Info.plist
ファイルで CFBundleURLTypes
を検索することで見つけることができます(iGoat-Swiftの例)。
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.iGoat.myCompany</string>
<key>CFBundleURLSchemes</key>
<array>
<string>iGoat</string>
</array>
</dict>
</array>
ただし、悪意のあるアプリケーションは、既に登録されているURIを再登録することができます。したがって、URIを介して機密情報を送信している場合(myapp://hostname?password=123456)、悪意のあるアプリケーションは機密情報を傍受することができます。
また、これらのURIの入力は、SQLインジェクション、XSS、CSRF、パストラバーサル、または他の可能な脆弱性を悪用しようとする悪意のある****元から来る可能性があるため、チェックおよびサニタイズする必要があります。
アプリケーションクエリスキームの登録
アプリはcanOpenURL:
を呼び出して、対象のアプリが利用可能かどうかを確認できます。ただし、このメソッドは、悪意のあるアプリによるインストールされたアプリの列挙の手段として使用されていたため、iOS 9.0以降では、それに渡されるURLスキームも宣言する必要があります。これは、アプリのInfo.plist
ファイルにLSApplicationQueriesSchemes
キーと最大50個のURLスキームの配列を追加することで行います。
<key>LSApplicationQueriesSchemes</key>
<array>
<string>url_scheme1</string>
<string>url_scheme2</string>
</array>
canOpenURL
は、適切なアプリがインストールされているかどうかに関係なく、未宣言のスキームに対して常にNO
を返します。ただし、この制限はcanOpenURL
にのみ適用されます。
URLハンドリングと検証のテスト
URLパスがどのように構築され、検証されるかを判断するために、元のソースコードがある場合は、次のメソッドを検索できます:
application:didFinishLaunchingWithOptions:
メソッドまたはapplication:will-FinishLaunchingWithOptions:
:決定がどのように行われ、URLに関する情報がどのように取得されるかを確認します。application:openURL:options:
:リソースがどのように開かれているか、つまりデータがどのように解析されているかを確認します。特に呼び出し元アプリケーション(sourceApplication
)によるアクセスが許可または拒否されるかどうかを確認します。カスタムURLスキームを使用する場合、アプリはユーザーの許可も必要とする場合があります。
Telegramでは、4つの異なるメソッドが使用されています:
func application(_ application: UIApplication, open url: URL, sourceApplication: String?) -> Bool {
self.openUrl(url: url)
return true
}
func application(_ application: UIApplication, open url: URL, sourceApplication: String?,
annotation: Any) -> Bool {
self.openUrl(url: url)
return true
}
func application(_ app: UIApplication, open url: URL,
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
self.openUrl(url: url)
return true
}
func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
self.openUrl(url: url)
return true
}
他のアプリへのURLリクエストのテスト
openURL:options:completionHandler:
メソッドと非推奨のUIApplication
のopenURL:
メソッドは、URLを開く責任を持っています(つまり、他のアプリにリクエストを送信/クエリを作成するためのURL)。これは、現在のアプリにローカルな場合もあれば、別のアプリによって提供される必要がある場合もあります。元のソースコードがある場合は、これらのメソッドの使用法を直接検索できます。
さらに、特定のサービスやアプリをクエリしているかどうか、そしてアプリがよく知られている場合は、オンラインで一般的なURLスキームを検索し、**grep(iOSアプリスキームのリスト)**に含めることもできます。iOSアプリのURLスキーム名とパスの常に更新されたリストを参照してください。
egrep -nr "open.*options.*completionHandler" ./Telegram-iOS/
egrep -nr "openURL\(" ./Telegram-iOS/
egrep -nr "mt-encrypted-file://" ./Telegram-iOS/
egrep -nr "://" ./Telegram-iOS/
廃止予定のメソッドのテスト
以下のような廃止予定のメソッドを検索します:
例えば、以下の3つが見つかります:
$ rabin2 -zzq Telegram\ X.app/Telegram\ X | grep -i "openurl"
0x1000d9e90 31 30 UIApplicationOpenURLOptionsKey
0x1000dee3f 50 49 application:openURL:sourceApplication:annotation:
0x1000dee71 29 28 application:openURL:options:
0x1000dee8e 27 26 application:handleOpenURL:
0x1000df2c9 9 8 openURL:
0x1000df766 12 11 canOpenURL:
0x1000df772 35 34 openURL:options:completionHandler:
...
任意のURLの呼び出し
- Safari: 1つのURLスキームを素早くテストするには、SafariでURLを開き、アプリの動作を観察します。たとえば、
tel://123456789
と書くと、Safariはその番号を呼び出そうとします。 - Notes App: カスタムURLスキームをテストするために、書いたリンクを長押しします。開くためには編集モードを終了する必要があります。アプリがインストールされていない場合、カスタムURLスキームを含むリンクをクリックまたは長押しすることはできません。
- IDB:
- IDBを起動し、デバイスに接続し、対象のアプリを選択します。詳細はIDBのドキュメントを参照してください。
- URL Handlersセクションに移動します。URL schemesで、Refreshをクリックすると、テスト対象のアプリで定義されているすべてのカスタムスキームのリストが左側に表示されます。これらのスキームは、右側のOpenをクリックして読み込むことができます。単に空のURIスキーム(たとえば、
myURLscheme://
を開くことで、隠された機能(たとえば、デバッグウィンドウ)を発見したり、ローカル認証をバイパスしたりすることができます。 - Frida:
URLスキームを単純に開きたい場合は、Fridaを使用して次のように行うことができます:
$ frida -U iGoat-Swift
[iPhone::iGoat-Swift]-> function openURL(url) {
var UIApplication = ObjC.classes.UIApplication.sharedApplication();
var toOpen = ObjC.classes.NSURL.URLWithString_(url);
return UIApplication.openURL_(toOpen);
}
[iPhone::iGoat-Swift]-> openURL("tel://234234234")
true
このFrida CodeShareの例では、作者は非公開のAPI LSApplicationWorkspace.openSensitiveURL:withOptions:
を使用してURLを開きます(SpringBoardアプリから):
function openURL(url) {
var w = ObjC.classes.LSApplicationWorkspace.defaultWorkspace();
var toOpen = ObjC.classes.NSURL.URLWithString_(url);
return w.openSensitiveURL_withOptions_(toOpen, null);
}
非公開のAPIの使用はApp Storeでは許可されていません。そのため、これらをテストすることはありませんが、動的解析には使用することができます。
URLスキームのファジング
アプリがURLの一部を解析する場合、メモリの破損バグを検出するために入力ファジングを実行することもできます。
上記で学んだことを利用して、自分の選んだ言語(たとえばPython)で独自のファズツールを構築し、FridaのRPCを使用してopenURL
を呼び出すことができます。そのファズツールは以下のことを行う必要があります:
- ペイロードを生成する。
- それぞれのペイロードに対して
openURL
を呼び出す。 - アプリが
/private/var/mobile/Library/Logs/CrashReporter
にクラッシュレポート(.ips
)を生成するかどうかを確認する。
FuzzDBプロジェクトは、ペイロードとして使用できるファジング辞書を提供しています。
Fridaを使用したファジング
Fridaを使用してこれを行うのは非常に簡単です。このブログ記事を参照して、iOS 11.1.2で動作するiGoat-Swiftアプリをファジングする例をご覧ください。
ファズツールを実行する前に、入力としてURLスキームが必要です。静的解析から、iGoat-Swiftアプリが以下のURLスキームとパラメータをサポートしていることがわかっています: iGoat://?contactNumber={0}&message={0}
.
$ frida -U SpringBoard -l ios-url-scheme-fuzzing.js
[iPhone::SpringBoard]-> fuzz("iGoat", "iGoat://?contactNumber={0}&message={0}")
Watching for crashes from iGoat...
No logs were moved.
Opened URL: iGoat://?contactNumber=0&message=0
参考文献
{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
-
The PEASS Familyを発見しましょう。独占的なNFTのコレクションです。
-
公式のPEASS&HackTricksのグッズを手に入れましょう。
-
💬 Discordグループまたはtelegramグループに参加するか、Twitterで私をフォローしてください🐦@carlospolopm。
-
**ハッキングのトリックを共有するには、hacktricksリポジトリとhacktricks-cloudリポジトリ**にPRを提出してください。