一、OpenSSH概述
1.1 SSH
SSH
是一种网络协议,用于计算机之间的加密登录。
1995年,芬兰学者Tatu Ylonen
设计了SSH
协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux
系统的标准配置。
1.2 OpenSSH
OpenSSH
是 SSH
(Secure SHell
) 协议的免费开源实现。它是一款软件,应用非常广泛。SSH
协议可以用来进行远程控制, 或在计算机之间传送文件。
1.2.1 OpenSSH插件安装
通过OpenSSH
插件可以连接手机,进行远程控制, 或者传送文件。以cydia
为例,需要在软件源中添加源:
//蜜蜂源
apt.cydiami.com
//雷锋源
apt.abcydia.com
这两个源比较有名,推荐添加。
软件源
- 软件源可以理解为服务器,存放了插件安装包。
然后在搜索中搜索OpenSSH
,认准来自apt.bingner.com
。当然直接添加这个源也可以。
1.3 SSH登录过程
SSH登录流程- 电脑(客户端)请求连接手机(ip:22)。
- 手机(服务端)将公钥发送给
mac
电脑。
在首次登录的时候会出现提示
known_hosts-rsa keyRSA key
的hash
值(hash
值是提示验证公钥的),也就是在这里接收的RSA
的key
(公钥),接收后保存在~/.ssh
目录下的known_hosts
文件中。
-
mac
电脑通过收到的公钥加密登录密码。 - 手机利用私钥解密登录密码,返回是否登录成功。
1.4 中间人攻击(Man-in-the-middle attack)
上面的登录方式存在一种隐患。如果有人 冒充服务器 将生成的 虚假公钥 发给客户端,那么它将获得客户端连接服务器的 密码。
- 中间人模拟电脑给手机发送登录请求获取手机端
公钥(I)
- 然后自己生成
公私钥(M)
将自己生成的公钥(M)
发送给电脑 - 电脑端密码使用
公钥(M)
加密后发送给中间人,中间人使用私钥(M)
解密拿到密码。 - 中间人将密码通过
公钥(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
这里其实是提示
公钥key
的hash
值让验证有没有被篡改的。
确认后需要输入密码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
系统下有两个用户:root
、mobile
。
-
root
:最高权限用户,可以访问任意文件。 -
mobile
:普通用户,只能访问改用户目录下文件/var/Mobile
mobile
用户在自己的目录下可以创建文件,在根目录下没有权限:
root
用户在根目录下是有权限的:
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
目录:
可以看到ssh_host_rsa_key
的公私钥。这也就验证了上面的登录过程。
如果下次ip地址变了再登录就访问不了了,出提示中间人攻击。
2.5 免密登录(公钥登录)
2.5.1 免密登录原理
免密码登录也称公钥登录,原理就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的直接允许登录不再要求密码。
-
mac
将自己的公钥(mac)
存储在手机上。 - 登录的时候手机发送一个随机字符串给
mac
。 -
mac
通过私钥加密字符串发送回给手机。 - 手机利用保存的
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
中:
在某些版本中
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
工具可以映射端口:
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
变了),免密登录仍然有效。
ip
变了,相当于登录一个新的服务器。所以保存rsa
。
3.1.3 验证中间人攻击
这个时候换一台设备进行ssh -p 12345 root@localhost
登录就会提示中间人攻击了,由于本地localhost
对应的rsa
和新手机返回的hash
值对应不上。如果只有一台手机可以通过修改know_hosts
对应的localhost
的rsa
公钥模拟:
➜ ~ 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@localhost
和ssh -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
服务器会将自己KEY
的HASH
值公布在网站上
- 服务器在第一次登录时会让客户端保存
- 免密登录(公钥登录)
- 生成公私钥
$ssh-keygen
-
ssh-copy-id
将公钥拷贝到SSH
服务器 - 原理:
- 用户将自己的公钥存储在远程服务器上
- 登录的时候,远程服务器会向用户发送一串随机字符串
- 用户用自己的私钥加密后再发送给服务器
- 服务器用事先存储的公钥进行解密。如果成功就证明是真实用户登录,直接允许登录。
- 生成公私钥
- 取别名
-
~/.ssh
目录中有一个config
用来配置SSH
- 通过
Host(别名)
、Hostname(IP)
、User(用户名)
、Port(端口)
配置登录的别名
-
- 端口映射(
USB
连接)iproxy
-
python
脚本
网友评论