Mac远程登录到iPhone的原理
做iOS逆向的第一步,就是要建立Mac和iPhone之间的连接,这样才能通Mac在终端上输入命令来操作我们的iPhone手机。
注意!先搞清楚两个概念:因为我们是要将Mac远程登录到iPhone上,所以在这里,和平常在公司的项目开发中不太一样,此时客户端是Mac,远程服务器是iPhone。
一、建立安全连接
在建立安全连接过程中,服务器会提供自己的身份证明。
安全连接是通过SSH来建立的,而SSH是基于TCP控制传输层协议的,所以连接默认是通过WIFI作为传递媒介,所以服务器和客户端需要保证在同一个WIFI环境。(文章最后面会提供另外一种连接方式,采用USB的形式进行连接,这是后话)
首先服务器端会采用RSA非对称加密在本地生成一对公私钥,保存在/tec/ssh/ssh_host_rsa_key.pub
,可以通过iFunBox来查看,基本上长这样🔽
其中ssh_host_rsa_key.pub
为公钥,服务器将公钥等信息发送给客户端。
如果确认是想要连接的服务器(可通过核对SHA256数据来确定),在确认处输入yes,此时客户端会将该公钥保存到本地~/.ssh/known_hosts
路径。如果不是自己想要连接的服务器,在确认处输入no,终止连接过程即可。
可以查看一下客户端~/.ssh/known_hosts
路径保存的公钥信息,确认是否真的是从服务器传递过来的公钥。具体操作命令如下:
对比一下,就可以发现,客户端~/.ssh/known_hosts
路径保存的公钥信息确实是从远程服务器/tec/ssh/ssh_host_rsa_key.pub
传递过来的。
以上操作,只在第一次和服务器建立连接的时候发生,因为客户端本地已经保存过服务器的公钥,所以后面再和该服务器建立连接的时候,终端不会再提示是否保存公钥信息。也很好理解,因为本地已经有了,所以不需要再保存。
当然如果你后面把这个本地公钥信息删除了,那肯定还是会有提示的。或者服务器身份信息发生了变化(比如遭受中间人攻击),那服务器发送过来的公钥信息肯定会发生变化,那客户端收到公钥后,和本地公钥对比发现不一样,那就会拒绝建立连接。此时的处理方法,看实际情况吧,如果不是中间人攻击,确认是自己想连接的服务器,那就需要先把客户端本地保存过的该服务器对应的公钥数据删除,然后重新建立连接,重复一次前面的步骤。
具体删除操作有两种方法:
方法1、ssh-keygen -R 192.168.1.111
此处192.168.1.111为我的服务器地址
方法2、用vim
打开known_hosts
,找到服务器地址(192.168.1.111)对应的那一行,用快捷键dd
删除即可
二、客户端认证
通常输入正确密码以后,就能成功登录服务器。默认密码是alpine
,后面可自己修改。这样连接就建立成功了,终端进入iPhone的root用户状态。
实际上,SSH-2提供了2种常用的客户端认证方式,默认会先尝试“密钥认证”,如果认证失败了,才会尝试“密码认证”。
1、基于密钥的客户端认证
免密码认证,是最安全的一种认证方式。想要使用这种方式的话,需要先搭建密钥认证的环境。
(1)首先,在客户端采用RSA非对称加密生成一对公私钥,放在默认保存的~/.ssh
中就好。
//默认生成的是RSA密钥,可以通过-t参数指定密钥类型
ssh-keygen
客户端生成公私钥.png
(2)将客户端的公钥内容~/.ssh/id_rsa.pub
追加到服务器授权文件~/.ssh/authorized_keys
的尾部,这样服务器就知道将来这个客户端要登录到我这里。因为将来可能很多客户端想要登录到这个服务器,所以授权文件中可能会保存很多客户端公钥信息,所以这里只能向授权文件尾部追加公钥内容,而不能直接覆盖授权文件。
//把客户端的公钥内容追加到服务器的授权文件(~/.ssh/authorized_keys)尾部
//其中192.168.1.111为服务器主机地址
ssh-copy-id root@192.168.1.111
追加公钥到授权文件尾部.png
(3)接下来自动进入相应的登录认证,会有一系列的加密和解密操作,如果都成功的话,说明认证是成功的。
免密登录.png可以查看一下服务器~/.ssh/authorized_keys
路径尾部保存的公钥信息,确认是否真的是从客户端~/.ssh/id_rsa.pub
传递过来的公钥。具体操作命令如下:
对比一下,就可以发现,服务器~/.ssh/authorized_keys
路径尾部保存的公钥信息确实是从客户端~/.ssh/id_rsa.pub
传递过来的。
2、基于密码的客户端认证
使用账号和密码即可认证,如上图"进入root.png"显示。
三、连接成功
至此,我们Mac远程登录到iPhone的操作就完成了。
备注:
声明一点,因为是在~文件夹下操作,所以上述操作都是在解决root用户的登录问题,并不会影响mobile用户。
如果配置了免密码登录后,再次登录还是需要输入密码,那就要考虑权限问题,可能是权限不足引起的,chmod
修改一下linux系统权限应该就好了。
chmod 755 ~
chmod 755 ~/.ssh
chmod 644 ~/.ssh/authorized_keys
通过USB进行SSH登录
在前面的安全连接中有提到,通过USB的方式进行数据传输,下面就来好好解释一下。
iPhone进行SSH通信默认使用的是22端口(端口就是设备对外提供服务的窗口),采用的是TCP协议。简单理解就是,Mac通过SSH远程登录到iPhone的时候,其实登录的是iPhone的22端口。
默认情况下,由于SSH走的是TCP协议,Mac是通过网络连接的方式SSH登录到iPhone,要求iPhone和Mac连接在同一个WIFI下。但是在WiFi登录的情况下,如果网络不好的话,通过终端操作手机的时候,可能会很卡,所以建议采用USB连接的方式进行SSH登录,也就是在终端输入的指令通过USB的方式传输到手机上,这样可以加快传输速度。
Mac自带usbmuxd服务程序,会在开机时自动启动,通过这个usbmuxd就可以将Mac的数据通过USB传输到iPhone。usbmuxd的路径在/Library/Apple/System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/Resources/usbmuxd
下。
1、首先要让Mac通过SSH登录到自己本地的端口(比如登录到本地的10010端口,后续都以该端口为例),即Mac的数据会被传输到自己对应的端口。
这里先登录到Mac自己的11011端口,是因为如果直接登录到iPhone,默认就会通过WIFI直接登录到iPhone的22端口,无法采用USB的方式,所以只能先登录到自己的端口,再考虑通过端口传输出去。
2、再将端口的数据通过USB传输到iPhone的22端口,这个就会用到usbmuxd了,usbmuxd的作用就是将Mac端口上的数据传输到iPhone的端口上。
对于usbmuxd的使用,主要是用到里面的一个python脚本:tcprelay.py
。小伙伴们可以通过tcprelay.py链接下载。
(1)将iPhone的22端口(SSH端口)映射到Mac本地的10010端口
python tcprelay.py 22:10010
(2)新建一个终端窗口,前面的端口映射窗口不要关,建立连接
ssh root@localhost -p 10010
如果你觉得每次连接都要做这两个操作步骤很麻烦的话,可以考虑写两个脚本文件,用到的时候就跑一下,也是很方便的。在此不多做赘述。
好了,到这里基本上就完成了,感谢小伙伴的耐心观看,建议动手试试,会加深印象。如果文中内容有问题,欢迎指出,一起学习进步,谢谢你😊