最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Fiddler Everywhere手機(jī)抓包&&繞過證書綁定

2020-11-15 21:25 作者:無情劍客Burning  | 我要投稿

在 抓包神器之Fiddler Everywhere及Wireshark 中講解了Fiddler EveryWhere怎么抓取web的數(shù)據(jù),這篇文章主要說怎么進(jìn)行手機(jī)抓包以及繞過如何繞過ssl-pining技術(shù)實(shí)現(xiàn)抓包。

糾正一個(gè)錯(cuò)誤

網(wǎng)上很多文章說,在進(jìn)行手機(jī)抓包的時(shí)候,一定要保證手機(jī)和電腦在同一個(gè)局域網(wǎng)。這句話是不準(zhǔn)確的,我認(rèn)為這么說的基本上是兩種情況: (1)人云亦云,別人這么說,我也這么說,應(yīng)該不會(huì)錯(cuò)吧。 (2)對(duì)抓包的原理不理解,甚至于什么是中間人攻擊都不清楚。

要實(shí)現(xiàn)抓包,需要的前提條件并不一定要在同一個(gè)局域網(wǎng)。但是應(yīng)該保證手機(jī)能夠ping同電腦的ip,因?yàn)樾枰谑謾C(jī)端下載和安裝Fiddler Everywhere的證書。

手機(jī)抓包的配置

(1)設(shè)置手機(jī)網(wǎng)絡(luò)代理,將代理設(shè)置為Fiddler Everywhere對(duì)應(yīng)的ip和端口 (2)訪問192.168.42.149(Fiddler Everywhere服務(wù)所對(duì)應(yīng)的ip):8866(Fiddler Everywhere服務(wù)所對(duì)應(yīng)的port)下載Fiddler Everywhere證書,并進(jìn)行安裝。本文使用的是ROOT的真機(jī),系統(tǒng)版本是Android 10。如果是模擬器,可參考https://helloworddm.blog.csdn.net/article/details/98363056。 (3)可以愉快的抓包了。

證書綁定(Certificate Pinning)

Certificate Pinning,或者有叫作SSL Pinning/TLS Pinning的,都是指的同一個(gè)東西,中文翻譯成證書鎖定,最大的作用就是用來抵御針對(duì)CA的攻擊。在實(shí)際當(dāng)中,它一般被用來阻止man-in-the-middle(中間人攻擊)。

說起中間人攻擊,可能不是那么直觀,但是這一類工具我們可能經(jīng)常會(huì)用到,如Charles和Fiddler。如果一個(gè)應(yīng)用使用了Certificate Pinning技術(shù),那么你使用前邊說的工具是無法直接來調(diào)試/監(jiān)控應(yīng)用的網(wǎng)絡(luò)流量的。

當(dāng)應(yīng)用通過HTTPS握手連接到Fidder/Charles時(shí),應(yīng)用會(huì)檢查請(qǐng)求的服務(wù)器的證書,如果發(fā)現(xiàn)與預(yù)設(shè)的不一致,會(huì)拒絕后續(xù)的網(wǎng)絡(luò)請(qǐng)求,從而增加應(yīng)用與服務(wù)器的安全通信。如下書某視頻apk,由于采用ssl pinning技術(shù),使得與服務(wù)器的連接無法建立。

實(shí)現(xiàn)

