OpenSSH

作者: HotPotCat | 来源:发表于2021-05-22 20:18 被阅读0次

    一、OpenSSH概述

    1.1 SSH

    SSH是一种网络协议,用于计算机之间的加密登录。
    1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。

    1.2 OpenSSH

    OpenSSHSSHSecure SHell) 协议的免费开源实现。它是一款软件,应用非常广泛。SSH协议可以用来进行远程控制, 或在计算机之间传送文件。

    1.2.1 OpenSSH插件安装

    通过OpenSSH插件可以连接手机,进行远程控制, 或者传送文件。以cydia为例,需要在软件源中添加源:

    //蜜蜂源
    apt.cydiami.com
    //雷锋源
    apt.abcydia.com
    

    这两个源比较有名,推荐添加。


    软件源
    • 软件源可以理解为服务器,存放了插件安装包。

    然后在搜索中搜索OpenSSH,认准来自apt.bingner.com。当然直接添加这个源也可以。

    OpenSSH

    1.3 SSH登录过程

    SSH登录流程
    1. 电脑(客户端)请求连接手机(ip:22)。
    2. 手机(服务端)将公钥发送给mac电脑。

    在首次登录的时候会出现提示RSA keyhash值(hash值是提示验证公钥的),也就是在这里接收的RSAkey(公钥),接收后保存在~/.ssh目录下的known_hosts文件中。

    known_hosts-rsa key
    1. mac电脑通过收到的公钥加密登录密码。
    2. 手机利用私钥解密登录密码,返回是否登录成功。

    1.4 中间人攻击(Man-in-the-middle attack)

    上面的登录方式存在一种隐患。如果有人 冒充服务器 将生成的 虚假公钥 发给客户端,那么它将获得客户端连接服务器的 密码

    中间人攻击
    1. 中间人模拟电脑给手机发送登录请求获取手机端公钥(I)
    2. 然后自己生成公私钥(M)将自己生成的公钥(M)发送给电脑
    3. 电脑端密码使用公钥(M)加密后发送给中间人,中间人使用私钥(M)解密拿到密码。
    4. 中间人将密码通过公钥(I)加密从而实现登录。

    那么怎么解决呢?
    这个也就是通过登录的时候返回的hash值来验证公钥的。一般服务器都会在自己的官网上公布自己公钥的hash值。这样就有效避免中间人攻击了。

    二、连接手机

    通过OpenSSH插件使用Wifi连接手机:ssh 用户名@手机IP地址

    ssh root@172.20.10.11
    
    • 在这里手机是服务端,电脑是客户端。OpenSSH是让手机开启SSH登录服务。
    • 登录:ssh 用户名@手机IP地址
    • 默认密码:alpine

    首次连接会出现保存提示,需要输入yes继续

    ➜  ~ ssh root@172.20.10.11
    The authenticity of host '172.20.10.11 (172.20.10.11)' can't be established.
    RSA key fingerprint is SHA256:pIPlaWYd9wT2MfpRqvP/WOe1wVXfVVKiCKttyPHK3f0.
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    

    这里其实是提示公钥keyhash值让验证有没有被篡改的。

    确认后需要输入密码alpine(默认),输入密码后就登录成功了。

    Warning: Permanently added '172.20.10.11' (RSA) to the list of known hosts.
    root@172.20.10.11's password:
    zaizai:~ root#
    

    2.1 查看文件目录

    root用户目录下:

    zaizai:~ root# ls
    Application\ Support/  Library/  Media/
    

    cd /进入根目录下:

    zaizai:~ root# cd /
    zaizai:/ root# ls
    Applications/  Library/  User@  boot/   dev/  lib/  private/  tmp@  var@
    Developer/     System/   bin/   cores/  etc@  mnt/  sbin/     usr/
    

    查看安装应用列表:

    zaizai:/ root# cd Applications/
    zaizai:/Applications root# ls
    AXUIViewService.app/
    AccountAuthenticationDialog.app/
    ActivityMessagesApp.app/
    AnimojiStickers.app/
    AppSSOUIService.app/
    AppStore.app/
    Apple\ TV\ Remote.app/
    AskPermissionUI.app/
    AuthKitUIService.app/
    BarcodeScanner.app/
    BusinessChatViewService.app/
    BusinessExtensionsWrapper.app/
    CTCarrierSpaceAuth.app/
    CTKUIService.app/
    CTNotifyUIService.app/
    Camera.app/
    CarPlaySettings.app/
    CarPlaySplashScreen.app/
    

    ps -A查看当前进程:

    zaizai:/Applications root# ps -A
      PID TTY           TIME CMD
        1 ??        13:45.28 /sbin/launchd
      295 ??         3:17.53 /usr/libexec/substituted
      296 ??         0:00.00 (amfid)
     1585 ??         0:00.00 /usr/libexec/amfid
    12460 ??         0:00.13 /System/Library/Frameworks/WebKit.framework/XPCService
    12461 ??         0:00.10 /System/Library/Frameworks/WebKit.framework/XPCService
    12489 ??         0:00.06 /usr/libexec/tzd
    12522 ??         0:00.05 /System/Library/PrivateFrameworks/FontServices.framewo
    12524 ??         0:01.04 /System/Library/PrivateFrameworks/CoreSuggestions.fram
    12528 ??         0:00.44 /System/Library/PrivateFrameworks/DeviceCheckInternal.
    12538 ??         0:00.03 /usr/libexec/OTATaskingAgent server-init
    12539 ??         0:00.05 /usr/libexec/tailspind
    12542 ??         0:00.58 /usr/libexec/ptpd -t usb
    12545 ??         0:00.50 /usr/libexec/adprivacyd
    12908 ??         0:01.20 /System/Library/PrivateFrameworks/AppleMediaServicesUI
    13275 ??         0:01.73 /usr/libexec/remindd
    13280 ??         0:00.04 /usr/libexec/microstackshot
    13283 ??         0:00.24 /System/Library/PrivateFrameworks/DifferentialPrivacy.
    13286 ??         0:00.14 /System/Library/Frameworks/FileProvider.framework/Plug
    13289 ??         0:19.42 /System/Library/PrivateFrameworks/AssistantServices.fr
    13294 ??         0:00.07 /usr/libexec/proactiveeventtrackerd
    13298 ??         0:00.32 /usr/libexec/gamecontrollerd
    13357 ??         0:00.17 sshd: root@ttys i
    13359 ttys000    0:00.08 -sh
    13365 ttys000    0:00.04 ps -A
    

    查看微信进程ps -A | grep WeChat

    zaizai:/Applications root# ps -A | grep WeChat
    12459 ??         0:18.22 /var/containers/Bundle/Application/295AC27A-5F06-4099-85AC-32EBA9FC9373/MonkeyDemo.app/WeChat
    13373 ttys000    0:00.02 grep WeChat
    

    这个时候MachO文件路径就找到了。

    exit可以退出登录:

    zaizai:~/Media root# exit
    logout
    Connection to 172.20.10.11 closed.
    

    2.2 用户

    iOS系统下有两个用户:rootmobile

    image.png
    • root:最高权限用户,可以访问任意文件。
    • mobile:普通用户,只能访问改用户目录下文件/var/Mobile

    mobile用户在自己的目录下可以创建文件,在根目录下没有权限:

    image.png

    root用户在根目录下是有权限的:

    image.png

    2.3 修改用户密码

    • root用户可以修改所有用户的密码。
    • passwd命令修改密码:
      • passwd 用户名
      • 输入两次新密码,确认修改。因为是登录状态所以不用输入原始密码。

    root用户修改mobile用户密码:

    ➜  ~ ssh root@172.20.10.11
    zaizai:~ root# passwd mobile
    Changing password for mobile.
    New password:
    Retype new password:
    zaizai:~ root#
    

    一般不推荐修改密码,直接配置免密登录就好了。如果修改密码后忘记了那么重新安装就好了。

    2.4 密钥保存验证

    通过1.3 SSH登录过程我们知道在首次登录的时候会提示验证公钥hash值,并且保存公钥~/.ssh目录下的known_hosts中,那么公私钥手机中也应该是有的。
    进入手机cd /etc/ssh目录:

    image.png

    可以看到ssh_host_rsa_key的公私钥。这也就验证了上面的登录过程。

    image.png

    如果下次ip地址变了再登录就访问不了了,出提示中间人攻击。

    2.5 免密登录(公钥登录)

    2.5.1 免密登录原理

    免密码登录也称公钥登录,原理就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的直接允许登录不再要求密码。

    免密登录原理
    1. mac将自己的公钥(mac)存储在手机上。
    2. 登录的时候手机发送一个随机字符串给mac
    3. mac通过私钥加密字符串发送回给手机。
    4. 手机利用保存的mac公钥进行解密验证。

    这样就完成了免密登录。

    2.5.2 免密登录配置

    1.客户端在~/.ssh/目录下生成公私钥ssh-keygen

    ➜  .ssh ssh-keygen
    Generating public/private rsa key pair.
    Enter file in which to save the key (/Users/zaizai/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /Users/zaizai/.ssh/id_rsa.
    Your public key has been saved in /Users/zaizai/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:dJFdigu6cijJlQf9AaNVBGZPTcLO9itHE/RDT/QiCQk cozhang@zaizai
    The key's randomart image is:
    +---[RSA 3072]----+
    |      B=E+++ oo  |
    |     * =..=+oo.. |
    |    o .o=.oo+o. .|
    |     o +++..o... |
    |    o o.S... .   |
    | . o o .  +      |
    |  + o o  . o     |
    |   . o  . o      |
    |         o       |
    +----[SHA256]-----+
    

    一路回车不设置密码(如果设置密码虽然免密登录了,但是每次都要输rsa的密码)。

    2.拷贝公钥SSH服务器ssh-copy-id 用户名@服务器IP

    ➜  .ssh ssh-copy-id root@172.20.10.11
    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/zaizai/.ssh/id_rsa.pub"
    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
    root@172.20.10.11's password:
    
    Number of key(s) added:        1
    
    Now try logging into the machine, with:   "ssh 'root@172.20.10.11'"
    and check to make sure that only the key(s) you wanted were added.
    

    拷贝的时候需要输入root账户的密码。这个时候再登录就不需要输入密码了:

    ➜  ~ ssh root@172.20.10.11
    zaizai:~ root#
    

    ssh-copy-id可以通过-i指定文件。某些系统通过指定-i会无效。(虽然拷贝成功,但是验证的是ssh-copy-id自己生成的key)。

    3.拷贝的公钥在服务器~/.ssh/authorized_keys中:

    image.png

    在某些版本中ssh-copy-id不需要我们生成公钥,该命令会自己生成公私钥进行拷贝。如果遇见自己生成的公钥key和和拷贝到authorized_keys中的对不上那么很可能是这个问题。

    2.6 配置快捷登录

    加入我们有多台手机,或者并不想输入ip那么麻烦的去登录。在~/.ssh下创建一个config文件,对ssh登录配置别名:

    Host iPhone7
    Hostname 172.20.10.11
    User root
    Port 22
    

    使用:

    ➜  ~ ssh iPhone7
    zaizai:~ root#
    

    这样就配置好了别名,可以登录了。

    2.7 SSH其它操作

    • 删除保存的服务器地址的key:ssh-keygen –R 服务器IP地址(当SSH登录手机,手机就是服务器)`

    • know_hosts文件:用于保存SSH登录服务器所接受的key,在系统~/.ssh 目录

    • ssh_host_rsa_key.pub文件:作为SSH服务器发送给连接者的key,在系统/etc/ssh 目录中

    • config文件:在~/.ssh 目录下创建一个config文件。内部可以配置ssh登录的别名。

    Host 别名
    Hostname IP地址
    User 用户名
    Port  端口号
    

    三、USB登录(推荐)

    上面我们都是通过wifi连接的,由于通过wifi链接存在不稳定性,有时候会断开链接,并且有速度限制。所以推荐使用usb链接。苹果有一个服务,叫usbmuxd,这个服务主要用于在USB协议上实现多路TCP连接。
    usbmuxd目录:

    /System/Library/PrivateFrameworks/MobileDevice.framework/Resources
    
    image.png

    3.1 USB 连接

    3.1.1 python脚本映射端口

    ssh root@172.20.10.11其实也就是ssh -p 22 root@172.20.10.11,默认22端口省略了,我们可以通过ssh -p 12345 root@localhost连接,只要将本地的12345端口映射到usb端口,只要usb端口连接哪个设备就相当于给哪个设备发送请求。
    有个python-client工具可以映射端口:

    image.png
    python tcprelay.py -t 要映射端口:本地端口
    ➜  python-client python tcprelay.py -t 22:12345
    Forwarding local port 12345 to remote port 22
    

    将本地的12345端口映射到设备的TCP端口22。这样就可以通过本地的12345端口建立连接了。

    3.1.2 通过USB进行SSH连接

    映射成功后想要登录直接:

    //也可以 ssh -p 12345 root@127.0.0.1
    ssh -p 12345 root@localhost
    

    这里有个注意点是映射端口成功后不能关闭窗口,否则映射就没有了。
    ssh连接本地的12345,由于做了端口映射所以会通过usb连接对面设备的22端口。

    ➜  ~ ssh -p 12345 root@localhost
    The authenticity of host '[localhost]:12345 ([127.0.0.1]:12345)' can't be established.
    RSA key fingerprint is SHA256:pIPlaWYd9wT2MfpRqvP/WOe1wVXfVVKiCKttyPHK3f0.
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    Warning: Permanently added '[localhost]:12345' (RSA) to the list of known hosts.
    zaizai:~ root#
    

    这里会重新进行rsa本地记录(ip变了),免密登录仍然有效。

    image.png

    ip变了,相当于登录一个新的服务器。所以保存rsa

    3.1.3 验证中间人攻击

    这个时候换一台设备进行ssh -p 12345 root@localhost登录就会提示中间人攻击了,由于本地localhost对应的rsa和新手机返回的hash值对应不上。如果只有一台手机可以通过修改know_hosts对应的localhostrsa公钥模拟:

    ➜  ~ ssh -p 12345 root@localhost
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
    Someone could be eavesdropping on you right now (man-in-the-middle attack)!
    It is also possible that a host key has just been changed.
    The fingerprint for the RSA key sent by the remote host is
    SHA256:pIPlaWYd9wT2MfpRqvP/WOe1wVXfVVKiCKttyPHK3f0.
    Please contact your system administrator.
    Add correct host key in /Users/zaizai/.ssh/known_hosts to get rid of this message.
    Offending RSA key in /Users/zaizai/.ssh/known_hosts:4
    RSA host key for [localhost]:12345 has changed and you have requested strict checking.
    Host key verification failed.
    

    所以如果有两台手机可以分别通过ssh -p 12345 root@localhostssh -p 12345 root@127.0.0.1登录,就能区分开了。

    3.2 配置USB快捷登录

    这个时候在 config中取别名就不行了,因为有端口的映射,并且地址也不是真实的地址。
    在自己的脚本目录创建一个iPhone7.sh文件(最好给这个目录配置环境变量),脚本内容如下:

    ssh -p 12345 root@localhost
    

    那么这个时候还需要端口映射的脚本usbConnect.sh,内容如下:

    python /Users/zaizai/HPShell/python-client/tcprelay.py -t 22:12345
    

    端口映射脚本和连接脚本分开是为了方便多个设备切换,由于映射只需要一次。

    使用:

    //映射端口
    ➜  ~ usbConnect.sh
    //链接
    ➜  ~ iPhone7.sh
    

    这样就连接上手机了。


    image.png

    需要两个窗口执行,映射完窗口一直存在的。
    脚本目录文件:


    image.png

    3.3 Iproxy端口映射

    Iproxy也是一个映射工具。

    3.3.1 libimobiledevice 安装

    brew install libimobiledevice
    

    3.3.2 映射端口

    iproxy 本地端口 要映射端口

    iproxy 12345 22 
    

    这个映射和python脚本是反过来的。左边是本地端口,右边是要映射端口。其它的使用方式相同。

    映射终端:

    ➜  ~ iproxy 12345 22
    Creating listening port 12345 for device port 22
    waiting for connection
    New connection for 12345->22, fd = 5
    waiting for connection
    Requesting connecion to USB device handle 3 (serial: 5d38c0a07ffa912050c2cbc05da5436e10a2d5d7), port 22
    

    连接终端:

    ➜  ~ iPhone7.sh
    zaizai:~ root#
    

    总结

    • SSH是一种网络协议。OpenSSH是一款软件。
    • SSH登录过程:
      • 远程主机(服务器)收到用户登录请求,将自己的公钥发送给用户端
      • 用户端使用公钥将自己登录的密码加密发送
      • 远程主机(服务端)使用私钥解密登录密码。密码正确则通过登录。
    • 中间人攻击:冒充服务端将虚拟公钥发送给客户端 。截获用户连接服务器的密码。
    • 服务器防护
      • 服务器在第一次登录时会让客户端保存IP-公钥这个KEY
      • KEY存放在~/.ssh/know_hosts文件中
      • 一般SSH服务器会将自己KEYHASH值公布在网站上
    • 免密登录(公钥登录)
      • 生成公私钥$ssh-keygen
      • ssh-copy-id将公钥拷贝到SSH服务器
      • 原理:
        • 用户将自己的公钥存储在远程服务器上
        • 登录的时候,远程服务器会向用户发送一串随机字符串
        • 用户用自己的私钥加密后再发送给服务器
        • 服务器用事先存储的公钥进行解密。如果成功就证明是真实用户登录,直接允许登录。
    • 取别名
      • ~/.ssh目录中有一个config用来配置SSH
      • 通过Host(别名)Hostname(IP)User(用户名)Port(端口)配置登录的别名
    • 端口映射(USB连接)
      • iproxy
      • python脚本

    iOS越狱

    相关文章

      网友评论

          本文标题:OpenSSH

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