本文非原创, 是在学习李明杰课程后的知识整理,方便自己复习,也给正好需要的伙伴提供方便。

基础概念

SSH

在学习Mac通过SSH登录iOS设备之前,我们先学习一下,SSH是什么?

以下解释来自百度百科:

SSH 为 [Secure Shell](https://baike.baidu.com/item/Secure Shell) 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UXLinuxAIXSolarisDigital UNIXIrix,以及其他平台,都可运行SSH。

SSH 功能

传统的网络服务程序,如:fpt, pop,telenet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人会非常容易截获这些口令和数据。 而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易收到 中间人攻击 (man-in-the-middle) 这种方式的攻击。

所谓的 中间人 的攻击方式, 就是中间人冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传输给真正的服务器。 服务器和你之间的数据传输被 中间人 一转手做了手脚之后,就会出现严重的问题。

通过SSH,你可以把所有传输的数据进行加密,这样 中间人这种攻击方式就不可能实现了,而且也能够防止DNS欺骗,IP欺骗, 使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度

SSH验证

从客户端来看,SSH提供两种级别的安全验证。

第一种级别 (基于口令的安全验证)

只要你知道自己的账号和口令,就可以登录到远程主机。 所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务区。 可能会有别的服务器冒充真正的服务器,也就是受到 中间人攻击

第二种级别 (基于密钥的安全验证)

需要依靠密钥,也就是你必须为自己创建一堆密钥,并把公用密钥放在需要访问的服务器上。

如果你要连接在SSH服务器上,客户端软件就会向服务器发出请求,请求时用你的密钥进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公有密钥,然后把它和你发送过来的公用密钥进行比较。

如果两个密钥一致,服务器就用公用密钥加密质询并把它发送给客户端软件。客户端收到 质询之后就可以用你的私钥解密再把它发送给服务器。

用这种方式,你必须知道自己密钥的口令。 但是,与第一种级别相比,第二种级别不需要在网络上传送口令。

第二种级别不仅加密所有传送的数据,而且 中间人 这种攻击方式也是不可能的(因为它没有你的私钥)。 但是整个登录过程可能需要10秒。

截屏2020-06-02下午11.19.24

OpenSSH

OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。SSH协议族可以用来进行远程控制, 或在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都是极为不安全的,并且会使用明文传送密码。OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控制和文件传输过程中的数据,并由此来代替原来的类似服务

简介

OpenSSH是使用SSH透过计算机网络加密通讯的实现。它是取代由SSH Communications Security所提供的商用版本的开放源代码方案。目前OpenSSH是OpenBSD的子计划。

OpenSSH常常被误认以为与OpenSSL有关联,但实际上这两个计划的有不同的目的,不同的发展团队,名称相近只是因为两者有同样的软件发展目标──提供开放源代码的加密通讯软件。

服务

OpenSSH服务,sshd,是一个典型的独立守护进程(standalone daemon),但也可以根据需要通过网络守护进

openSSH的河豚标志openSSH的河豚标志

程(Internet Daemon)-inetd(注3)或Ineternet Daemon’s more modern-xinted加载。OpenSSH服务可以通过/etc/ssh/sshd_config文件进行配置

SSL

SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密。

简介:

SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

提供服务

1)认证用户和服务器,确保数据发送到正确的客户机服务器

2)加密数据以防止数据中途被窃取;

3)维护数据的完整性,确保数据在传输过程中不被改变。

OpenSSL

计算机网络上,OpenSSL是一个开放源代码软件包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。

Mac通过SSH登录iOS设备

连接流程

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

截屏2020-06-02下午10.50.55

本文上部分引用了百度百科中对 SSH, OpenSSH, SSL, OpenSSL的简介。

Mac就可以通过 SSH 的方式 登录到 iOS设备。步骤如下:

  • 在iPhone上通过 Cydia 安装 OpenSSH工具

    截屏2020-06-02下午11.34.01

  • SSH是通过TCP协议通信,所以要确保Mac 和 iPhone在同一局域网下,比如连接着同一个wifi

    • 在Mac的终端输入指令 ssh 账户名@服务器主机地址
    • 初始密码 alpine

    截屏2020-06-01下午11.28.54

  • 登录成功后,就可以使用终端命令来操作iPhone

  • 退出命令是exit

