在Android中,开发者可以自由实现SSL通信,然而很多企业出于业务性能的考虑以及安全意识的欠缺,软件在实现https通信时忽略了证书校验或证书校验不严格,致使用户的敏感数据在传输过程中有可能遭受中间人攻击而泄露。

Android中SSL通信的不安全实现一般来源于下面5处:

1.自定义TrustManager,接管了系统原有的证书校验,checkServerTrusted()函数却是空实现。
2.自定义hostnameVerifier,verify()函数却总是返回true。
3.使用AllowAllHostnameVerifier进行实例化,信任任意的hostname。
4.使用不安全的SSLSocketFactory来禁用所有的SSL安全校验。
5.WebView遇到证书错误直接使用proceed()函数忽略继续。

常用路径

Context.getExternalFilesDir()方法和Context.getExternalCacheDir()方法获得的两个目录分别对应 设置->应用->应用详情里面的”清除数据“与”清除缓存“选项。

Environment.getDataDirectory() = /data
Environment.getDownloadCacheDirectory() = /cache
Environment.getExternalStorageDirectory() = /mnt/sdcard
Environment.getExternalStoragePublicDirectory(“test”) = /mnt/sdcard/test
Environment.getRootDirectory() = /system
getPackageCodePath() = /data/app/com.my.app-1.apk
getPackageResourcePath() = /data/app/com.my.app-1.apk
getCacheDir() = /data/data/com.my.app/cache
getDatabasePath(“test”) = /data/data/com.my.app/databases/test
getDir(“test”, Context.MODE_PRIVATE) = /data/data/com.my.app/app_test
getExternalCacheDir() = /mnt/sdcard/Android/data/com.my.app/cache
getExternalFilesDir(“test”) = /mnt/sdcard/Android/data/com.my.app/files/test
getExternalFilesDir(null) = /mnt/sdcard/Android/data/com.my.app/files
getFilesDir() = /data/data/com.my.app/files

android ssh 自动化 android ssh tunnel_xml

查看某app的签名版本

adb shell pm dump com.example|grep apkSigningVersion

命令行查看系统版本号

adb shell getprop ro.build.version.release

android ssh 自动化 android ssh tunnel_android_02

根据界面元素id定位代码

uiautomatorviewer

获取机器wlan0无限网卡的MAC地址:

adb shell cat /sys/class/net/wlan0/address

android ssh 自动化 android ssh tunnel_Android_03

查看WIFI密码

root@hammerhead:/data/misc/wifi # cat wpa_supplicant.conf

android ssh 自动化 android ssh tunnel_apk_04

列出所有的包名

$ adb shell pm list packages

拨打电话

$ adb shell am start -a android.intent.action.CALL -d tel:10086

打开网页

$ adb shell am start -a android.intent.action.VIEW -d https://www.baidu.com

查看后台service列表

$ service list

android ssh 自动化 android ssh tunnel_android ssh 自动化_05

从已安装的包中得到其入口Activity

这种情况适用于apk已安装在设备上,不方便将其提取到本地,直接在adb shell中操作。

$ adb shell dumpsys package  com.example.cctf|head -6
Activity Resolver Table:
  Non-Data Actions:
      android.intent.action.MAIN:
        25d58f8 com.example.cctf/.MainActivity filter 1e3f12b9
          Action: "android.intent.action.MAIN"
          Category: "android.intent.category.LAUNCHER"

android ssh 自动化 android ssh tunnel_android ssh 自动化_06

从apk的AndroidManifest.xml中提取入口Activity

这种情况适用于apk文件直接在本地,直接对其分析

方法一:python脚本

其实就是用Python的zipfile读取其AndroidManifest.xml文件然后用一个jar包工具解析二进制的manifest文件,从所有activity中找到属性为android.intent.action.MAIN的Activity。
参考:
https://github.com/DrizzleRisk/BUnpacker/blob/8e92b42b0e02c0721656c870612cd1482bea73c2/bunpacker.py

import os, sys
import zipfile  # 用于解压apk包
from xml.dom import minidom # 用于xml解析操作

PACKAGE_NAME = ''       # 应用包名
START_ACTIVITY = ''     # 启动的Activity
APK_PATH = sys.argv[1]  # apk文件所在路径为从命令行传入的第一个参数
nxml = open('tmp/nxml.xml','w') # 打开空的xml文件待写入manifest信息
zf = zipfile.ZipFile(APK_PATH, 'r')
content = zf.read('AndroidManifest.xml') # 读取manifest文件内容
nxml.write(content)   将读取到的manifest文件写入xml中
nxml.close()
content = os.popen('java -jar ext-tools/AXMLPrinter2.jar tmp/nxml.xml').read()
mfest = minidom.parseString(content)  # 使用minidom解析manifest内容
manifest = mfest.getElementsByTagName('manifest') # 得到根
activities = mfest.getElementsByTagName("activity") # 得到所有的activity
for node in manifest:
    PACKAGE_NAME = node.getAttribute("package") # 遍历manifest的各个节点,找到package名
   for activity in activities:
   # 找到入口Activity
            for sitem in activity.getElementsByTagName("action"):
                val = sitem.getAttribute("android:name")
                if val == "android.intent.action.MAIN" :
                    START_ACTIVITY = activity.getAttribute("android:name")

还挺好用的。

android ssh 自动化 android ssh tunnel_xml_07

方法二:使用Android的SDK自带的build-tools/aapt工具

不过其实用build-tools/aapt工具就可以了,基本信息就可以一目了然了。

[~/Downloads/apk/lanxin_v3.4.1_from_apkpure]$ aapt dump badging lanxin_v3.4.1.apk|head -1     [22:58:16]
package: name='com.unicom.gudong.client' versionCode='52508' versionName='3.4.1' platformBuildVersionName=''
[~/Downloads/apk/lanxin_v3.4.1_from_apkpure]$ aapt dump badging lanxin_v3.4.1.apk|grep "launchable-activity"
launchable-activity: name='com.comisys.gudong.client.LoadActivity'  label='「蓝信」' icon=''

然后将两个命令通过 && 合起来即可。

android ssh 自动化 android ssh tunnel_android_08


可以将其写成脚本。

$ mv apk_info.sh /usr/local/bin/apk_info
$ which apk_info                             [0:10:59]
/usr/local/bin/apk_info

android ssh 自动化 android ssh tunnel_apk_09

查看当前前台Activity

[~/GitProjects]$ adb shell dumpsys activity top |head -2                                       [1:07:34]
TASK cn.nubia.launcher id=23520
  ACTIVITY cn.nubia.launcher/com.android.launcher3.Launcher 6b836aa pid=1819

可显示pid,比下面的要好

[~/GitProjects]$ adb shell dumpsys window windows | grep -E 'mCurrentFocus'                    [1:07:02]
  mCurrentFocus=Window{6ddf61 u0 cn.nubia.launcher/com.android.launcher3.Launcher}

使用jadx以反混淆的方式dump出apk

这里将unpack_demo.apk以反混淆的方式dump到./jadx-gui目录。

[~/Downloads/android]$ jadx unpack_demo.apk -d ./jadx-gui --deobf                              [0:00:40]
00:01:42 INFO  - loading ...
00:01:42 WARN  - Unknown 'R' class, create references to 'loading.androidmanual.R'
00:01:42 INFO  - processing ...
00:01:49 INFO  - done

结果为:

android ssh 自动化 android ssh tunnel_android_10