(1)教科書書式的實(shí)現(xiàn)。 語言使用的是Kotlin,Google欲使用Kotlin來取代Java,不過個(gè)人認(rèn)為還有很長(zhǎng)的路要走。


  1. // Load CAs from an InputStream

  2. // (could be from a resource or ByteArrayInputStream or ...)

  3. val cf: CertificateFactory = CertificateFactory.getInstance("X.509")

  4. // From https://www.washington.edu/itconnect/security/ca/load-der.crt

  5. val caInput: InputStream = BufferedInputStream(FileInputStream("load-der.crt"))

  6. val ca: X509Certificate = caInput.use {

  7. ? ?cf.generateCertificate(it) as X509Certificate

  8. }

  9. System.out.println("ca=" + ca.subjectDN)


  10. // Create a KeyStore containing our trusted CAs

  11. val keyStoreType = KeyStore.getDefaultType()

  12. val keyStore = KeyStore.getInstance(keyStoreType).apply {

  13. ? ?load(null, null)

  14. ? ?setCertificateEntry("ca", ca)

  15. }


  16. // Create a TrustManager that trusts the CAs inputStream our KeyStore

  17. val tmfAlgorithm: String = TrustManagerFactory.getDefaultAlgorithm()

  18. val tmf: TrustManagerFactory = TrustManagerFactory.getInstance(tmfAlgorithm).apply {

  19. ? ?init(keyStore)

  20. }


  21. // Create an SSLContext that uses our TrustManager

  22. val context: SSLContext = SSLContext.getInstance("TLS").apply {

  23. ? ?init(null, tmf.trustManagers, null)

  24. }


  25. // Tell the URLConnection to use a SocketFactory from our SSLContext

  26. val url = URL("https://certs.cac.washington.edu/CAtest/")

  27. val urlConnection = url.openConnection() as HttpsURLConnection

  28. urlConnection.sslSocketFactory = context.socketFactory

  29. val inputStream: InputStream = urlConnection.inputStream

  30. copyInputStreamToOutputStream(inputStream, System.out)


具體套路如下:

  • 加載證書文件,并使用CertificateFactory生成一個(gè)X509Certificate的實(shí)例

  • 創(chuàng)建一個(gè)KeyStore實(shí)例,并把前邊的X509Certificate實(shí)例加進(jìn)去,并起一個(gè)別名

注意,這里其實(shí)是可以加多個(gè)證書進(jìn)去的,但是注意別名不要重復(fù),因?yàn)榈讓訉?shí)現(xiàn)是使用一個(gè)Map存儲(chǔ)別名與證書的

  • 創(chuàng)建一個(gè)TrustManager,并且使用前邊的KeyStore實(shí)例進(jìn)行初始化

  • 創(chuàng)建一個(gè)SSLContext,并且使用前邊的TrustManager實(shí)例進(jìn)行初始化

  • 最后,使用SSLContext創(chuàng)建一個(gè)SSLSocketFactory實(shí)例,并且把它賦值給我們用于https的請(qǐng)求連接對(duì)象HttpsURLConnection

(1)Okhttp實(shí)現(xiàn)


  1. String hostname = "publicobject.com";

  2. CertificatePinner certificatePinner = new CertificatePinner.Builder()

  3. .add(hostname, "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")

  4. .build();

  5. OkHttpClient client = OkHttpClient.Builder()

  6. .certificatePinner(certificatePinner)

  7. .build();


  8. Request request = new Request.Builder()

  9. .url("https://" + hostname)

  10. .build();

  11. client.newCall(request).execute();


那么如何拿到上面所需要的hash值呢?官方給的一個(gè)方法是,先填寫一個(gè)錯(cuò)的hash值,然后根據(jù)隨后的exception的stack trace message,得到對(duì)應(yīng)的hash值。

其實(shí)也可以通過openssl提供的命令直接從der或者pem格式的證書中計(jì)算出來,由于命令相對(duì)復(fù)雜一些,我寫了一個(gè)簡(jiǎn)單的腳本封裝了一下,支持兩種格式的證書。