root 和 mobile

  • iOS下有2个常用账户 : root 和 mobile
  • root: 最高权限的账户, $HOME是 /var/root
  • mobile: 普通权限账户,只能操作一些普通文件,不能操作系统级别的文件。$HOME是/var/mobile
    • 登录mobile账户时命令: root mobile@服务器地址
    • root 和 mobile 用户的初始登录密码都是 alpine

SSH通信过程

建立安全连接

  • 在建立安全连接中,服务器会提供自己的身份证明
    • 服务器发送公钥等信息给客户端

截屏2020-06-02下午11.44.51

  • 如果客户端并无服务器端的公钥信息, 就会询问是否连接此服务器

截屏2020-06-02下午11.45.32

客户端认证

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

    • 基于密码的客户端认证
      • 使用密码和账户可认证
    • 基于密钥的客户端认证
      • 免密码认证
      • 最安全的一种认证方式
  • SSH-2会默认优先尝试 密钥认证, 如果认证失败,才会尝试 密码认证

SSH - 基于密钥的客户端认证

截屏2020-06-02下午11.49.04

  • 在客户端生成一堆相关联的密钥(Key Pair) : 一个公钥(Public key), 一个私钥(Private key)
    • ssh-keygen
      • 一路 enter 即可
      • OpenSSH默认生成的是RSA密钥,可以通过 -t 参数指定密钥类型
      • 生成的公钥 : ~/.ssh/id_rsa.pub
      • 生成的私钥 : ~/.ssh/id_rsa
  • 把客户端的公钥内容追加到服务器的授权文件 (~/.ssh/authorized_keys) 尾部
    • ssh-copy-id root@服务器地址
    • 需要输入root用户的登录密码
    • ssh-copy-id会将客户端~/.ssh/id_rsa.pub的内容自动追加到服务器的~/.ssh/authorized_keys尾部

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协议

    截屏2020-06-02下午11.56.11

通过USB进行SSH登录

  • 默认情况下,由于SSH走的是TCP协议,Mac是通过网络连接的方式SSH登录到iPhone,要求iPhone连接WiFi

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

  • Mac上有个服务程序usbmuxd(它会开机自动启动),可以将Mac的数据通过USB传输到iPhone

  • /System/Library/PrivateFrameworks/MobileDevice.framework/Resources/usbmuxd截屏2020-06-02下午11.58.55

usbmuxd的使用

  • 下载usbmuxd工具包(下载v1.0.8版本,主要用到里面的一个python脚本:tcprelay.py)

  • https://cgit.sukimashita.com/usbmuxd.git/snapshot/usbmuxd-1.0.8.tar.gz

  • 将iPhone的22端口(SSH端口)映射到Mac本地的10010端口

    • cd ~/Documents/usbmuxd-1.0.8/python-client
    • python tcprelay.py -t 22:10010
  • 加上-t参数是为了能够同时支持多个SSH连接

  • 注意:要想保持端口映射状态,不能终止此命令行(如果要执行其他终端命令行,请新开一个终端界面)

  • 不一定非要10010端口,只要不是保留端口就行

  • 端口映射完毕后,以后如果想跟iPhone的22端口通信,直接跟Mac本地的10010端口通信就可以了

    • 新开一个终端界面,SSH登录到Mac本地的10010端口(以下方式2选1)
    • ssh root@localhost -p 10010
    • ssh root@127.0.0.1 -p 10010
    • localhost是一个域名,指向的IP地址是127.0.0.1,本机虚拟网卡的IP地址
  • 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

sh脚本文件

  • 我们可以将经常执行的一系列终端命令行放到sh脚本文件中(shell),然后执行脚本文件

  • 可以通过sh、bash、source命令来执行sh脚本文件

    • sh、bash
      • 当前shell环境会启动一个子进程来执行脚本文件,执行后返回到父进程的shell环境
      • 执行cd时,在子进程中会进入到cd的目录,但是在父进程中环境并没有改变,也就是说目录没有改变
    • source
      • 在当前的shell环境下执行脚本文件
      • 执行cd后会跳转到cd的目录
      • source可以用一个点”.”来替代,比如”. test.sh”