声明
郑重声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
前言
本文思路来着公众号小和尚的安全之路,菜鸡的我被社会毒打了一顿,但是这玩意我没接触过,刚好今天看到一篇文章,学习一下
首先准备工作
XposedInstaller(Xposed安装器)
JustTrustMe(禁用SSL)
ida pro(静态逆向程序)
JEB(apk解包程序)
test.apk(目标程序)
所需文件位置下载
https://github.com/Ascotbe/virus/blob/master/HttpCertificate
解决单向认证
刚开始安装好APK是显示框架未安装的
点击这个安装
选择安装
接着点击安装
然后重启后就能看到安装成功了
点击左上角的菜单
然后选择模块
勾选就好了,这样就解决了单向认证,可以绕过客户端校验了
解决双向认证
我们来把目标程序抓个包
可以看到服务器显示为400,抓包无法用了
接下来就是客户端的证书了,我们先解压这个软件
然后全局收缩这个软件的证书一般是.p12
或者.pfx
结尾的(如果这个版本有壳你嫌麻烦不想脱壳的话可以找之前的版本试试)
首先需要设置jeb的最大内存不然会报错,因为大的APK会导致java内存溢出,替换jeb_wincon.bat文件中的内容,-Xmx8192m
表示内存的大小
%JAVA% -jar "%~dp0binappjebc.jar" %* //替换为 %JAVA% -Xmx8192m -XX:-UseParallelGC -XX:MinHeapFreeRatio=15 -jar "%~dp0binappjebc.jar" %*
打开test.apk,利用搜索来找client.p12的值(或者关键字PKCS12,这是通常读取证书需要用到的关键字)
对字符串的位置进行右键解析
往下面找找看有没有什么open之类的函数来打开证书的
这边大概的意思就是把打开的证书和数组中的字符串加载到v4_1
这个函数中,然后跳转到label_27
中进行关闭打开的证书,所以百分之80可以断定v1
应该就是我们需要的密码
跟进v1
的值(双击即可)
跟进到这边发现调用了好几个值,由于我是菜鸡对JAVA不是很懂,就每一个值都看了一遍,发现SoulNetworkSDK.b().a(SoulNetworkSDK.b().g())
中的b和g都是返回值并且不能跟进了,而a函数可以跟进并且函数名为getStorePassword
,那百分之90可以确定a函数就是我们需要的函数
继续跟进它
再接着跟进,看到了private native String getStorePassword(String arg1)
这个声明方法,wtf?线索断了?接着我百度了一下native
方法发现,native
关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。然后看来下用例,原来 会加载一个文件一样的东西,大概的例子和下面类似,然后我们找这个类有什么文件加载的
class HelloWorld{
public native void hello(String name);
static{
System.loadLibrary("hello");
}
public static void main(String[] args){
new HelloWorld().hello("jni");
}
}
最后在开头的地方找到了
soul-netsdk就是调用的libsoul-netsdk.so文件,然后我们去解压的文件中找这个名字
我们用IDA打开它,然后全局搜索之前找到的那个函数名getStorePassword
,为什么要搜索这个函数名呢,因为.SO文件是Linux下的动态链接,其功能和作用类似与windows下.dll文件,而getStorePassword
就类似于一个导出函数
然后F5即可看到伪代码了,并且密码也出来了
利用这个密码和之前那个证书进行安装
安装成功
接着我们再次尝试抓包,成功
参考文章
https://www.jianshu.com/p/042ce0b88f03 https://mp.weixin.qq.com/s/0uItUS5P8gFQ1Cu5-jkCgQ
本文作者:ascotbe
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/137889.html