美文网首页iOS进阶
Mac远程登录到iPhone的原理

Mac远程登录到iPhone的原理

作者: Miss_QL | 来源:发表于2020-04-23 17:47 被阅读0次

    做iOS逆向的第一步,就是要建立Mac和iPhone之间的连接,这样才能通Mac在终端上输入命令来操作我们的iPhone手机。

    注意!先搞清楚两个概念:因为我们是要将Mac远程登录到iPhone上,所以在这里,和平常在公司的项目开发中不太一样,此时客户端是Mac,远程服务器是iPhone

    一、建立安全连接
    在建立安全连接过程中,服务器会提供自己的身份证明。
    安全连接是通过SSH来建立的,而SSH是基于TCP控制传输层协议的,所以连接默认是通过WIFI作为传递媒介,所以服务器和客户端需要保证在同一个WIFI环境。(文章最后面会提供另外一种连接方式,采用USB的形式进行连接,这是后话)

    首先服务器端会采用RSA非对称加密在本地生成一对公私钥,保存在/tec/ssh/ssh_host_rsa_key.pub,可以通过iFunBox来查看,基本上长这样🔽

    iFunBox截图.png

    其中ssh_host_rsa_key.pub为公钥,服务器将公钥等信息发送给客户端。

    建立连接操作.png

    如果确认是想要连接的服务器(可通过核对SHA256数据来确定),在确认处输入yes,此时客户端会将该公钥保存到本地~/.ssh/known_hosts路径。如果不是自己想要连接的服务器,在确认处输入no,终止连接过程即可。

    可以查看一下客户端~/.ssh/known_hosts路径保存的公钥信息,确认是否真的是从服务器传递过来的公钥。具体操作命令如下:

    查看客户端本地保存的服务器公钥.png 查看远程服务器保存的公钥.png

    对比一下,就可以发现,客户端~/.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用户状态。

    进入root.png

    实际上,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传递过来的公钥。具体操作命令如下:

    image.png

    对比一下,就可以发现,服务器~/.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

    端口映射.png

    (2)新建一个终端窗口,前面的端口映射窗口不要关,建立连接
    ssh root@localhost -p 10010

    建立连接.png

    如果你觉得每次连接都要做这两个操作步骤很麻烦的话,可以考虑写两个脚本文件,用到的时候就跑一下,也是很方便的。在此不多做赘述。

    好了,到这里基本上就完成了,感谢小伙伴的耐心观看,建议动手试试,会加深印象。如果文中内容有问题,欢迎指出,一起学习进步,谢谢你😊

    相关文章

      网友评论

        本文标题:Mac远程登录到iPhone的原理

        本文链接:https://www.haomeiwen.com/subject/ddjnihtx.html