注册

iOS逆向需要了解的OpenSSH

一、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

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


353617f676b46821a5ff7f8a409ff9fa.png


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

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


9b1273a8114fe1d8b886b282789e570c.png

1.3 SSH登录过程

9b77b1d5fb79355e0f55c8e877132805.png

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

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

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

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

3d74482204a27d0113656df9e5860e27.png

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

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


二、连接手机

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

  • 在这里手机是服务端,电脑是客户端。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系统下有两个用户:rootmobile

e01172f0907c1f64144ebc35be5120db.png


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

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

c8e88142196ac3ed28ff8bc6afd5c0c9.png

2.3 修改用户密码

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

root用户修改mobile用户密码:


  ~ ssh 
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目录:

682e70542b0175e9bdb4ca23d9ed53e0.png

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

cb7972793154b4f584339d72c39ec2fe.png


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


2.5 免密登录(公钥登录)

2.5.1 免密登录原理

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


6be167afe36e449b35da5b19ede41f25.png
  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中:

e7a62023e17b9ab58a2c42cd2c8d5a54.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
87051e51fbd90d7ab20a4820eeb61082.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工具可以映射端口:

71e1ccb74cfc1a5a4510b01bd9058e59.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变了),免密登录仍然有效。

8936a025eb6f68659597d35c5e9fc3c8.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

这样就连接上手机了。


e505ae25e8ecc569495ab6545e86ff19.png

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

5e16219947483085659a5a493ef3d193.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脚本



作者:HotPotCat
链接:https://www.jianshu.com/p/51f989c373da





0 个评论

要回复文章请先登录注册