专栏名称: 看雪学苑
致力于移动与安全研究的开发者社区,看雪学院(kanxue.com)官方微信公众帐号。
目录
相关文章推荐
环球旅讯  ·  纸质火车票,将成为历史! ·  2 天前  
环球旅讯  ·  纸质火车票,将成为历史! ·  2 天前  
看雪学苑  ·  巴西逮捕臭名昭著的黑客USDoD,涉及FBI ... ·  2 天前  
FDA食安云  ·  答复|关于现行标准下含有食品添加剂 ... ·  3 天前  
FDA食安云  ·  答复|关于现行标准下含有食品添加剂 ... ·  3 天前  
奇安信CERT  ·  Oracle ... ·  5 天前  
奇安信CERT  ·  Oracle ... ·  5 天前  
51好读  ›  专栏  ›  看雪学苑

教程 | 使用 Frida 来解决 OWASP iOS crackme

看雪学苑  · 公众号  · 互联网安全  · 2017-05-13 10:17

正文

在这篇文章中,我将解释如何使用 Frida 解决 《OWASP 移动安全测试指南》(MSTG)1 级的 Crackme。 非常感谢 Bernhard Mueller 创建这些crackme,并 鼓励人们写教程阐述如何使用开源工具来攻破他们。 在结尾部分,我将对 OWASP iOS crackme 教程做进一步阐释,并展示如何使用 NowSecure 上的一些工具打破crackme。


OWASP iOS crackme 指导概述

首先,我下载这个 app 并重新签名,这样就能把它安装到我的测试机上。 由于本教程是关于动态分析的,所以我得使用一个真实机器,还得安装 Frida。安装了 app 后,运行起来,观察 UI,然后用我的工具来解决这个谜题。 如果没有工具来揭开这个app的面具,几乎不可能猜到答案并解决问题。 这才是关键,动态分析不仅是得以一窥app奥秘的的强大工具,也是逆向 app 和执行 app 安全测试的强大工具。 我将展示一下如何使用 UI 完全自动化的解决方案来处理这个 crakeme,其中有一些构建在 Frida 之上的非常强大的工具。

继续!


下载并给 app 重签名


你可以在这拿到crakeme.ipa

你可以在这儿 follow OWASP的crakeme工具,或者使用 Cydia Impactor,iSign等等。

我会使用nowsecure/applesign工具,这个工具本质上是苹果代码和相关工具的封装。

$ applesign ./UnCrackable_Level1.ipa -B -c -d --identity xxx --mobileprovision ~/.isign/Manual_iOS_Team_Provisioning_Profile.mobileprovision --output /tmp/resigned.ipa

Unzipping /Users/user/apple/ipa/crackmes/UnCrackable_Level1.ipa

Payload found

Main IPA executable is not encrypted

Embedding new mobileprovision

{"keychain-access-groups":["xxx.*"],"get-task-allow":true,"application-identifier":"xxx.*","com.apple.developer.team-identifier":"xxx"}

Cloning entitlements

Updated binary entitlements/Users/user/apple/ipa/crackmes/UnCrackable_Level1.ipa.eaf60e81-9162-4437-a954-438301932004/Payload/UnCrackable Level 1.app/UnCrackable Level 1.entitlements

Signing libraries and frameworks

Executable found at /Users/user/apple/ipa/crackmes/UnCrackable_Level1.ipa.eaf60e81-9162-4437-a954-438301932004/Payload/UnCrackable Level 1.app/UnCrackable Level 1

Resolving signing order using layered list

Signed /Users/user/apple/ipa/crackmes/UnCrackable_Level1.ipa.eaf60e81-9162-4437-a954-438301932004/Payload/UnCrackable Level 1.app/UnCrackable Level 1

Verifying /Users/user/apple/ipa/crackmes/UnCrackable_Level1.ipa.eaf60e81-9162-4437-a954-438301932004/Payload/UnCrackable Level 1.app/UnCrackable Level 1

Zipifying into /tmp/resigned.ipa ...

Cleaning up /Users/user/apple/ipa/crackmes/UnCrackable_Level1.ipa.eaf60e81-9162-4437-a954-438301932004

Target is now signed: /tmp/resigned.ipa

使用 Applesign 有一大优点,它能自动启用重签名的 app 的 get-task-allow 权限,这对于附加调试器很有用。

既然我有一个重新签名版本的.ipa,那我就用 libimobiledevice 工具把它安装在设备上。

$ ideviceinstaller -i /tmp/resigned.ipa

WARNING: could not locate iTunesMetadata.plist in archive!

WARNING: could not locate Payload/UnCrackable Level 1.app/SC_Info/UnCrackable Level 1.sinf in archive!

Copying './resigned.ipa' to device... DONE.

Installing 'sg.vp.UnCrackable1'

Install: CreatingStagingDirectory (5%)

Install: ExtractingPackage (15%)

Install: InspectingPackage (20%)

Install: TakingInstallLock (20%)

Install: PreflightingApplication (30%)

Install: InstallingEmbeddedProfile (30%)

Install: VerifyingApplication (40%)

Install: CreatingContainer (50%)

Install: InstallingApplication (60%)

Install: PostflightingApplication (70%)

Install: SandboxingApplication (80%)

Install: GeneratingApplicationMap (90%)

Install: Complete

