IOS逆向学习-SSH

  • 1. SSH、OpenSSH
  • 1.1 Mac远程登录到iPhone
  • 1.2 SSH、OpenSSH介绍
  • 1.3 使用OpenSSH远程登录
  • 1.4 iPhone账号
  • 1.5 SSL 、OpenSSL
  • 1.6 SSH的版本
  • 1.7 SSH的通讯过程
  • 1.7.1 建立客户端连接
  • 1.7.2 客户端认证
  • 1.7.2.1 认证方式
  • 1.7.2.2 基于密钥的客户端认证
  • 1.7.2.3 权限指令解释
  • 1.8 端口
  • 1.9通过USB进行SSH登录
  • 1.9.1 USB的登录流程
  • 1.9.2 usbmuxd的使用
  • 2.0 SSH的脚本
  • 2.1 IOS终端中文乱码问题
  • 2.2 常用命令行指令


1. SSH、OpenSSH

1.1 Mac远程登录到iPhone

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

1.2 SSH、OpenSSH介绍

  • SSH:
  • Secure Shell的缩写,意为“安全外壳协议”,是一种可以为远程登录提供安全保障的协议
  • 使用SSH,可以把所有传输的数据进行加密,“中间人”攻击方式就不可能实现,能防止DNS欺骗和IP欺骗:
  • OpenSSH:
  • 是SSH协议的免费开源实现
  • 可以通过OpenSSH的方式让Mac远程登录到iPhone
  • Mac本身是支持 OpenSSH的

1.3 使用OpenSSH远程登录

  • 首先需要再iPhone上通过Cydia安装OpenSSH工具
  • OpenSSH的具体使用步骤可以查看Description中的描述,或则是Cydia中OpenSSH的使用方法
  • 登录使用步骤(Cydia中也有OpenSSH访问教程)
  • SSH是通过TCP协议通讯的,所以要确保Mac和iPhone在同一局域网下,比如连接着同一个WIFI
  • 在Mac的终端输入ssh 账户名@服务器主机地址,例如:ssh root@10.1.1.168(这里服务器是手机)
  • 初始密码alpine,可以在Cydia中看到Root密码教程中找到
  • 登录成功之后就可以使用终端命令函操作iPhone
  • 退出登录的命令是 exit
  • 当我在Mac上使用SSH方式登录iphone手机的时候,有可能会遇到如下问题:权限被拒绝,请重试的问题
  • ios快捷指令 匹配 正则表达式 ios快捷指令ssh_服务器

  • 解决方法:
  • 首先进入root 模式: sudo su -
  • 打开配置文件: vi /private/etc/ssh/sshd_config
  • 然后修改配置文件中#PermitRootLogin prohibit-password这一行,首先把#号去掉,然后把值修改成yes,也就是修改成PermitRootLogin yes
  • 停止ssh服务:launchctl stop com.openssh.sshd
  • 启动ssh服务:launchctl start com.openssh.sshd
  • 最后在输入ssh root@服务器地址就可以成功登录了

1.4 iPhone账号

  • IOS下有两个常用账户: rootmobile
  • root: 最高权限,$HOME是/var/root
  • mobile: 普通权限账户,只能操作一些普通文件,不能操作系统级别的文件,$HOME是/var/mobile
  • 登录mobile用户:root mobile@服务器主机地址
  • root和mobile用户的初始登录密码都是alpine
  • 成功登录mobile账号:
  • ios快捷指令 匹配 正则表达式 ios快捷指令ssh_ios_02

  • 账号权限比较
  • mobile账号的权限是没有root账号权限大的
  • 可以发现mobile后面是个$,root账号面跟的是个#,由此可知#表示是最高权限,$表示普通账号权限
  • 下面以在根路径下创建文件夹的例子来证明mobile和root账号的权限大小:
  • 因为手机越狱了,最好修改下root和mobile用户的登录密码(登录root账户后,分别通过passwdpasswd mobile完成)
  • 修改root账号密码:
  • 修改mobile账号密码:

当我们修改完密码在此登录的时候,如果还是输入初始密码alpine,会报错,权限不够,这是因为我们修改了密码,重新输入修改之后的密码后,登录成功。

1.5 SSL 、OpenSSL

  • 很多人会讲SSH、OpenSSH、SSL、OpenSSL搞混
  • SSL: Secure Sockets Layer的缩写,是为网络通信提供安全及数据完整性的一种安全协议,在传输层对网络连接并进行加密
  • OpenSSL: SSL的开源实现,绝大部分HTTPS请求等价于: HTTP + OpenSSL
  • OpenSSH的加密就是通过OpenSSL完成的
  • 远程登录的过程安全是通过OpenSSH来保证的, 但是OpenSSH 的加密是有OpenSSL来完成 ,OpenSSH 依赖于OpenSSL的 安装open SSH过程:
  • ios快捷指令 匹配 正则表达式 ios快捷指令ssh_客户端_03

