Android渗透测试HTTPS证书校验绕过

日常Android渗透过程中,会经常遇见https证书校验(http就不存在证书校验了,直接抓包便可),不能抓取数据包。APP是HTTPS的服务提供方自己开发的客户端,开发者可以先将自己服务器的证书打包内置到自己的APP中,或者将证书签名内置到APP中,当客户端在请求服务器建立连接期间收到服务器证书后,先使用内置的证书信息校验一下服务器证书是否合法,如果不合法,直接断开。

环境

windows10
burpsuite
jeb3

情况分类

情况1,客户端不存在证书校验,服务器也不存在证书校验。
情况2,客户端存在校验服务端证书,服务器也不存在证书校验,单项校验。
情况3、客户端存在证书校验,服务器也存在证书校验,双向校验。

情况1

举个例子:
1、可以拿到apk文件,利用jeb3反编译apk文件,反编译成功,Ctrl+f -->搜索checkClientTrusted或者checkServerTrusted字符串,如下

checkClientTrusted

结果如下:

image.png

反编译成java代码,如下

image.png

分析得知,apk程序客户端与服务端都没有存在证书校验。设置代理,伪造证书,成功抓取数据包。

情况2

举个例子:
1、可以拿到apk文件,利用jeb3反编译apk文件,反编译成功,Ctrl+f -->搜索checkClientTrusted字符串,如下

image.png

反编译成java代码,如下

image.png

伪造证书代理,抓取数据包出现如下:

image.png

存在证书校验,不能成功进行抓取数据包。客户端校验服务端证书,这个过程由于客户端操作,存在不可控因素,可通过客户端进行绕过https校验。

绕过思路1
反编译apk,找到校验证书方法,将校验部分删除,从而变成情况1,成功抓取数据包。如下

利用Androidkiller.exe反编译apk文件,找到checkServerTrusted方法的smali代码:

image.png

将所有校验部分删除,如下:

image.png

反编译apk文件,jeb打开重打包的apk。如下

image.png

安装重打包的apk,运行,设置代理,抓取数据包

image.png

绕过思路2
JustTrustMe.apk 是一个用来禁用、绕过 SSL 证书检查的基于 Xposed 模块。JustTrustMe 是将 APK 中所有用于校验 SSL 证书的 API 都进行了 Hook,从而绕过证书检查。xposed的54的可以运行,高版本没有测试,可以自行测试。
使用如下:

image.png

重启设备,抓取数据包,成功抓取,如下:

image.png

绕过思路3
Frida进行绕过(具体细节看参考1),Frida安装教程参考,可以下载这里脚本。其中application.py脚本,我修改了一下:

# -*- coding: utf-8 -*-

import frida, sys, re, sys, os
import codecs, time

APP_NAME = ""

def sbyte2ubyte(byte):
    return (byte % 256)

def print_result(message):
    print ("[!] Received: [%s]" %(message))

def on_message(message, data):
    if 'payload' in message:
        data = message['payload']
        if type(data) is str:
            print_result(data)
        elif type(data) is list:
            a = data[0]
            if type(a) is int:
                hexstr = "".join([("%02X" % (sbyte2ubyte(a))) for a in data])
                print_result(hexstr)
                print_result(hexstr.decode('hex'))
            else:
                print_result(data)
                print_result(hexstr.decode('hex'))
        else:
            print_result(data)
    else:
        if message['type'] == 'error':
            print (message['stack'])
        else:
            print_result(message)

def main():
    try:
        with codecs.open("hooks.js", 'r', encoding='utf8') as f:
            jscode  = f.read()
            process = frida.get_usb_device().attach(APP_NAME)
            script  = process.create_script(jscode)
            script.on('message', on_message)
            print ("[*] Intercepting on  (pid: )...")
            script.load()
            sys.stdin.read()
    except KeyboardInterrupt:
        print ("[!] Killing app...")

if __name__ == "__main__":
    if (len(sys.argv) > 1):
        APP_NAME = str(sys.argv[1])
        main()
    else:
        print("must input two arg")
        print("For exanple: python application.py packName")

这里以com.flick.flickcheck包名为例,首先pc端运行启动frida服务器脚本startFridaService.py,pc端运行命令如下:
python application.py com.flick.flickcheck

image.png

设置代理,抓取数据包:

image.png

情况3

双向认证:apk客户端对服务器证书进行认证,服务器对客户端证书进行认证,防止证书被篡改。

客户端
首先我们尝试使用 JustTrustMe.apk进行绕过,如果发现绕过不了,可能客户端还存在其他校验,这里发现一个还使用了,如下

下载JustTrustMe的源代码,进行编译,增加对这两个函数的hook,绕过拦截请求。重新编译绕过的JustTrustMe1.apk
,下载安装如下:

image.png

勾选,重启设备 (真机需要重启设备xposed才能生效,模拟器软重启便可生效),再次请求登录数据包,客户端返回:

image.png

成功绕过客户端验证,成功抓取数据包,查看服务端返回数据包

image.png

这里客户端可尝试frida hook进行绕过那个两个网络拦截方法,可自己尝试。

服务端
服务器认证,是因为服务端存有客户端的公钥,客户端自己用私钥进行签名,服务端用公钥进行验证。
因此,客户端私钥一般都是存放在apk本身内,在apk里找到私钥,便可利用私钥对证书进行签名。

1、拿到apk,如果存在壳,先进行脱壳,不存在,则直接查看apk的目录,在assets目录下发现了用于双向认证的证书库文件,

image.png

要使用证书库,我们还需要找到证书库的密码,jeb反编译apk,搜索字符串证书名字字符串 :

image.png

反编译此方法:

image.png

发现证书调用KeyStore.getInstance方法进行签名,KeyStore.load的方法进行加载私钥,这里如果apk有壳(加固),可以通过hook这两个函数拿到签名方法与私钥。

伪造服务端信任证书,可使用Burpsuite进行操作,User options--->SSL--->Client SSL Certificates,点击Add:

image.png

结果

image.png

再次抓包,如下:

image.png

成功绕过服务器校验。

参考

1、https://github.com/WooyunDota/DroidDrops/blob/master/2018/Frida.Android.Practice.md

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容