app渗透测试
无校验直接抓:
burp + wifi改手动代理/shadowrocket(clash)
charles + burp
stream直接抓包(IOS)
https
如果有些https,在设置了好各种证书和配置后,看到的:要么是unknown,要么是加密的乱码,要么是报错无法抓包。无法看到希望的明文数据,最大可能是,对方用了https的SSL pinning
注:接口显示:
CONNECT 含义: HTTP 8种Method中的一种
作用:HTTP /1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于 SSL 加密服务器的链接(经由非加密的 HTTP 代理服务器,并非所有的 http 隧道支持 connect 方法
Http 隧道分为两种:不使用 CONNECT 的隧道 和 使用 CONNECT 的隧道
Http CONNECT 相当于客户端和服务器之间建立的一个隧道,而通过这个隧道的请求是加密的,所以 CONNECT 方式的请求使用抓包是抓不到,是无法查看 https 的原文,明文的信息的
SSL pinning
SSL pinning=证书绑定=SSL证书绑定
对方的app内部只承认自己的特定的证书,此处Charles的证书不识别,不允许,导致 Charles 无法解密看到 https 的明文数据
相关解决思路和方案:
作为app的开发者:改自己app的配置,允许 https 抓包 (前提是得到或本身有 app 的源码)
绕开 https 不去校验:
借助于其他(JustTrustMe等)工具绕开 https 的校验 (需要借助其他 XPosed 等框架配合才可以)
修改app增加配置,允许https抓包
通过修改 app 的配置,使得允许 https 抓包。修改 app 的配置分两种:
自己有源码:可以通过修改源码的方式去添加允许 https 抓包的配置
自己没源码,只有 apk:借助第三方工具修改 apk,增加配置,允许 https 抓包
比如借助第三方工具:https://github.com/levyitay/AddSecurityExceptionAndroid
1 | cd AddSecurityExceptionAndroid |
即可给 apk 增加允许 https 抓包的配置了,然后就可以继续用Charles抓包https
绕过ssl pinning
绕开/禁止 SSL pinning 的插件
Android(root)
Xposed / Ldposed + JustTrustMe
iOS
shadowrocket全局代理
越狱 cydia + ssl-kill-switch3
免越狱 Sideloadly(自签软件)注入dylib到ipa包中
即可绕开ssl的验证,抓包到https被解密变成明文的数据
双向认证
双向认证,服务端会校验客户端(也就是我们的app)的证书,客户端也会校验服务端的证书
双向证书校验要破解有: 1.证书密码 2.cer或者p12证书
方法一:
因为 APP 能正常跟服务端通信,所以真正的证书肯定是在 APP 里面。所以就是要想办法从 APP 里抠出证书。
抠证书有开源的 Frida Hook 脚本。如下地址是开源作者写的 Frida Hook 脚本 https://gist.github.com/ceres-c/cb3b69e53713d5ad9cf6aac9b8e895d2gfgg。可以把证书从内存里读出来保存到本地,并且证书密码也能读出来
该脚本的原理是: 因为 APP 在向服务端发请求时, APP 肯定会操作证书,所以如果能找到 APP 操作证书的代码地方, Hook 这部分代码,对参数做些输出打印,证书和证书密码就都有了
大部分情况下,我们不用非常熟悉安卓原理,比如安卓在代码层面是如何操作证书的。查阅资料可以知道,安卓操作证书通常是 java.security.KeyStore 这个类,然后再了解下这个类的用法,参数形式,就可以尝试去Hook了。上述脚本就是 Hook java.security.KeyStore 这个类的 load 方法,load 方法的形参就是我们需要的证书和密码。 抠出的证书和密码,配置进 fiddler 或 charles 里面,就可以抓到双向认证的包
PS: 还要注意证书的格式,抠出的证书可能是 jks 或 bks 格式的,fiddler 可能需要 p12 格式的, 所以要找工具先转换一下格式
方法二:
如果只是想抓包,还有另一种不需要抠证书的方法
虽然 https 在传输过程中是加密的,但在终端显示的时候,必然会解密,不然 APP 上都没法显示了。所以如果能知道安卓解密 SSL 加解密是哪个类, Hook 这个类, 类里相关方法的输入输出肯定就是传输的明文数据。所以可以查阅资料,看看相关类的用法,就可以尝试去 Hook 打印输出看看情况。
也有开源作者开源了该 Hook 脚本, 比如 5alt 在google开源的脚本基础上做了修改了的 ssl_logger https://github.com/5alt/ssl_logger 能够 Hook SSL 加解密的地方,它会把传输的数据保存为 pcap 格式。再使用 wireshark 打开该 pcap文件, 在 wireshark 上就可以看到明文的数据了。
如果要模拟向服务器发送请求的话,还是只能使用第一种方法,因为客服端必须要提交正确的证书,服务端才会正确响应。必须得抠出证书,模拟请求时必须带上证书,才能请求到数据。安卓上的证书好多是 jks/bks格式的, 如果使用 Python requests 库的话, 不支持这个格式, 所以要想办法把证书转成 cert 格式的。
上面两种方法都是使用 Frida 进行 Hook ,所以要有 Root 过的手机和明白Frida 怎么使用就能搞定。 对于爬虫来说,搞定抓包和请求参数加密的问题,大部分 Hook ,都可以通过 Hook 安卓系统 API 来找到 APP 代码位置,或直接搞定
代理检测
检测到有代理退出或不发送请求
解决方法1(推荐):安卓root设备使用ProxyDroid/Drony代理软件可以绕过,ios使用shadowrocket全局代理或者用stream直接抓包
安卓设备设置全局代理:
1 | adb shell settings put global http_proxy 127.0.0.1:1984 |
查看代理是否设置成功:
1 | adb shell settings get global http_proxy |
取消代理设置:
1 | adb shell settings put global http_proxy :0 |
解决方法2:逆向找到检测代理的位置,修改程序逻辑(Patch程序,hook等)
网络协议
应用层:用户使用的应用程序都归属于应用层,抓包工具如fiddler、Charles,都只能抓应用层的协议
传输层:tcp、udp,用wireshark可以抓取
网络层:ip协议
Socket通信是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,不是协议,fiddler/charles抓不到
pc版本的qq客户端也抓不到包,因为他没有用http协议,而是用的tcp协议
私有协议:这种不是通用的协议,wireshark能抓到,不知道协议细节,解不了包。需要分析APP协议解析部分
路由器抓包:网络组网方式,因为所有的流量都要从路由器过,使用特殊的路由器,可以进行路由器抓包
Frida
frida是一款基于python + javascript 的hook框架,可运行在android/ios/linux/win/osx等各平台,主要使用动态二进制插桩技术Dynamic Binary Instrumentation(DBI)
DBI做些什么呢
(1)访问进程的内存(2)在应用程序运行时覆盖一些功能(3)从导入的类中调用函数
(4)在堆上查找对象实例并使用这些对象实例(5)Hook,跟踪和拦截函数等等
mac:pip3 install frida-tools
1 | adb forward tcp:1234 tcp:1234 |
andriod/iOS:安装对应版本和架构的frida-server
1 | ./frida-server -l 0.0.0.0:1234 |
tcpdump
tcpdump是linux下的抓包工具,需手动下载安装
1 | // 将tcpdump push到/data/local/目录 |
AndriodKiller
https://github.com/MaskCyberSecurityTeam/AndroidKiller4J
Smali文件
Android程序员用Java语言开发APP,编译工具会将Java源文件(.java)编译成Dalvik可执行文件(.dex)。Android系统中Dalvik Virtual Machine 会执行该文件。smali/baksmali则是Dalvik VM可执行文件的汇编器/反汇编器。反汇编Dalvik可执行文件(.dex)后,将会得到.smali后缀文件。smali代码拥有特定的语法。相比于.dex文件,smali文件的语法更容易理解些。下面是.dex文件、.smali文件、.java文件三者之间的转化关系
adb
安卓调试桥 (Android Debug Bridge, adb),是一种可以用来操作手机设备或模拟器的命令行工具
可以使用 adb install [option] <path>
命令来将电脑上的一个 APP 安装到手机上
1 | adb push foo.apk /sdcard/ #电脑传到手机 |
在Android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am
启动的方法为adb shell
am start -n {包(package)名}/{包名}.{活动(activity)名称}
Android 11无线调试
1 | adb pair ip:port |
appid、appkey、appsecret
AppID: 应用的唯一标识 AppKey: 公匙(相当于账号) AppSecret:私匙(相当于密码) token:令牌(过期失效)
app_id 是用来标记你的开发者账号的, 是你的用户id, 这个id在数据库添加检索, 方便快速查找
app_key 和 app_secret 是一对出现的账号, 同一个 app_id 可以对应多个 app_key+app_secret, 这样平台就可以分配不一样的权限。比如 app_key1 + app_secect1 只有只读权限 但是 app_key2+app_secret2 有读写权限,这样就可以把对应的权限放给不同的开发者。其中权限的配置都是直接跟app_key 做关联的, app_key 也需要添加数据库检索,方便快速查找
至于为什么要有app_key + app_secret 这种成对出现的机制呢, 因为要加密, 通常在首次验证(类似登录场景) , 需要用app_key(标记要申请的权限有哪些) + app_secret(密码, 表示你真的拥有这个权限) 来申请一个token, 就是我们经常用到的 access_token, 之后的数据请求直接提供access_token就可以验证权限了
简化的场景:
省去 app_id, 默认每一个用户有且仅有一套权限配置, 直接将 app_id = app_key , 然后外加一个app_secret就够了
省去app_id 和 app_key, 相当于 app_id = app_key = app_secret, 通常用于开放性接口的地方, 特别是很多地图类api 都采用这种模式, 这种模式下, 带上app_id 的目的仅仅是统计某一个用户调用接口的次数
appSecret是小程序的唯一凭证密钥,也是获取小程序全局唯一后台接口调用凭证(access_token)的重要参数。appSecret密钥泄露漏洞的危害包括但不限于:获取小程序用户访问数据、冒用小程序身份给用户发送客服消息/模板消息、获取小程序session_key(用于解密微信侧提供的用户敏感数据)、获取小程序运维信息、日志等敏感信息、更改小程序相关的配置等
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
实战app测试
逻辑漏洞为主:参数替换 修改返回包
反汇编/脱壳后源码中敏感信息泄漏(微信小程序secretkey/内网ip地址)
不安全的证书(未使用HTTPS证书绑定/客户端证书/越狱检测root检测)
不安全的本地文件存储
Activity 劫持
线上环境未删除debug页面: adb shell
进入adb,输入命令
1 | am start com.xxx.xxx/com.xxx.xxx.home.ui.activity.debug.DebugSettingActivity |
其他正常测