分类 教程 下的文章

笔者最近在研究如何让 APP 以 ROOT 权限在 iOS 12 上运行,实现沙盒逃逸 (Sandbox Escape),但是奈何国内外资料都过于古老,不是无法运行,就是拿不到权限,因此特写此文章,帮助之前跟我一样迷茫的同学。

引言

该篇博文适用范围:尝试了国内外的资料,利用 fake bash 方法想要实现 ROOT 提权,但是却遇到 “此应用需要更新以在 iOS 11 上运行” 的问题。

首先,在 Github 上有一个作者开源了一个 shell 脚本 —— App2Deb ,它可以自动打包 IPA 为 DEB 文件,并且能够实现 iOS 12 上 ROOT 权限运行。这样子就解决了我们 iOS 12 上 ROOT 权限的问题,但是该问题解决了又来了另外一个问题,因为笔者的项目中使用了 KeyChain 相关的内容,由于该脚本过于简单,并未针对 Apple 的重签名政策进行特定设置。因此,在研究了该脚本之后,对其进行了补充。

N-App2Deb

App2Deb 原为 的一个自动打包 ipa 文件为 deb,并且能将打包后的 APP 安装至 /Applications 下,以 root 权限运行的 shell 脚本。但是该作者的脚本过于简单,并未针对 Apple 的重签名政策进行设置。例如 KeyChain 等。因此,笔者将该脚本进行扩充,目前增加了 KeyChain 访问,并将该脚本改名为:N-App2Deb

适用范围

  • 你的 APP 内部涉及了与 KeyChain 相关的操作,例如 RSA 加密便用到了 SecKeyRef ,而 SecKeyRef 则涉及了 KeyChain

如何使用

首先我们要明白,以 KeyChain 为例子,每一个涉及了 KeyChain 的 APP,都会在 IPA 目录内生产一个 embedded.mobileprovision 该文件中包含了各种 APP 相关的头信息,例如 keychain-access-groups 等等。

如果你想要使用 N-App2Deb 脚本,请将该脚本 fork 至 你的仓库,修改 Resources 目录下的 entitlements.xml 并添加 embedded.mobileprovision 中相关头文件信息。

代码示例

  1. 首先用 ATOM 等任意代码编辑器打开 embedded.mobileprovision 复制该文件下 KeyChain 相关的头信息
    <dict>
    <key>application-identifier</key>
    <string>2AMH2MYA4V.devs.nactro.achelper</string>
    <key>keychain-access-groups</key>
    <array>
    <string>2AMH2MYA4V.*</string>
    </array>
    <key>get-task-allow</key>
    <false/>
    <key>com.apple.developer.team-identifier</key>
    <string>2AMH2MYA4V</string>
    </dict>
  1. 将该头信息复制到 entitlements.xml 下,完整的 entitlements.xml 应该如下所示
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.private.security.no-container</key>
    <true/>
    <key>com.apple.private.skip-library-validation</key>
    <true/>
    <key>get-task-allow</key>
    <true/>
    <key>platform-application</key>
    <true/>
    <key>application-identifier</key>
    <string>2AMH2MYA4V.devs.nactro.achelper</string>
    <key>keychain-access-groups</key>
    <array>
    <string>2AMH2MYA4V.*</string>
    </array>
    <key>com.apple.developer.team-identifier</key>
    <string>2AMH2MYA4V</string>
</dict>
</plist>

至此,你可以使用 N-App2Deb 打包 IPA 文件为 DEB,并安装到你的 iPhone

dpkg -i [Your Package Name]

使用方法与 App2Deb 一致

App2Deb [Your IPA Path]

值得注意的是,不要忘记替换 InstallApp2deb 文件中相关的下载链接为你自己仓库的地址。

Github 地址:N-App2Deb

前言:

处于研究 iOS 攻防的需要,笔者今天就来浅谈下 iOS APP 逆向工程的具体步骤。为了保护 Target APP ,这篇博文并不会泄漏任何关于 APP 内容以及所涉及到的内部方法。

工具:

正所谓,工欲善其事,必先利其器。因此,我们需要以下几个软件。

  • Hopper Disassembler
  • Class-dump
  • Theos

分别介绍以下这几个软件:

Hopper Disassembler 是一款二进制反汇编器,包含:反编译以及调试。

Class-dump 是一款利用 OC Runtime 机制,导出 iOS APP 的头文件工具。

Theos 是一款用于为 iO S和其他平台构建和部署软件的跨平台工具套件,在这里我们用它编写 iOS Tweak ( Dylib ),检测我们是否完成逆向工程。


砸壳:

如果你是从 App Store 中下载的 iOS APP ,那么你需要进行砸壳,这不是我们本文谈论的重点,笔者就不在这过对赘述。
P.S : 如果你是从 XX助手 之类的地方下载的 iOS APP ,那么它们大都是已经脱过壳的,你只需要找到 Mach-O 文件,就可以开始以下步骤。

