1、Mac远程登录到iPhone

我们经常在Mac的终端上,通过敲一些命令行来完成一些操作,iOS和Mac OS X都是基于Darwin(苹果的一个基于Unix的开源系统内核),所以iOS同样支持终端的命令行操作,在逆向工程中,我们经常会通过命令行来操纵iPhone。
为了能够让Mac终端中的命令行能作用在iPhone上,我们得让Mac和iPhone建立连接,通过Mac远程登录到iPhone的方式建立连接。
image.png

2、SSH、OpenSSH

2.1、SSH

Secure Shell的缩写,意为“安全外壳协议”,是一种可以为远程登录提供安全保障的协议,如下图所示:
image.png

sniffer:嗅探器/抓数据包软件

2.2、OpenSSH

是SSH协议的免费开源实现,可以通过OpenSSH的方式让Mac远程登录到iPhone。

3、使用OpenSSH远程登录

3.1、安装工具

在iPhone上通过Cydia安装OpenSSH工具
image.png

3.2、使用步骤

SSH是通过TCP协议通信,所以要确保Mac和iPhone在同一局域网下(比如连接同一个WiFi)。SSH登录指令是: $ ssh 账户名@服务器主机地址,例如:$ ssh root@192.168.1.7

  1. The authenticity of host '192.168.1.7 (192.168.1.7)' can't be established.
  2. RSA key fingerprint is SHA256:7d6HK72WlciJMFiS9BcwGHdJS3pkP4UXwdMyHS55Tk0.
  3. This key is not known by any other names
  4. Are you sure you want to continue connecting (yes/no/[fingerprint])?

输入yes后会提示输入密码,iPhone远程登录的初始密码是:alpine,输入密码后当终端显示 root# (切换到了root账户),就代表已经登录成功了,登录成功后就可以使用终端命令行来操作iPhone了。
退出登录命令是 $ exit 。

3.3、root、mobile

iOS下有2个常用账户,root和mobile,其中:
root 是最高权限账户,$HOME是/var/root
mobile 是普通权限账户,只能操作一些普通文件,不能操作系统级别的文件,$HOME是/var/mobile

可以通过 pwd 或者 *echo $HOME 命令来查看用户文件夹路径

登录mobile账户方式与登录root账户方式一致,在终端输入:$ ssh mobile@192.168.1.7,默认密码与root账户相同,当终端显示 mobile$(切换到了mobile账户),就代表已经登录成功了。
最好修改一下root和mobile用户的登录密码(登录root账户后,分别通过 passwdpasswd mobile 命令修改)

4、SSL、OpenSSL

4.1、SSL

Secure Sockets Layer的缩写,是为网络通信提供安全及数据完整性的一种安全协议,在传输层对网络连接进行加密。

4.2、OpenSSL

是SSL的开源实现,绝大部份HTTPS请求等价于:HTTP + OpenSSL。OpenSSH的加密就是通过OpenSSL完成的。
image.png

5、安全连接

5.1、SSH的版本

SSH协议一共2个版本:SSH-1,SSH-2,现在用的比较多的是SSH-2,客户端和服务器版本需要一致才能通信。
客户端查看:/etc/ssh/ssh_config 文件,服务器查看:/etc/ssh/sshd_config 文件,文件中的Protocol代表的就是SSH的版本。

5.2、SSH的通信过程

SSH的通信过程可以分为3大主要阶段:
1、建立安全连接
2、客户端认证
3、数据传输

5.2.1、建立安全连接

在建立安全连接过程中,服务器会提供自己的身份证明,将公钥等信息发送给客户端,客户端验证公钥通过后,会将公钥信息保存在 ~/.ssh/known_hosts 文件中:
image.png
如果客户端并无服务器的公钥信息,就会询问是否连接此服务器:

  1. The authenticity of host '192.168.1.7 (192.168.1.7)' can't be established.
  2. RSA key fingerprint is SHA256:7d6HK72WlciJMFiS9BcwGHdJS3pkP4UXwdMyHS55Tk0.
  3. This key is not known by any other names
  4. Are you sure you want to continue connecting (yes/no/[fingerprint])?

5.2.2、服务器身份信息变更

  1. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  2. @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
  3. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  4. IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

在建立安全连接过程中,可能会遇到服务器身份信息变更的错误信息,如果确定要连接此服务器,只要删除掉之前服务器的公钥信息就行:$ ssh-keygen -R 192.168.1.7,或者直接打开 known_hosts 文件删除服务器的公钥信息就行。

5.2.3、SSH的客户端认证方式

SSH-2提供了2种常用的客户端认证方式:

  1. 基于密码的客户端认证,使用账号和密码即可认证
  2. 基于密钥的客户端认证,免密认证,最安全的一种认证方式

SSH-2默认会优先尝试“密钥认证”,如果认证失败,才会尝试“密码认证”。

5.2.4、SSH基于密钥的客户端认证

客户端先生成公钥和私钥,客户端会将公钥内容追加到服务器授权文件的尾部,然后再进行登录认证。
image.png

第一步:在客户端生成一对相关联的密钥(Key Pair):一个公钥(Public Key),一个私钥(Private Key)

终端输入:$ ssh-keygen
OpenSSH默认生成的是RSA密钥,可以通过 -t 参数指定密钥类型,生成的公钥路径:~/.ssh/id_rsa.pub,私钥路径:~/.ssh/id_rsa

