美文网首页iOS 安全与逆向IOS
三、SSH(Mac登录到iPhone)

三、SSH(Mac登录到iPhone)

作者: Lovell_ | 来源:发表于2018-11-28 23:01 被阅读105次

    一、WIFI连接登录:Mac(客户端)登录到iPhone(服务器)

    为什么要Mac端要远程登录到iPhone端?——这样就可以在Mac的终端上,通过敲一些命令行来作用于iPhone端、操纵iPhone端。

    为什么iOS支持终端命令操作?——因为iOS和Mac OS X都是基于Darwin(苹果的一个基于Unix的开源系统内核)。

    登录步骤:
    1、iPhone端在cydia上安装个OpenSSH,便于使用OpenSSH远程登录。
    2、Mac和iPhone处于同一WIFI下;
    3、Mac端登录命令ssh root@10.16.28.48,解释:[ssh用该远程登录保护方式] [root:账户名,iOS下的账号之一] @ [10.16.28.48 是手机端服务器连接wifi的ip地址]
    4、Mac端提示输入密码:alpine 【这是cydia上OpenSSH这个插件的作者规定的初始密码】
    5、成功登录到iPhone服务器;
    6、可以使用Mac端的终端操控iPhone了。。。。。。。。
    7、退出登录命令:exit

    image.png

    了解一些概念:

    > iOS下的2个常用账户:root、mobile
    root:最高权限账户,$HOME是/var/root
    mobile:普通权限账户,只能操作一些普通文件,不能操作系统级别的文件,$HOME是/var/mobile,登录方式与root几乎相同root mobile@服务器主机地址

    > 修改账户密码:
    修改root账户:passwd
    修改mobile账户:passwd mobile

    image.png

    > 搞清楚SSH、OpenSSH、SSL、OpenSSL

    • SSL:(一种加密)Secure Sockets Layer的缩写,是为网络通信提供安全及数据完整性的一种安全协议,在传输层对网络连接进行加密;
    • OpenSSL:(一种加密,开源不要钱)SSL的开源实现,绝大部分HTTPS请求等价于:HTTP + OpenSSL;OpenSSH的加密就是通过OpenSSL完成的;
    • SSH:Secure Shell的缩写,意为“安全外壳协议”,是一种可以为远程登录提供安全保障的协议;使用SSH,可以把所有传输的数据进行加密,“中间人”攻击方式就不可能实现,能防止DNS欺骗和IP欺骗;
    • OpenSSH:(不要钱)是SSH协议的免费开源实现,可以通过OpenSSH的方式让Mac远程登录到iPhone;
    SSH OpenSSH的加密就是通过OpenSSL完成的

    > SSH的版本
    SSH协议一共2个版本:SSH-1、SSH-2,现在用的比较多的是SSH-2,客户端和服务端版本要保持一致才能通信。

    查看SSH版本,通过查看配置文件中的Protocol字段,查看命令:
    客户端:cat /etc/ssh/ssh_config
    服务端:cat /etc/ssh/sshd_config

    > SSH的通信过程

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

    1、建立安全连接

    1.1 在建立安全连接过程中,服务器会提供自己的身份证明;

    左边的客户端中的known_hosts文件就是存放一些公钥信息:

    image.png

    查看known_hosts:cat known_hosts,192.168.123.71对应的就是iPhone服务端发过来的公钥:

    image.png

    如何验证客户端中known_hosts文件中192.168.123.71对应的公钥信息就是iPhone服务端的公钥?
    ——打开服务端的公钥,对比下是否一致,即可知道。

    连接到服务器 ssh root@192.168.123.71,来到服务器的配置文件夹cd /etc/ssh,查看其中服务器公钥ssh_host_rsa_key.pub,对比上面客户端(Mac)known_hosts文件中192.168.123.71对应的内容,会发现是一致的。

    image.png

    1.2 如果客户端(Mac)并无服务器端(iPhone)的公钥信息,就会询问是否连接此服务器,连接后下次就不会再询问,因为已经保存了iPhone端的公钥,除非把公钥删掉;

    提示要保存公钥并连接

    1.3 在建立安全连接过程中,如果服务端的公钥和客户端存储的公钥不一致,会提示以下错误信息:提醒服务器的身份信息发生了变更(远程连接发生了改变,可能遭遇中间人攻击)

    也可能是这种原因:
    公司换了台电脑,上面的ip地址设置的一样,这种情况并不是遭到攻击。电脑还是会把根据公钥生成的指纹信息发送过来,如果确实是公司的那台电脑的指纹信息,那还是要连接。

    但是一旦显示这个界面,是会连接失败的,怎么办?——删掉之前的公钥信息。

    删除公钥方法一:用vim删除对应的host公钥:vim ~/.ssh/known_hosts

    1、cd ~/.ssh
    2、vim know_hosts
    3、让光标停留在192.168.123.71行,按 d 即可删除
    4、保存推出;
    5、再次进行连接服务器ssh root@192.168.123.71
    6、重新提示要不要连接

    image.png

    删除公钥方法二:ssh-keygen -R 服务器IP地址

    image.png

    建立安全连接,不只是公钥信息的验证,还要做很多事,比如要确定会话密钥。。。等等

    2、客户端认证
    第一步已经确认了要连接,但是客户端的密码还不知道对不对。客户端是如何认证呢?

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

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

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

    如何搭建基于密钥的客户端认证?
    image.png
    1. 在客户端要生成配对的公钥文件和私钥文件。
      【见图:客户端生成公私钥操作步骤】
    2. 在服务器端会有个授权文件。
    3. 客户端将公钥内容放到服务端的授权文件尾部。
      【见图:公钥内容追加到服务端授权文件尾部】
    4. 登录,验证免密码认证是否完成,由它自己完成,自己会用到私钥。。。。
    客户端生成公私钥操作步骤 命令行实际操作 生成的密钥文件 公钥内容追加到服务端授权文件尾部 命令行实际操作 命令行实际操作

    尝试登录,看是否免密码:

    image.png

    还是需要密码,免密验证失败,ssh-keygenssh-copy-id root@服务器主机地址,这两个智能指令生成密钥文件并且追加到服务端授权文件尾部的操作,没能帮到我,还没搞清楚原因。(原因后面有说到,是文件权限的问题)

    除开用智能指令,还可以手动操作来把公钥内容追加到授权文件尾部。
    1、公钥文件拷贝到服务端;
    2、再把内容追加到授权文件尾部;

    操作步骤:
    1、先删掉服务端的授权文件authorized_keys;
    2、进入客户端.ssh文件夹;
    3、scp ~/.ssh/id_rsa.pub root@192.168.123.71:~/.ssh,scp:远程拷贝;
    4、登录到服务端进入.ssh文件夹,把id_rsa.pub的内容追加到authorized_keys的尾部:cat id_rsa.pub >> authorized_keys,如果没有authorized_keys就会新建一个,此时authorized_keys文件的内容和id_rsa.pub就是一样了;
    5、rm id_rsa.pub
    6、尝试登录ssh root@192.168.123.71,看是否需要密码,我的结果还需要密码!!!!!(后面有说到是文件夹权限问题)

    解决配置完免密认证后,登录还需要输入密码的问题。

    存在这个问题是因为文件夹没有权限。
    所以在服务端,还需要配置权限:
    chmod 755 ~
    chmod 755 ~/.ssh
    chmod 644 ~/.ssh/authorized_keys

    image.png 命令行实操

    结果还要密码:alpine,只是提示输密码不一样了。

    Enter passphrase for key还是要密码
    方法一:上网查找的解决办法:网址

    Mac本地执行命令:

    eval `ssh-agent` 
    ssh-add
    

    ssh-agent:是用于管理密钥;
    ssh-add:用于将密钥加入到ssh-agent中;
    SSH可以和ssh-agent通信获取密钥,这样就不需要用户手工输入密码了。 但这个配置只对当前会话生效,会话关闭或机器重启后都需要重新执行这两条命令。将命令放到~/.bash_profile中,就可以免去每次输入的麻烦。

    成功解决Enter passphrase for key

    到这里为止,可以成功的免密登录了。但是退出终端,还是要输入密码。

    方法二:
    ssh-add -K ~/.ssh/id_rsa 
    

    退出终端,依然不用输入密码,
    但如果重启电脑,上面的指令还需执行一次。

    方法三:(完美)

    结合方法一和方法二,把ssh-add -K ~/.ssh/id_rsa这条指令放在~/.bash_profile中,这样每次重启电脑都会执行该指令。已验证重启终端或电脑都无需再输入密码。

    参考:
    1、mac配置完ssh依然提示"Enter passphrase for key"解决方法
    2、mac:ssh登陆总是需要输入钥匙串密码解决

    > 22端口介绍
    端口就是设备对外提供服务的窗口,每个端口都有个端口号(范围是0~65535,共2^16个)。

    有些端口号是保留的,已经规定了用途,比如:
    21端口提供FTP服务;
    80端口提供HTTP服务;
    22端口提供SSH服务(可以查看/etc/ssh/sshd_config的Port字段);
    更多保留端口号: https://baike.baidu.com/item/%E7%AB%AF%E5%8F%A3%E5%8F%B7/10883658#4_3

    iPhone默认是使用22端口进行SSH通信,采用的是TCP协议。

    image.png

    3、数据传输

    二、USB连接登录:Mac(客户端)登录到iPhone(服务器)

    为什么要用USB连接?

    • 为了加快传输速度,也可以通过USB连接的方式进行SSH登录;

    为什么Mac可以通过USB传数据?

    • Mac上有个服务程序usbmuxd(它会开机自动启动),可以将Mac的数据通过USB传输到iPhone;
    • /System/Library/PrivateFrameworks/MobileDevice.framework/Resources/usbmuxd
    USB连接

    0、准备两个文件:tcprelay.pyusbmux.py
    ——即usbmuxd工具包(下载v1.0.8版本,主要用到里面的一个python脚本:tcprelay.py

    1、映射端口,10010端口映射到22端口,命令行:python /Users/fengXXX/Desktop/usbmuxd/tcprelay.py -t 22:10010
    格式解释: python [文件路径] [-t:为了能够同时支持多个SSH连接] [SSH端口] : [客户端Mac端口,找个没被用的就行,如果被用了,则映射不成功,见图:端口被占用.png]

    image.png 端口被占用.png

    已经连成功的这个窗口留着,保留窗口映射状态,再新建个终端窗口。

    2、登录到本机root账号下的10010端口:
    ssh -p 10010 root@localhost
    ssh root@127.0.0.1 -p 10010
    localhost是一个域名,指向的IP地址是127.0.0.1,本机虚拟网卡的IP地址

    登录.png

    登录的时候我还没做免密操作,所以还需要输入密码:alpine。

    usbmuxd会将Mac本地10010端口的TCP协议数据,通过USB连接转发到iPhone的22端口

    > 3、通过USB远程拷贝

    • 远程拷贝文件也可以直接跟Mac本地的10010端口通信
    • scp -P 10010 ~/Desktop/1.txt root@localhost:~/test(在Mac端操作)
    • 将Mac上的~/Desktop/1.txt文件,拷贝到iPhone上的~/test路径
    • 注意:scp的端口号参数是大写的-P

    注意:这里虽然是通过USB传东西,这里的登录还是SSH登录,服务端认证、客户端认证、安全传输,其实一直都在的。只是数据先发到10010端口,然后再发到22端口,有这么个转发的过程而已,只是换了一种传递数据的方式而已。加密的过程如公钥私钥都还在的,之前的途径是WIFI,现在是USB。

    sh

    如上,每次都要做两步操作:
    1、端口映射,
    2、登录到本机的10010端口

    优化:将经常执行的一系列终端命令行放到sh脚本文件中(shell)。

    操作

    用vim新建sh文件:
    vim usb.sh 【这样写是把usb.sh放在根目录,文件中的是端口映射的内容】

    键入内容:python 路径 -t 22:mac端口

    常用的命令行

    esc键——>shift+:——>wq

    在这个位置:


    image.png

    如何查看那一串命令:
    cat usb.sh

    如何执行脚本呢?
    有三种方式:sh、bash、source。


    image.png

    这些都是linux的知识了。

    三种方式有什么区别呢?

    • sh、bash:shell环境会启动一个子进程来执行脚本,执行完后,再回到父进程的shell环境。
    • source:在当前shell环境下执行脚本;source也可以用.来表示。
    image.png image.png

    下面再来新建第二个sh文件,登录的sh文件:

    vim login.sh

    键入内容ssh -p 10010 root@localhost

    cat login.sh ,查看脚本内容。
    sh login.sh,执行脚本内容。

    为什么两个脚本不能弄成一个呢?


    image.png

    因为执行完端口映射后,就会一直卡在那里,不会执行下一行命令了。按control+c终止连接之后,才执行第二行登录命令。


    有个问题,iPhone终端不能输入中文


    问题演示

    解决办法:
    1、iPhone终端没有vim,先在cydia中下载安装个Vi IMproved,方便在终端中使用vim新建文件。(注意,iPhone端本来是没有vim的,因为越狱才能安装上)

    2、在iPhone端的~文件夹下vim新建.inputrc文件,并输入
    set convert-meta off
    set output-meta on
    set meta-flag on
    set input-meta on
    这些内容,保存。

    3、验证:在iPhone端vim新建一个中文名的txt:哈哈.txt,发现可以用中文名了。


    image.png 在iPhone中新建的两个文件.png

    但是命令行工具上文件名是?乱符号这个还没解决掉,可能是越狱的关系,本来iPhone上是没vim的。但是iPhone上的文件名可以显示中文。

    相关文章

      网友评论

        本文标题:三、SSH(Mac登录到iPhone)

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