本章对之前的网络流量分析与Android逆向做个小结。
网络流量分析
原理解析
分析原理前之前先了解中间人攻击的概念:在中间人攻击中,攻击主机通常截断客户端和服务器的加密通信。攻击机以自己的证书替代服务器发给客户端的证书。通常,客户端不会验证该证书,直接接受该证书,从而建立起和攻击机的安全连接。这样,客户端发送的数据,都会被攻击机获取和解密。
这里主要分析应用层抓包,应用层Https抓包原理
有了Charles/burpsuite置于中间之后,本来C/S架构的通信过程会分裂为两个独立的通信过程,app本来验证的是服务器的证书,但是分裂成两个独立的通信过程之后,app验证的是Charles/burpsuite的证书,但是由于它并不是由手机内置的权威根证书签发机构签发的,所以手机根证书并不认可,然后导致app也不认可;所以我们要把Charles的证书导入到手机根证书目录中去,这样手机就会认可,如果app没有进行额外的校验(SSL pinning)的话,app也会直接认可接受。
工具简介与使用
- Wireshark:抓取本机网卡进出的流量,具体使用教程可参考:
- Burpsuite:
首先配置burp,在burpsuite的Proxy的Option中配置代理监听,ip设置为当前上网的网卡的ip,端口任意(设为8080): - 接着在手机端设置代理:
- 此时在手机端的浏览器里访问http://burp,下载证书并安装:
- 这时在手机上访问网站、使用APP等,就可以抓到HTTP和HTTPS包了。抓包示例:比如想抓登陆的包:
- 打开burp截断功能:
- 接着点击登陆按钮:
- 这样就截断了登陆的请求数据,可以看到POST请求中的手机号和密码都使用明文传输。
在Response处可以看到请求对应的回应: - 关掉截断功能可以抓所有的流量数据。
- Charles:通过将自身设置成系统的网络访问代理服务器,使得所有网络请求都通过它来完成,从而实现网络封包的截取和分析。
- 设置系统代理:
- 截取Https数据包通讯信息:截取分析Https协议相关内容,需要安装Charles CA证书:
- 安装成功后设置Charles抓取Https数据包,添加监听443端口:
- Android设备流量监听,在安卓设备上设置代理服务器ip及端口(默认8888):
- Android设备需与代理主机在同一网段,在Android设备网络设置菜单中进行代理设置:
- 连接代理服务器成功后下载证书(下载路径:chls.pro/ssl),安装证书后可以成功抓取Android设备流量。
示例:APP安全检测-隐私泄露、可疑流量行为隐私泄露检测:通过查看包内容检测应用是否上传用户隐私信息(wifi信息,应用包名列表,手机号等信息)。明文上传用户地址:
可疑流量行为:应用可能存在与远程C&C服务器通信、自动下载安装恶意应用包等行为。远程命令与控制C&C(command & control)服务器通信:
特殊情况
这里说的特殊情况就是指抓不到包的情况,常见的情形如下:
- Wifi直连:例如之前分析的某动mm商城,代码中String DEFAULT_PROXY=“http.route.default-proxy”表示定义可以被不使用JRE设置的默认路由规划者使用的代理主机,这个参数期望得到一个HttpHost类型的值。如果这个参数没有被设置,那么就会尝试直接连接到目标,这个参数会被HttpRoutePlanner使用,用来实现既不使用任何Java系统属性,也不使用系统或浏览器的代理设置。
- 解决方案如下:(1)安装ProxyDroid设置全局代理,将流量全部转发为wifi代理;(2)使用Package Capture抓取设备网卡中的网络流量。
- SSL-pinning:这里仅考虑单向校验问题。ssl pinning证书锁定是SSL/TLS加密的额外保证手段。它会将服务器的证书公钥预先保存在客户端。在建立安全连接的过程中,客户端会将预置的公钥和接受的证书做比较。如果一致,就建立连接,否则就拒绝连接。SSL Pinning在手机软件中应用较多。因为这些应用连接的服务器相对固定,可以预先将服务器的X509证书或者公钥保存在App中。运行时logcat输出:
- 证书存放位置:
- 解决方案:(1)Xposed工具 JustTrustMe模块;(2)Frida工具绕过Certificate Pinning (控制SSLContext)
- 双向认证:前面所说的https的抓包原理是基于中间人攻击的方式,但是这种方式都只适用于单向认证的方式,也就是只是客户端去检验服务端的证书。而双向认证的Https,服务端还会校验客户端的证书:
- 前面已经提到App与服务端通信已经分裂了,这时候与服务器进行通信的已经不是app,而是Charles了,所以我们要将app中内置的证书导入到Charles中去。因此首先要找到App找到证书文件然后再导入charles中:点击Proxy→SSL Proxy Settings→Client Certificates→Add添加新的证书,输入指定的域名或IP使用指定的证书即可:
- 一般apk进行解包,直接过滤搜索后缀名为p12的文件就是证书文件,有的证书文件会进行加密或伪装,可以反编译查看源码使用hook得到密码。
Android逆向
smali语法
smali、baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种dex格式文件的汇编器和反汇编器,其语法实现了.dex格式所有功能(注解、调试信息、线路信息等),部分smali指令如下:
部分条件跳转分支指令如下:
smali语法案例分析:
对应smali语法如下:
静态分析恶意软件大致流程
首先看AndroidManifest.xml文件:
分析Manifest文件时首先看入口点,再看入口界面:
入口点这里会有个android:name属性为自定义Application,一些软件会在入口点这里做一些恶意操作。入口点处分析时一般分析attachBaseContext和onCreate方法,前者先执行:
再分析MainActivity入口界面,一般也是直接找onCreate方法,有onStart的话也看下onStart方法:
然后再查看启动了什么服务,注册了什么广播:
一般情况下软件恶意操作都会比较耗时,为了防止造成ANR,一些恶意操作都会在Service中开一个线程执行或者使用IntentService,所以一般看到Service中开了线程的或者启动IntentService的需要特别关注一下。receiver中不能进行耗时操作,也不能开启子线程,以防止ANR情况,因此常见的是在receiver中启动Service,然后Service中开一个线程。分析时可查看应用中可能会执行恶意操作的系统广播,例如屏幕关闭等。
常见的恶意操作例如获取短信数据、通讯录信息、通话信息等,和隐私泄漏检测项大多相同。
- 通讯录信息:包括手机联系人姓名、电话号码等信息;
- 短信以及通话记录信息:包括短信内容、短信联系人、通话记录的详细信息;
- 地理位置信息:详细的地理位置信息例如经纬度信息、ip地址等;
- 设备相关信息:包括设备唯一标识符imei码、mac地址、电话号码、imsi码、device_id等信息;
- 已安装应用信息:获取设备已安装应用列表信息;
- 相册、录音、视频等多媒体隐私信息;
- 其他个人隐私信息:例如使用app时输入的身份标识(身份证、护照等)、银行卡信息、居住地址等其他个人隐私信息。
目前恶意软件窃取隐私信息的方式主要包含两种途径:
- 通过网络请求的方式:通过特定的API将个人隐私信息通过网络请求的方式发送到服务器。
- 通过短信的方式:将个人隐私信息通过短信的方式发送到特定号码并在发送之后调用特定API删除短信以防止用户发现。
Frida-Java层Hook实例
Frida使用流程:手机端安装frida-server程序,开启手机端端口转发,PC端通过python脚本进行通信,python中的需要hook的代码通过javascript语言实现。环境配置如下:
(1)电脑端下载frida工具包:pip install Frida;
(2)手机端frida-server安装:
- 工具下载地址:https://github.com/frida/frida/releases
- 将应用包导入设备/data/local/tmp路径下
- 授权操作:chmod 755 frida-server(root权限下)
- 运行server:./frida-server
- adb开启端口转发:adb forward tcp:27042 tcp:27042;adb forward tcp:27043 tcp:27043
一般分析流程如下:
- 反编译apk静态分析代码,寻找hook点
- 编写js代码,调用类的方法或者替换
- 在python中执行脚本
- 经常配合DDMS使用