Janus-CVE-2017 复现
0x1 背景
Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个Android应用程序没有经过数字签名,是没有办法安装到系统中的。Android通过数字签名来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序。这个数字签名由应用程序的作者完成,并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。然而Google在本月4日发布的Android安全公告中编号为CVE-2017-13156,这个漏洞被称为Janus漏洞,利用该漏洞可修改app而不影响原始签名。
0x2 利用点
Janus 漏洞(CVE-2017-13156)允许攻击者修改应用程序中的代码,而不会影响其签名。理论上,Android运行时加载APK文件,提取其DEX文件,然后运行其代码。实际上,虚拟机可以加载和执行APK文件和DEX文件。当它获得一个APK文件时,它仍然会查看标题中的魔术字节来决定它是哪种类型的文件。如果找到DEX标头,则将文件加载为DEX文件。否则,它将文件加载为包含带有DEX文件的zip条目的APK文件。因此它可能会误解双重DEX / APK文件。
攻击者可以利用这种二元性。他可以将恶意DEX文件添加到APK文件中,而不会影响其签名。然后,Android运行时接受APK文件作为合法早期版本的应用程序的有效更新。但是,Dalvik VM从注入的DEX文件加载代码。
要求
1、Janus漏洞影响运行Android 5.0+的设备
2、多用几个手机测试
3、下载工具
4、Python 2.7
0x3 编写主程序
主要apk代码

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(),"I am hooray",Toast.LENGTH_LONG).show();
}
}
生成apk,只使用V1签名,不使用V2签名,如下:

运行结果如图:

使用GetApkInfo.jar查看签名信息java -jar GetApkInfo.jar Janus.apk
:

发现没有经过V2签名
0x4 利用poc
将编译好的apk解压得到dex文件,baksmali.jar
反编译dex文件得到smali代码
java -jar baksmali.jar d classes.dex
会生成一个out目录,找到需要修改的地方,比如将hooray改成另外一个字符串,修改如下:

重打包dex,如下
java -jar smali.jar assemble out
生成out.dex,将dex放入原Janus.apk里,janus.py下载
python janus.py out.dex Janus.apk op.apk
运行op.apk(需要在5.0以上运行,我在8.0的手机上无法安装op.apk)

成功。
0x5 尝试
如果我们将其他的dex利用poc打包进poc会怎么样。我们找一个新的t1.dex

尝试打包进入apk
python janus.py t1.dex Janus.apk op1.apk
安装运行op1.apk。发现程序闪退
分析--->可能是程序的包名不一致,导致程序找到不入口点。我们尝试写一个包名一致的apk,然后提取dex,打包进去。
如下是有一个新的apk,只有一句话

提取出dex,改名为t2.dex。
尝试打包进入apk
python janus.py t2.dex Janus.apk op2.apk
安装运行op2.apk。发现程序还是闪退。思考中....希望大佬知道的私信我,谢谢...
0x6 问题
1、生成的apk不能再手机上运行,--->android studio上直接run,需要安装一下东西
2、nexus5 版本6.0上面成功不了,系统自己修复了(比较是谷歌亲儿子)
3、很多网上baksmali.jar不能运行,这里我自己找这个可以运行。