0x01 前言
AndroTickler是一款用于Android应用程序渗透测试和审计的工具包。AndroTickler提供了许多信息收集功能,包括静态和动态检查。本文主要记录一下在使用过程中所遇到的问题和解决的方法。
本文的测试环境如下:系统为win10 x64,jdk版本为java8,gradle版本为4.1。采用了夜神模拟器。
主要包括以下几个方面。
1.编译环境的准备
2.使用过程中遇到的问题以及解决方法
0x02 编译环境的准备
1. Gradle的安装
首先需要安装Java,我采用的是Java8(安装工具说明,需要Java7以上)。下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html。(安装过程省略)
关于gradle的安装可以参考https://gradle.org/install/,我这里是直接下载安装包https://services.gradle.org/distributions/gradle-4.4.1-bin.zip,解压之后添加环境变量。
2. cmder工具安装
该步骤非必需,可以省略。
下载地址:https://github.com/cmderdev/cmder/releases/
解压添加环境变量即可使用。
使用该工具除了界面好看外,可以多个tab,也可以运行部分linux命令。当然也可以使用其他工具,如cygwin。如果没有使用这类工具的话,需要将代码中一些命令修改,如cp命令。
3. Git工具安装
该步骤非必需,可以省略。
下载地址:https://desktop.github.com/
安装即可。然后下载AndroTickler
4. 其他工具安装
还需要安装adb, sqlite3, strings等工具。
adb的话安装夜神模拟器的时候自动,名字为nox_adb,功能一样。
sqlite3可以用https://www.sqlite.org/下载。
strings的官网,https://docs.microsoft.com/en-us/sysinternals/downloads/strings,下载地址为:
https://download.sysinternals.com/files/Strings.zip。解压后加入环境变量即可。
然后就是开始编译和使(入)用(坑)了。
0x03 排错指北
上面环境已经搭建好了,代码也下载了,然后就开始入坑吧。
编译的话很简单,使用命令gradle && gradle build即可。
然后会在buildlibs目录下生成AndroTickler.jar文件。
软件生成了,那么看看有什么功能吧,使用命令:
java -jar AndroTickler.jar -h
貌似一切正常。下面开始查看安装的app。
使用命令
java -jar AndroTickler.jar -pkgs
并没有返回安装的app
已知列出已经安装的app命令是
adb shell pm list package
而我用的模拟器,所以应该使用命令是
nox_adb shell pm list package
所以这里要替换程序中的adb为nox_adb。
这里我用idea来打开代码
然后将命令中的adb替换为nox_adb即可
替换后重新编译并查看已安装的app。
发现列出了安装过的app。虽然有警告,暂且不管。
查找特定的app并查看信息
发现报错,提示没有连接的设备。
通过adb查看连接的设备。
nox_adb devices -l
发现有,但是使用工具未查看到。
通过错误的信息,定位到initializationTicklerChecks.java的checkDevices方法。
publicvoidcheckDevices() throwsTNotFoundEx{
Stringcommand="nox_adb devices -l";
Commandocommando=newCommando();
Stringop=commando.executeCommand(command);
OtherUtiloU=newOtherUtil();
ArrayListdevices=oU.getRegexFromString(op,"(model:.*?device:.+$?)");
inteligDevices=devices.size();
if(eligDevices>1)
thrownewTNotFoundEx("ERROR: 2 or more Android devices are connected to the host, please connect only one Android device.");
if(eligDevices ==)
thrownewTNotFoundEx("ERROR: No Android devices detected by the host. Execute adb devices -l to check the connected devices");
}
发现通过命令查询的结果为:
List of devices attached
127.0.0.1:62025 device
明显通过正则不能匹配,那就改正则了。
为了方便,直接改为
ArrayListdevices=oU.getRegexFromString(op,"(.*device\n)");
然后编译运行。
这个提示libs需要和jar文件在同一目录。将Tickler.conf和libs复制到与AndroTickler.jar同一目录。
竟然报同样的错误,而且该目录下出现了一个H的文件夹。
通过错误的信息,定位到initializationTicklerChecks.java的checkExternalLibDir方法。
privatevoidcheckExternalLibDir() throwsTNotFoundEx{
StringjarLoc=this.getJarLocation();
StringlibDirLoc=jarLoc+TicklerConst.generalLibName;
FiletickLib=newFile(libDirLoc);
if(tickLib.exists()){
TicklerVars.isLib=true;
TicklerVars.libDir= libDirLoc;
}
//Lib directory not found
else
{
thrownewTNotFoundEx("Lib directory not found.nMake sure that "+TicklerConst.generalLibName+" directory exists in the same directory as Tickler.jar");
}
}
查看代码,tickLib由jarLoc和TicklerConst.generalLibName拼接,而TicklerConst.generalLibName是常量,所以需要查看jarLoc是如何获取的。跟进getJarLocation方法
publicStringgetJarLocation(){
FilemyJar;
try{
FilemyJar1=newFile(System.getProperty("java.class.path"));//获取jar路径
myJar =myJar1.getAbsoluteFile().getParentFile();//获取jar上级目录
}
catch(Exceptione){
myJar =newFile(".");
}
StringjarLoc=this.correctJarLoc(myJar.getAbsolutePath());
returnjarLoc;
}
首先获取了运行的jar的路径,然后获取其父路径并将其值赋值给myJar。然后调用了correctJarLoc方法。
进行跟进correctJarLoc方法,进去查看
publicStringcorrectJarLoc(StringjarLoc){
StringfinalLoc=jarLoc;
if(jarLoc.contains(":"))//wtf? 造成问题的代码
finalLoc =jarLoc.substring(,jarLoc.indexOf(":"));//wtf? 造成问题的代码
Matcherm=Pattern.compile("\s+(.+)").matcher(jarLoc);
if(m.find())
finalLoc =m.group(1);
if(finalLoc.matches(".+\n$")){
finalLoc =finalLoc.substring(,jarLoc.length()-1);
}
if(finalLoc.matches(".+\.$")){
finalLoc =finalLoc.substring(,jarLoc.length()-1);
}
if(!finalLoc.matches(".+/$")){
finalLoc = finalLoc+"/";
}
returnfinalLoc;
}
然后立马发现问题的所在了。这里因为是windows系统,所以路径出现:是很正常的,而这里直接截取了盘符。
这就是出现了一个名为H的文件夹的原因。
解决方法:删除这两行代码即可。
之后再编译运行。
编译运行后发现警告没了,但新的错误出现了。
通过错误信息定位到apkApkToolClass.java的apkToolDecode方法。暂时先利用下面代码替换。
//File file = new File("/dev/null");
Filefile=newFile("H:\tmp\");
从之后文件的内容来看,该文件里面会记录一些操作记录。所以可以设置为电脑某一个存在的路径即可。
再次编译运行,没有任何结果信息也没有报错。
已知安装过的app保存位置为:/data/app
修改Tickler.conf文件
Tickler_local_directory = H:/workspace/eclipse/AndroTickler/build/libs/
Tickler_sdcard_directory = /data/app/
Frida_server_path = /data/local/tmp/frida-server-10.3.14-android-arm
然后通过调试,来寻找错误的地方(这里的图为之前调试的图( ╯╰ ))
执行的命令为:
nox_adb pull /data/app/com.jnu.ctf2017-1.apk H:/AndroTickler/com.jnu.ctf2017//
测试后发现,使用adb pull导出文件时,pc的路径最后不能有或者/
修改baseFileUtil.java中copyDirToHost方法
// this.pullFromSDcard(TicklerVars.sdCardPath+srcName, dest+"/"); by fuping
this.pullFromSDcard(TicklerVars.sdCardPath+srcName, dest);
修改baseFileUtil.java中pullFromSDcard方法
publicvoidpullFromSDcard(Stringsrc,Stringdest) {
StringfName=this.getFileNameFromPath(src);
this.warnOverrideAndDelete(dest+fName);
//by fuping
Filef=newFile(dest);
if(!f.exists()){
f.mkdirs();
}// by fuping
dest =f.getPath();
Stringcommand="nox_adb pull "+src+" "+dest;
this.deleteDirFromDevice(src);
}
然后编译运行。
还有一些需要更改的地方,例如将代码中调用dex2jar-2.1的.sh脚本改为.bat 。
此时这个工具才能算可以使用,还有其他功能(例如Frida),我并未测试。当然还可能还会有其他问题,这里就不再深入了。
这里放上一个查看app详细信息的结果。
可以看到安装日期、使用权限、数据库存储等等信息,当然也可以进一步动态静态分析了。
0x04 总结
虽然看起来在运行的时候有很多坑,但其原因也是环境的问题(我采用的是Windows)。而且我使用了模拟器而不是真机,所以也可能造成一些问题。但是这些都是无关紧要的,都是很小的错误,修改一下就可以用了。我这里仅仅使用了查看app信息的功能,并未测试其他功能。更多功能可以参考https://github.com/ernw/AndroTickler。
领取专属 10元无门槛券
私享最新 技术干货