1.6 SSH的版本

  • SSH协议一共2个版本: SSH-1SSH-2
  • 现在用的比较多的是SSH-2,客户端和服务端版本要保持一致才能通信
  • 查看SSH版本(查看配置文件的Protocl字段)
  • 客户端:/etc/ssh/ssh_config
  • 服务端:/etc/ssh/sshd_config
  • cat xxx 查看某个文件

1.7 SSH的通讯过程

  • SSH的通信过程可以分为3大主要阶段:
  • 建立客户端连接
  • 客户端认证
  • 数据传输

1.7.1 建立客户端连接

  • 第一次登陆过程中在建立连接的过程中,服务器会提供自己的身份证明(把公钥信息发送给客户端,然后客户端验证公钥信息(安全验证),是不是自己想连接的服务器,如果是 则连接, 不是 则可以不连接)
  • 第二次连接时候,客户端还是把公钥信息发送给客户端,但是客户端的~/.ssh/konwn_hosts文件中已近包含服务端的公钥信息,这时候就不需要进行安全验证了

安全连接,首先服务端要告诉客户端 他是谁

  • 如果客户端并无服务端的公钥信息,就会询问是否连接此服务器
  • ios快捷指令 匹配 正则表达式 ios快捷指令ssh_ios_04

  • 在建立安全连接过程中,可能会遇到以下错误信息:提示服务器的身份信息发生了变更
  • ios快捷指令 匹配 正则表达式 ios快捷指令ssh_服务器_05

  • 如果确定要连接此服务器,删除掉之前服务器的公钥信息就行了(ssh-keygen -R 服务器地址),或者是直接打开known_hosts文件删除服务器的公钥信息就行

1.7.2 客户端认证

1.7.2.1 认证方式
  • SSH-2提供了两种常用的客户端认证方式:
  • 基于密码的客户端认证: 使用账号和密码即可认证
  • 基于秘钥的客户端认证:免密码认证,最安全的一种认证方式
  • SSH-2 默认会有限尝试使用“密钥认证”,如果认证失败,才回尝试“密码认证”