Frida繞過證書綁定


  1. setTimeout(function(){

  2. Java.perform(function (){

  3. ? ? ? ?console.log("");

  4. ? ? ? ?console.log("[.] Cert Pinning Bypass/Re-Pinning");


  5. var CertificateFactory = Java.use("java.security.cert.CertificateFactory");

  6. var FileInputStream = Java.use("java.io.FileInputStream");

  7. var BufferedInputStream = Java.use("java.io.BufferedInputStream");

  8. var X509Certificate = Java.use("java.security.cert.X509Certificate");

  9. var KeyStore = Java.use("java.security.KeyStore");

  10. var TrustManagerFactory = Java.use("javax.net.ssl.TrustManagerFactory");

  11. var SSLContext = Java.use("javax.net.ssl.SSLContext");


  12. // Load CAs from an InputStream

  13. ? ? ? ?console.log("[+] Loading our CA...")

  14. var cf = CertificateFactory.getInstance("X.509");


  15. try {

  16. var fileInputStream = FileInputStream.$new("/data/local/tmp/cert-der.crt");

  17. }

  18. catch(err) {

  19. ? ? ? ? ? ?console.log("[o] " + err);

  20. }


  21. var bufferedInputStream = BufferedInputStream.$new(fileInputStream);

  22. var ca = cf.generateCertificate(bufferedInputStream);

  23. ? ? ? ?bufferedInputStream.close();


  24. var certInfo = Java.cast(ca, X509Certificate);

  25. ? ? ? ?console.log("[o] Our CA Info: " + certInfo.getSubjectDN());


  26. // Create a KeyStore containing our trusted CAs

  27. ? ? ? ?console.log("[+] Creating a KeyStore for our CA...");

  28. var keyStoreType = KeyStore.getDefaultType();

  29. var keyStore = KeyStore.getInstance(keyStoreType);

  30. ? ? ? ?keyStore.load(null, null);

  31. ? ? ? ?keyStore.setCertificateEntry("ca", ca);


  32. // Create a TrustManager that trusts the CAs in our KeyStore

  33. ? ? ? ?console.log("[+] Creating a TrustManager that trusts the CA in our KeyStore...");

  34. var tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();

  35. var tmf = TrustManagerFactory.getInstance(tmfAlgorithm);

  36. ? ? ? ?tmf.init(keyStore);

  37. ? ? ? ?console.log("[+] Our TrustManager is ready...");


  38. ? ? ? ?console.log("[+] Hijacking SSLContext methods now...")

  39. ? ? ? ?console.log("[-] Waiting for the app to invoke SSLContext.init()...")


  40. SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;", "[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom").implementation = function(a,b,c) {

  41. ? ? ? ? ? ?console.log("[o] App invoked javax.net.ssl.SSLContext.init...");

  42. SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;", "[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom").call(this, a, tmf.getTrustManagers(), c);

  43. ? ? ? ? ? ?console.log("[+] SSLContext initialized with our custom TrustManager!");

  44. }

  45. });

  46. },0);

寫在最后

基于本片文章的繞過技術(shù),大部分基于服務(wù)器端的驗(yàn)證都是可以繞過的,但是如果是服務(wù)需要檢驗(yàn)app的證書那,這個(gè)時(shí)候Fiddler Everywhere就顯得力不從心了,F(xiàn)iddler Everywhere沒有辦法導(dǎo)入其他的證書。這時(shí)候就只能使用Charlers之類的軟件的。

公眾號(hào)

更多內(nèi)容,歡迎關(guān)注我的微信公眾號(hào):無情劍客。


Fiddler Everywhere手機(jī)抓包&&繞過證書綁定的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
芜湖市| 呼图壁县| 大渡口区| 兴化市| 桐乡市| 宝应县| 榆树市| 吉木乃县| 东方市| 上蔡县| 饶河县| 成安县| 恭城| 桂平市| 萝北县| 肥城市| 调兵山市| 普兰县| 高青县| 司法| 南漳县| 科尔| 郓城县| 于田县| 莱州市| 沙雅县| 印江| 罗源县| 拉孜县| 浑源县| 微山县| 枣庄市| 德兴市| 乌兰县| 泰兴市| 榆社县| 桐庐县| 临武县| 三台县| 祥云县| 灵台县|