所以现在我可以在设备上运行这个 app,如果你也跟着做到这儿了,应该在屏幕上看到下面的内容:

我需要使用“在隐藏标签中发现一个秘密!”的提示来寻找解开crackme所需要的文本。

如果我不能输入正确的数值,那我会得到下面的结果:

提示

** 前方警惕 ** - 过了这一步我得警告一下,再继续就得风险自负。

现在我要动用提示和一些聪明才智来解决这个问题。 我可以尝试的一件事是dump应用程序的视图层次结构。

来自于苹果的档案:

Only one window at a time can be the key window, and you can use a window’s keyWindow property to determine its status.(一次只能有一个窗口是关键窗口,您可以使用窗口的keyWindow属性来确定其状态。)

所以我可以在应用程序运行时使用 Frida 询问当前的 UIWindow 及其视图层次结构。 随着 Frida 及其 python 命令行界面(CLI)工具的安装,我将执行以下操作:


Frida Objective-C API


您可以在这里了解更多关于 Frida  的Obj-C API。 使用这些 API,我可以弄清楚如何绑定到 UIWindow,获取它的 keyWindow,然后,通过足够的研究,找到将 dump 整个视图层次结构的 recursiveDescription 函数来查看。


终极解决



$ frida -U UnCrackable1

     ____

    / _  |   Frida 9.1.27 - A world-class dynamic instrumentation framework

   | (_| |

    > _  |   Commands:

   /_/ |_|       help      -> Displays the help system

   . . . .       object?   -> Display information about 'object'

   . . . .       exit/quit -> Exit

   . . . .

   . . . .   More info at http://www.frida.re/docs/home/

[USB::iPhone::UnCrackable1]-> w = ObjC.classes.UIWindow.keyWindow()

{

    "handle": "0x135e608a0"

}

[USB::iPhone::UnCrackable1]-> desc = w.recursiveDescription().toString()

"; layer = >

   | >

   |    | >

   |    | >

   |    | ; layer = >

   |    |    | <_uitextfieldroundedrectbackgroundviewneue:>>

   |    | >

   |    |    | >

   |    | <_uilayoutguide:>>

   |    | <_uilayoutguide:/>>"

如果你仔细观察,你会发现隐藏的 UILabel 有秘密:

|    |  = NO; layer = <_uilabellayer:>>

在那里 - “我是小孩!” 我输入框中,点击验证,我完成了:

棒呆!

但是我想再多一点点...我可以把它变成一条龙解决,来填补tweet的覆盖不到的地方:-)。

$ frida -q -U UnCrackable1 -e "ObjC.classes.UIWindow.keyWindow().recursiveDescription().toString();" |grep "UILabel.*hidden.*"

所以你可以看到,Frida 很酷!


自动化


如果我想再次解决这个难题,或者更好的解决 - 如何完全自动化进入解决方案的过程,以便我不必重复自己? 为了实现这一点,我将使用一个名为“UI Automation Editor”的NowSecure工具来记录和重播一个UI自动化脚本,每一次都自动运行。

这就是这个工具的样子:

基本上有一个内置的按钮来dump 这些view的层次结构,还有一个“record”和“replay”按钮,这是完美的解决这种特定的crakeme的方案。

这里有一些工具的视频:(译者按:三个视频来自于油管,需翻墙)

第一部分:

https://youtu.be/oWhT0DUwuOY

第二部分:

https://youtu.be/QFOcEys5C2M

第三部分:

https://youtu.be/Xrc8mg-WqLg

以下是使用一些 tweaks 之后,UI自动化脚本最终的样子:

var target = UIATarget.localTarget();

target.captureScreenWithName('beginning');

target.frontMostApp().mainWindow().textFields()[0].setValue(getSpoiler());

target.frontMostApp().mainWindow().buttons()["Verify"].tap();

// [1] we're going to handle the alert pop up

var alert = target.frontMostApp().alert();

// [2] verify the shape of the alerts

if (!(alert instanceof UIAElementNil)) {

    target.captureScreenWithName('prompt');

    onAlertHandler(alert);

    target.delay(2);

}

// [3] alert handler -- let's take a screenshot when we WIN!

function onAlertHandler (alert) {

    UIALogger.logDebug('on alert handler');

    target.captureScreenWithName('prompt'); // take a screenshot called 'prompt2'

    var buttons = alert.buttons().toArray();

    return true;

}

// SPOILER ALERT

function getSpoiler () {

  return "i am groot!";

}

使用 NowSecure Lab Automated 实现全自动化

现在,如果我们想更深入甚至不需要一个设备连接到我们的系统。 我们可以用一个像 NowSecure Lab Automated 这样的工具。 这种方法的优点是  Lab Automated 可以使用用户提供的UI自动化脚本重新签署应用程序,部署设备以及运行应用程序。 现在我们可以一次又一次地破解这个 crakeme!

https://youtu.be/_S9bC5n70TI

希望你能喜欢这个教程!


由看雪翻译小组 daemond 编译,来源David Weinstein@NowSecure

戳👇 图片加入看雪翻译小组哦!


往期热门内容推荐



更多优秀文章,长按下方二维码,“关注看雪学院公众号”查看!

看雪论坛:http://bbs.pediy.com/

微信公众号 ID:ikanxue

微博:看雪安全

投稿、合作:www.kanxue.com