1.7.2.2 基于密钥的客户端认证
  • 在客户端生成一对相关联的秘钥(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尾部
  • **注意:**由于是在~文件夹下操作,所以上述操作仅仅是解决了root用户的登录问题(不会影响moblie用户,也就是说moblie还是要走认证操作流程)
  • 可以使用ssh-copy-id将客户端的公钥内容自动追加到服务器的授权文件尾部,把客服端的公钥信息添加到服务器中后,在次登录就不在需要密码 :
  • ios快捷指令 匹配 正则表达式 ios快捷指令ssh_ios快捷指令 匹配 正则表达式_06

  • 手动操作
  • 赋值客户端的公钥到服务器的某路径:scp ~/.ssh/id_rsa.pub root @服务器主机地址:拷贝到服务器地址
  • scp是secure copy的缩写,是基于SSH登录进行安全的远程文件拷贝指令,是把一个文件copy到远程另外一台主机上
  • 上面的命令行将客户端的~/.ssh/id_rsa.pub拷贝到了服务器的~地址
  • SSH 登录服务器:ssh root@服务器主机地址,需要输入root用户的登录密码
  • 在服务器创建.ssh文件夹 mkdir .ssh(服务器已存在文件夹直接跳过)
  • 追加公钥内容到授权文件尾部cat ~/id_rsa.pub >> ~/.ssh/autorized_keys
  • 删除公钥:rm ~/id_rsa.pub
  • cat xxxx >> xxx :如果文件存在则追加到文件尾部,如果不存在则创建并追加
  • ios快捷指令 匹配 正则表达式 ios快捷指令ssh_Mac_07

  • 如果配置了免密码登录后,还需要输入密码,需要再服务器端设置文件权限
  • chmod 755 ~
  • chomd 755 ~/.ssh
  • chomd 644 ~/.ssh/authorized_keys
  • 设置完权限在此登录不需要密码:
1.7.2.3 权限指令解释

ios快捷指令 匹配 正则表达式 ios快捷指令ssh_ios快捷指令 匹配 正则表达式_08

chmod是Linux下设置文件权限的命bai令,后面的数字表示不同用户或用户组的权限。一般是三个数字:第一个数字表示文件所有者的权限第二个数字表示与文件所有者同属一个用户组的其他用户的权限第三个数字表示其它用户组的权限。

权限分为三种:读(r=4),写(w=2),执行(x=1)。综合起来还有可读可执行(rx=5=4+1)、可读可写(rw=6=4+2)、可读可写可执行(rwx=7=4+2+1)。所以755代表rwxr-xr-x当前用户可读可执行。

777代表rwxr-rwx-rwx所有用户都可读可写可执行。

所以,chmod755设置用户的权限为:

1.文件所有者可读可写可执行

2.与文件所有者同属一个用户组的其他用户可读可执行

3.其它用户组可读可执行

三个数字,表示三类管理者的权限
第一个数字表示文件所有者的权限
第二个数字表示与文件所有者同属一个用户组的其他用户的权限
第三个数字表示其它用户组的权限。
r=4 w=2 x=1

1.8 端口

  • 端口就是设备和对外提供服务的窗口,每个客户端都有个端口(范围0~65535,共2^16个)
  • 有些端口是保留的,已经固定了用途,比如:
  • 21端口提供FTP服务
  • 80端口提供HTTP服务
  • 22端口提供SSH服务(可以查看/etc/ssh/sshd_config的Port字段)
  • 更多端口号的信息可以百度
  • iPhone默认是使用22端口进行SSH通信,采用的是TCP协议
  • ios快捷指令 匹配 正则表达式 ios快捷指令ssh_ios快捷指令 匹配 正则表达式_09

1.9通过USB进行SSH登录

1.9.1 USB的登录流程

  • 默认情况下,由于SSH走的是TCP协议,Mac是通过网络连接的方式SSH登录到iPhone,要求iPhone 连接WIFI
  • 为了加快传输速度,也可以使用USB连接的方式进行SSH登录
  • Mac上有个服务程序usbmuxd(它会开机自动启动,也可以将Mac的数据通过USB传输到iPhone)
  • cd /System/Library/PrivateFrameworks/MobileDevice.framework/Resources
  • SSH首先需要登录自己的端口(例如10010端口),再通过usbmuxd把10010端口的数据传输到iPhone上的22端口
  • ios快捷指令 匹配 正则表达式 ios快捷指令ssh_客户端_10

1.9.2 usbmuxd的使用

  • 下载工具包usbmuxd工具包(下载v1.0.8版本,主要用到里面的一个python脚本:tcprelay.py
  • 下载地址:https://cgit.sukimashita.com/usbmuxd.git
  • 将iPhone的22端口(SSH端口)映射到Mac本地的10010端口
  • 如果像22端口发送数据,则直接向10010端口发送数据就可以
  • 10010 这个端口不是固定的, 只要不是保留端口就行
  • cd /Users/guoweiyong/Documents/usbmuxd
  • python tcprelay.py -t 22:10010
  • 加上-t参数为了能够同时支持多个SSH连接
  • 注意:要想保留端口映射状态,不能终止此命令(如果要执行其他终端命令,请新开一个终端界面)
  • ios快捷指令 匹配 正则表达式 ios快捷指令ssh_ios_11


  • 端口映射之后,在登录就直接登录本地的10010端口,登录成功后,之心python文件的窗口也会有打印,这证明确实是在监听这个端口的一些操作 :
  • ios快捷指令 匹配 正则表达式 ios快捷指令ssh_客户端_12

  • ssh -p 10010 root@localhostssh root@localhost -p 10010 都是可以的
  • 下面我们使用usb的方式从mac电脑拷贝文件到iphone上
  • ios快捷指令 匹配 正则表达式 ios快捷指令ssh_ios_13

  • localhost127.0.0.1(本机虚拟网卡IP地址)都可以表示本机
  • scp表示端口号时 是用大写P(-P)表示的

2.0 SSH的脚本

  • 我们可以将进场执行的一系列终端命令放到sh脚本文件中(shell),然后执行脚本文件
  • 可以通过shbashsource命令来执行脚本文件
  • shbash
  • 当前shell环境会启动一个子进程来执行脚本文件,执行后返回到父进程的shell环境
  • 执行cd时,在子进程中会进入到cd的目录,但是在父进程中环境并没有改变,也就是说目录没有改变
  • source
  • 在当前的shell环境下执行脚本文件
  • 执行完cd后跳转到cd的目录
  • source可以用一个点.来代替,比如:.tesh.sh
  • 为了简化步骤我们可以把链接映射usb端口的操作和登录操作分别放在一个脚本文件中,然后我们每次直接执行脚本文件,就不用每次都需要敲映射和登录的指令了
  • ios快捷指令 匹配 正则表达式 ios快捷指令ssh_Mac_14

2.1 IOS终端中文乱码问题

  • 默认情况下, IOS终端不支持中文输入和显示
  • 解决方案:新建一个~/.inputrc文件,文件的内容是
  • 不将中文字符转化为转义序列:set convert-meta off
  • 允许像终端输出中文:set output-meta on
  • 允许像终端输入中文:set meta-flag onset input-meta on
  • 如果想要在终端编辑文件内容,就可以通过Cydia安装一个vim:

2.2 常用命令行指令

rm: 删除
cat: 查看 (例如查看公钥)
ls-l: 查看路径下全部内容