第二步:把客户端的公钥内容追加到服务器的授权文件(~/.ssh/authorized_keys)尾部

方式一:通过命令行追加

终端输入:$ ssh-copy-id root@192.168.1.7
需要输入root用户名的登录密码,ssh-copy-id 会将客户端~/.ssh/id_rsa.pub的内容自动追加到服务器的~/.ssh/authorized_keys尾部

方式二:手动追加

先复制客户端的公钥到服务器,客户端终端输入:$ scp ~/.ssh/id_rsa.pub root@192.168.1.7:~/.ssh

*scp是secure copy的缩写,是基于SSH登录进行安全远程文件拷贝命令,把一个文件copy到另外一台主机上

再将公钥内容追加到授权文件尾部,服务器终端输入:$ cat id_rsa.pub >> authorized_keys
最后删除复制过来的公钥 $ rm id_rsa.pub

文件权限问题

如果配置了免密码登录后,还是需要输入密码,需要在服务器端设置文件权限:
$ chmod 755 ~
$ chmod 755 ~/.ssh
$ chomd 644 ~/.ssh/authorized_keys

6、USB-SSH登录

6.1、22端口

端口就是设备对外提供服务的窗口,每个端口都有一个端口号(范围是0~65535,共2^16个)。有些端口号是保留的,已经规定了用途,比如:21端口提供FTP服务、80端口提供HTTP服务、22端口提供SSH服务(可以查看/etc/ssh/sshd_config的Port字段)。更多保留端口号可参考 TCP/UDP端口列表
iPhone默认是使用22端口进行SSH通信,采用TCP协议:
image.png

6.2、通过USB进行SSH登录

默认情况下,由于SSH走的是TCP协议,Mac是通过网络连接的方式SSH登录到iPhone,要求iPhone连接WIFI,为了加快传输速度,也可以通过USB连接的方式进行SSH登录。Mac上有个服务程序usbmuxd(它会开机自动启动),可以将Mac的数据通过USB传输到iPhone。
image.png
首先让Mac通过SSH登录到自己的10010端口,然后再通过usbmuxd连接Mac的10010端口和iPhone的22端口,这样就实现了USB的SSH登录。

6.3、usbmuxd的使用

第一步:端口映射

方案一:使用usbmuxd的脚本

下载 usbmuxd 工具包(下载v1.0.8版本,主要用到里面一个python脚本:tcprelay.py ),将iPhone的22端口(SSH端口)映射到Mac本地的10010端口,终端输入:

python3会报错,可以下载 python3版本 的 tcprelay.py

$ python3 tcprelay.py -t 22:10010

-t 是为了能够同时支持多个SSH连接

方案二:使用usbmuxd

在Mac上安装usbmuxd:
$ brew install usbmuxd
端口映射:
$ iproxy 10010 22

第二步:SSH登录本地端口

端口映射完毕后,以后如果想跟iPhone的22端口通信,直接跟Mac本地10010端口通信就可以了,新开一个终端界面,SSH登录到Mac本地的10010端口,有一下两种方式:
$ ssh root@localhost -p 10010
$ ssh root@127.0.0.1 -p 10010

localhost是一个域名,指向的IP地址是127.0.0.1,本机虚拟网卡的IP地址。 如果报错:kex_exchange_identification: read: Connection reset by peer,可能是公司网络有限制,在家里就不会有这个问题。

之后usbmuxd会将Mac本地10010端口的TCP协议数据,通过USB连接转发到iPhone的22端口。远程拷贝文件也可以直接跟Mac本地的10010端口通信:
$ scp -P 10010 ~/Desktop/1.txt root@localhost:~/test

将Mac上的~/Desktop/1.txt文件,复制到iPhone上的~/test路径,注意scp的端口号参数是大写的-P

6.4、sh脚本文件

我们可以将经常执行的一系列终端命令行放到sh脚本文件中(shell),然后执行脚本文件。可以通过sh、bash、source命令来执行sh脚本文件。

sh、bash

当前shell环境会启动一个子进程来执行脚本文件,执行后返回到父进程的shell环境。当执行cd时,在子进程中会进入到cd的目录,但是在父进程中环境并没有改变,也就是目录没有改变,例如脚本内有以下命令:
$ cd ~/Desktop,执行后还在当前所在目录,不会跳转到桌面。

source

在当前的shell环境下执行脚本文件,执行cd后会跳转到cd目录,例如脚本内有以下命令:
$ cd ~/Desktop,执行后会跳转到桌面。
source可以用一个点” . “来代替,比如:
$ . test.sh

7、iOS终端的中文乱码问题

默认情况下,i0S终端不支持中文输入和显示,可以新建一个~/.inputrc文件,文件内容是:

  1. set convert-meta off
  2. set output-meta on
  3. set meta-flag on
  4. set input-meta on

其作用是: 第1行:不将中文字符转化为转义序列 第2行:允许向终端输出中文 第3、4行:允许向终端输入中文

如果是想在终端编辑文件内容,可以通过Cydia安装一个vim
image.png

8、总结

环境配置:
第一步:iPhone安装SSH插件
第二步:Mac生成公钥私钥
第三步:将Mac的公钥追加到iPhone的授权文件
SSH登录:
第一步:端口映射
$ sh usb.sh
第二步:登录本地端口
$ sh login.sh

usb.shlogin.sh 放在用户目录下,打开iTerm直接输入指令即可