*郑重声明:本文展示的攻击过程是在模拟环境中进行的。文中涉及的漏洞原理和攻击方法,只为交流学习之用。如有人用于非法用途,产生的后果笔者不负任何责任。
由于本人水平有限,不足之处还请大家多多指正。
0x00 前言
在上一篇文章CVE-2019-8565 利用MSF对macOS提权中,我们使用msf的毒液模块生成了一个macOS下的木马App,但是这个App只是伪装了图标和名字,点击这个App却没有任何反应,这将会引起受害者的怀疑,并可能暴露木马程序。本文将介绍一种方法将木马程序嵌入到正常的App中,当受害者点击了这个App,App会正常运行,同时我们的木马程序也将在后台运行。
0x01 将mach-o转换为dylib
由于msfvenom只能生成mach-o格式的iOS/macOS平台木马程序,而我们要想让木马程序和宿主App同时运行,我能想到的最简单的办法就是把木马程序转换为dylib动态库,然后集成到宿主App中,并在宿主App启动的时候去调用木马dylib。msfvenom支持的生成木马格式如下图:
那么如何将mach-o转换成dylib呢?早在2016年的时候就有人实现了iOS App转动态库的黑科技,大致思路就是通过对比mach-o和dylib文件格式的异同点,然后将mach-o的格式修改为dylib的文件格式,具体实现细节可以查看作者开源工具的代码。
首先下载工具的源代码,然后通过make编译
git clone --recursive https://github.com/tobefuturer/app2dylib.git
cd app2dylib && make通过下面的命令将mach-o转换为dylib
./app2dylib /tmp/test -o /tmp/libTest.dylib
0x02 集成到宿主App
有了木马dylib,就需要将其嵌入到一个宿主App中。有两种方式嵌入:
- 将dylib注入到宿主App,宿主App启动时会自动加载注入的木马dylib
- 直接将dylib放入宿主App包中,通过注入另一个dylib的代码来调用木马dylib
第一种方式虽然dylib可以加载,但是没有入口函数,需要修改木马dylib的启动入口代码才能调用木马的函数,相对于这种修改方式第二种方式可以主动调用木马dylib的函数,这种方式要更为灵活一些。因此我们将使用这种方式。把动态库放入宿主App的包里,可以放放在文件比较多的地方,起一个比较常见的动态库的名字,以迷惑使用者。下图是macOS下放入宿主App的位置,名字可以起一个更具迷惑性的。
注入dylib可以使用monkeyDev,也可以使用其他注入工具,然后在注入的dylib入口函数处调用木马dylib即可。
0x03 宿主App调用木马dylib
要调用木马dylib,我们需要定位到木马动态库的入口函数。将木马dylib拖入IDA中,我们观察它的函数名。
从上图我们可以看到有个main函数,很明显这就是木马的入口函数,我们只要在注入的dylib中调用这个main函数就能启动木马。那怎么调用动态库里的方法呢?如果是OC函数可以直接用运行时调用,但这里要调用的是c函数,那就需要定位到这个c函数在内存中的地址。
- 首先用
dlopen
把木马动态库加载到内存中 - 然后通过
_dyld_get_image_vmaddr_slide
确定动态库在内存中的地址 - 在IDA里找到main函数的偏移地址
- 通过动态库的内存地址加上main函数的偏移地址就是main函数在内存中的实际地址
- 然后通过直接调用main函数内存地址启动木马
在调用main函数的时候有个问题就是,main函数有三个参数要如何获取。
通过IDA可以看到这三个参数就是应用程序常见入口函数main的参数,这里可以通过注入的dylib入口函数传入:
__attribute__((constructor)) void entry(int argc, const char **argv, const char **envp, const char **apple, struct ProgramVars *pvars)
OK,万事具备,运行测试一下效果如何,刚一启动App就崩溃了,报如下错误:
Warning: Libinfo call to mDNSResponder on main thread
通过在网上一番搜索,发现是在主线程调用了一些网络请求导致的,解决方法直接将main函数的调用放到非主线程即可。再次运行测试,App功能正常,木马功能也正常。
另外,macOS的需要生成mach-o格式的meterpreter反弹shell木马才行,shell的反弹会启动不了。
0x04 总结
本文以macOS平台为例,演示了一种正常App注入木马程序的方式,iOS也一样可以用这种方式注入木马,由于iOS有沙盒的限制,木马能实现的功能有限, 但是对注入的App有极大的危害,而且App能获取的权限木马也能获取,比如摄像头、GPS等,因此会导致用户隐私信息泄漏,甚至被盗号的风险。
参考:
http://blog.imjun.net/posts/convert-iOS-app-to-dynamic-library/
EOF