目录
  1. 1. 0x00 前言
  2. 2. 0x01 将mach-o转换为dylib
  3. 3. 0x02 集成到宿主App
  4. 4. 0x03 宿主App调用木马dylib
  5. 5. 0x04 总结
    1. 5.1. 参考:
iOS/macOS App注入毒液木马程序

*郑重声明:本文展示的攻击过程是在模拟环境中进行的。文中涉及的漏洞原理和攻击方法,只为交流学习之用。如有人用于非法用途,产生的后果笔者不负任何责任。

由于本人水平有限,不足之处还请大家多多指正。

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支持的生成木马格式如下图:

Executable Formats

那么如何将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

注入dylib可以使用monkeyDev,也可以使用其他注入工具,然后在注入的dylib入口函数处调用木马dylib即可。

0x03 宿主App调用木马dylib

要调用木马dylib,我们需要定位到木马动态库的入口函数。将木马dylib拖入IDA中,我们观察它的函数名。

dylib函数

从上图我们可以看到有个main函数,很明显这就是木马的入口函数,我们只要在注入的dylib中调用这个main函数就能启动木马。那怎么调用动态库里的方法呢?如果是OC函数可以直接用运行时调用,但这里要调用的是c函数,那就需要定位到这个c函数在内存中的地址。

  • 首先用dlopen把木马动态库加载到内存中
  • 然后通过_dyld_get_image_vmaddr_slide确定动态库在内存中的地址
  • 在IDA里找到main函数的偏移地址
  • 通过动态库的内存地址加上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功能正常,木马功能也正常。

iOS木马功能正常

另外,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/

http://iosre.com/t/dylib/5701

EOF

文章作者: Evi1024
文章链接: https://www.evi1024.com/2019/12/06/iOS-macOS-App%E6%B3%A8%E5%85%A5%E6%AF%92%E6%B6%B2%E6%9C%A8%E9%A9%AC%E7%A8%8B%E5%BA%8F/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Evi1024

评论