分析:

在这里,笔者用的是一款具有付费订阅功能的 iOS APP ,那么我们就需要确定我们解决的问题,在这里当然是:破解付费订阅内容。

导出头文件:

利用 Class-dump 导出已经砸过壳的 APP 。

class-dump -H Mach-O 文件路径 -O 指定生成头部文件路径

分析:

利用 Hopper 查找关键字,这里你可能需要多多使用你的 Target APP ,用来寻找字段。既然这个 APP 有订阅付费功能,那我们就直接搜索 isVip关键字试试看。在这里,我们可以很清楚的看到,确实是有这个关键字的,那么如果你的 Target APP 中没有这个关键字,那不妨多多试试,例如 subscription之类的字眼。

1.png

紧接着,我们选择伪代码分析,我们可以看到具体的代码逻辑。

2.png

我们可以很清楚地看到,这个 APP 利用 NSUserDefaults 用来存储用户订阅信息。那么我们找到对应的头文件看一下。

4.png

打开头文件后,注意笔者画红线的地方,在这个对象中,声明了一个私有属性,NSNumber *is_subscription_user;那到这里也就很明显了,这个对象的私有成员属性的 NSNumber 类型返回给 isVip用来判断是不是付费订阅用户。

编写插件:

我们利用 Theos 创建一个 iOS Tweak 工程,在 Tweak.xm 工程文件中,编写以下代码:

5.png

看到这,细心的同学可能已经发现了,为什么这里给 - (NSNumber *)is_subscription_user; 这个对象方法返回了一个 [NSNumber numberWithInt:1]; 呢?答案你可以在上方的注释中找到。

/**
 Key hack
 @param 强制返回VIP用户
 @return 1 stands for vip; 0 stands for nonVip;
 */

编译插件,安装到我们的 iOS 设备中,我们发现 Target APP 已经成功变成了 VIP 的界面。至此,这款 APP 的逆向工程之路就算是走完了。

小结:

这次的逆向之路之所以这么顺利是因为这个 APP 没有做代码混淆等等反破解手段。如果遇到这些 APP ,肯定需要花更多的功夫,还会用到更多的工具,例如 Reveal 以及 Hopper 代码逻辑分析等等。


另外我之所以写这篇文章,目的是出于研究 iOS 攻防,本篇博文肯定是漏洞百出,如有不正确的地方,还请大家斧正!本人初入 iOS 逆向工程,斗胆在各位大神面前班门弄斧,还请不要见笑。

前言:

今天利用 Bootstrap 框架写页面,页面中也运用了 AJAX 技术,碰到个 Button 一直刷新网页,导致 AJAX 失效的问题。

解决方案:

添加 type="button" 即可解决

<button class="btn btn-lg btn-primary btn-block" name="submit" onclick="query()" href="#" type="button">开始查询</button>

前言:

TOR 的全称是 "The Onion Router" , "An anonymous Internet communicaton system" 通过 TOR 访问一个地址时,所经过的节点在 TOR 节点群中随机挑选,动态变化,由于兼顾速度与安全性,节点数目通常为 2-5 个,由于追踪困难,因此有效保证了安全性。

搭建要求:

  • 一台 ECS
  • 操作系统 CentOS (不同系统步骤大致相同

TOR 域名获取:

通过 yum 安装 TOR

$ yum install -y tor

编辑 /etc/tor/torrc 文件,增加以下配置:

HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 80 127.0.0.1:8080

启动 TOR 服务

sudo service tor start

当 TOR 启动后,会创建一个私钥在你的 hidden_service 目录,同时创建你的独一无二的 .onion 主机名。


配置 Tor 目录:

在 Nginx 下的 vhost 目录添加虚拟主机配置文件,例如 yourDomain.onion.conf

server
{
listen 8080;
server_name yourDomain.onion;
index index.php index.html index.htm default.php default.htm default.html;
root /你的目录/yourDomain.onion;
}

在服务器文件目录下增加内容

  <!DOCTYPE html>
  <html lang="en" dir="ltr">
    <head>
      <meta charset="utf-8">
      <title>HelloWorld!</title>
    </head>
    <body>
      <h1>HelloWorld</h1>
    </body>
  </html>

紧接着重启 Nginx

$ service nginx restart

结尾:

至此,你已经可以通过这个 TOR 域名访问到你的服务器上的内容。

前言:

如果你像我一样用的是虚拟环境,找到服务器下 Nginx 的虚拟 conf 配置文件,添加以下代码:

if ($ssl_protocol = "") { return 301 https://$host$request_uri; }

添加完毕后,运行以下命令,以使配置文件生效。

$ Nginx -s reload

值得注意的是

这里有一个坑,之前自己是手动添加的 HTTP 强转 HTTPS,结果导致网站出现重定向过多的问题;如果也遇到了重定向过多的问题,那不妨检查下你的 Nginx 配置文件,是否是配置文件出现了问题。