本文主要是介绍我破解了一个Android应用程序以免费理发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Android应用程序主要由捆绑在一起的一堆二进制文件组成,这些二进制文件是由已编译的Kotlin或Java代码构建的。 原始的源代码可以通过位于Google搜索页面顶部的几个轻量级工具轻松重建。
如果您是一个快乐的Android开发人员,并且没有足够谨慎地将最佳安全实践应用于您的项目,那么您将永远不会高兴。 您认为所有宝贵的秘密都会安全地隐藏在您的代码中,有动机的人可以并且会在野外对您使用。 这正是这家理发店连锁店的Android应用程序所发生的事情。
开发人员无视各种安全最佳实践,结果导致在短短几个小时内,我就能够进行反编译,反向工程并识别出几个漏洞,任何人都可以利用这些漏洞来实现每个黑客的目的。追求人生的梦想:终生免费理发!
在这里,我将向您介绍整个黑客过程,向您展示遵循安全最佳实践的重要性以及简单的决定如何极大地增加对Android应用程序进行反向工程和利用的难度。
这个理发店连锁店的应用程序有一个非常简单的用途:用户可以在可用的商店预订发型,每10个发型,用户可以one for free
获得one for free
。
到目前为止,它们看起来都像是应用程序要做的非常好的任务。 但是,在安装应用程序并查看我的个人资料页面后,有一条非常明确且有趣的消息:赠品只能通过应用程序生成-不能由任何其他平台生成-并且还可以在用户需要时使用:需要在付费时出示应用程序。
这则消息肯定引起了我的注意。
因此,为了满足我的好奇心,我下载并反编译了apk。
假设我看了一下代码,也许可以以一些创造性的方式使用该应用程序。
我是对的:我发现完全是一团糟。
在对应用程序进行反编译并对代码进行反向工程之后,我确定了几个漏洞。 稍后,我将一步一步地讨论原始开发人员可以采取哪些措施来防止这种情况:
- 无需代码混淆,使其真正易于反向工程
- 没有证书或任何类型的应用程序完整性检查,使后端无法发现被篡改的客户端应用程序
- 在客户端应用上实施的重要业务逻辑,无需在后端进行进一步的确认检查
- 代码上的硬编码秘密使后端的私有api暴露出来并易于利用
APK文件
首先将Kotlin和Java源代码编译为.class
文件,该文件由bytecode
指令组成。 传统上,这些字节码指令将直接在JVM上执行。 但是,Android应用程序是在Android Runtime
上执行的,该Android Runtime
使用的指令不兼容,因此需要执行额外的Dexing
步骤,将.class
文件转换为单个.dex
文件。
这是编译过程:
反编译APK
在线上有几种工具可以反编译apks
,并将.dex
文件转换为可读的Kotlin或Java代码。 生成的反编译代码是理解目标应用程序功能的切入点,但可能不是100%可用的代码。 换句话说,您可以阅读源代码,但不能真正使用它来修改,重新编译和构建原始应用程序。
apk的decompilation
步骤:
但是,由于我真的很想apktool
代码,因此无论如何,我还是使用apktool
来反编译apk及其.dex
文件的内容(上述步骤1和2)
$ apktool d target_app.apk
如前所述, .dex
文件是平台真正理解的格式。 但是,读取或修改二进制代码并不容易,因此有一些其他工具可以将其与人类可读的表示形式相互转换。 最常见的人类可读格式是称为Smali
的汇编语言。 这是apktool
输出并存储在/smali
文件夹中的格式。
这是一个smali
文件的样子:
Smali
文件是我们稍后将要编辑的文件,但不清楚地是我们希望对整个应用程序进行逆向工程的文件。 除非我们被迫这样做。
为了查看可以帮助我进行逆向工程过程的更友好的代码,我使用dex2jar
将这些smali文件转换为标准.class
文件(上面的步骤3):
$ dex2jar decompiled_app/build/apk/classes.dex
bo! 正如原始开发人员所写的那样,我现在可以以非常熟悉的格式访问完整的应用程序源代码。
现在,让我们看看我发现了什么
漏洞1:不会混淆代码!
混淆和最小化是用于减少未使用的代码并缩短应用程序类和成员名称的策略-通常通过将它们替换为无意义的东西-不仅使它很难阅读,而且进一步减小了应用程序的大小。
如果您不进行任何形式的代码混淆处理,则几乎可以将您的私有存储库的访问权限授予黑客。
在这种特殊情况下,理解和遵循代码,识别第三方技术以及用于认证它们的秘密非常简单。
使用某种混淆工具(如ProGuard
可以很容易地避免这种情况,这至少会使黑客的生活更加艰难,并迫使他们投入更多的精力来对代码进行逆向工程。
这是应用混淆[ 2 ]之前和之后的代码的样子:
漏洞2:硬编码的机密
我看过的第一个类,实际上是一个称为CLIENT_SECRET
的硬编码变量,该变量以后将用于验证对后端的每个Http调用。
突然之间,我现在可以访问整个应用程序的私有api来四处寻找新的攻击媒介。
如果您确实需要在客户端应用程序上存储机密信息以提供某种身份验证,则可以通过在代码上进行硬编码来以多种方式避免这种情况,而不会破坏这些机密信息。
有几种众所周知的方法,例如使用对称密钥派生策略或基于密码的密钥派生函数 。
在这里可以找到关于这些方法的非常详细的很好的视图。
漏洞3:客户端应用上的重要业务逻辑,无需在后端进行确认检查
这就是事情变得有趣的地方...继续寻求最好的发型-我不必支付的费用-我仍然必须找到一些漏洞,该漏洞将使该应用程序为我免费生成一个发型预订。
在花了大约一个小时的时间来查看代码之后,这是我所学到的:
- 后端存储所有
Shops
和User
信息 - 后端存储每个用户的
Bookings
- 客户端应用通过
REST
调用检索每个用户的所有Bookings
- 每个对后端的
REST
调用均由硬编码的client_secret
和用户特定的basic_auth
凭据标识
现在,蛋糕上的樱桃:
- 客户端应用通过计算
User
已成功进行了多少次预订,而不是后端,确定何时授予freebie
-
freebie
只是一个标准的booking
REST电话,带有一个额外的flag
表明预订可free haircut
在这一点上,您可以猜测当我Swift将预订flag
设置为true的booking api发布POST
时,后端响应是什么:
> 200 OK!
在看了这么多错误之后,我承认我并不感到惊讶。
我们可以从中学到的是,通过让您的client app
调用诸如以下的重要决定: 当需要授予免费预订时,您实际上是将宝贵的业务规则放在整个用户旅程中最脆弱的一端。
更糟糕的是,当您仍然有机会时,不要在后端验证REST调用。 显然,在接受和存储从客户端应用程序传入的任何内容之前,必须先验证用户是否已完成并支付足够的预订费用来获得免费的预订。
这将我引到最后但并非最不重要的漏洞:
漏洞4:没有客户端应用程序完整性检查
如果要在客户端应用程序上编写重要的业务逻辑决策-顺便说一句,这是完全错误的-至少可以做的是建立某种机制来验证应用程序的真实性。
上面的许多漏洞都可以通过某种客户端应用程序完整性检查来缓解,从而使后端服务器可以验证api调用何时来自合法应用程序,并丢弃来自受感染应用程序的api调用。 通过使用应用的发布证书对请求进行签名,可以轻松实现这一目标。
每个Android APK均使用发布证书签名。 如果重新编译了apk并通过代码更改再次对其进行了重新编译,则类似于我在此处描述的过程,新的重新编译的apk必须使用不同的证书签名,因为黑客将无法访问用于对原始apk进行签名的原始证书。仅原始开发人员拥有的合法应用程序。
另外,Google本身也提供应用许可服务 帮助您验证当前应用是从Play商店还是从其他未知来源(黑客)安装的。
更改Smali程序集文件并重新编译APK
因此,既然我们对黑客感到满意,并且知道了应在何处放置恶意代码,那么该是编辑一些汇编文件并重新编译整个程序的时候了。 还记得smali
吗?
apktool
每个.class
输出一个.smali
文件,因此至少很容易浏览并确定应在何处进行更改。 但是,从现在开始,您就自己一个人了:如果您不熟悉某种汇编语言,这可能是一个非常痛苦的过程。
我很高兴我不必为自己被篡改的预订请求进行太多更改。 仅添加几个flags
并删除几个:gotos
就足够了。
完成编辑后,只需再次使用apktool
重新编译所有内容:
$ apktool b -f decompiled_app -o hacked_app.apk
生成一个随机密钥对,以对重新编译的应用程序进行签名,如下所示:
$ keytool -genkey -v -keystore some_ks.keystore -alias some_alias -keyalg RSA -keysize 2048 -validity 1000
签名重新编译的应用程序,我用过jarsigner
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore some_ks.keystore hacked_app.apk some_alias
而且你很好走!
就是这个。 这是欢乐的时刻。 我已经做过黑客从未做过的事。 我可以坐下来安装我的被篡改的应用程序,用我被篡改的请求调用理发店专用api,最后,我可以预订免费理发!
这是值得的! (假设)
结论
这是为了表明,如果您不采取必要的预防措施来保护您的知识产权和业务逻辑,那么窃取您的秘密是多么容易,并且代码通常容易受到攻击。 网上广泛提供了几种利用工具以及如何正确使用它们的常识,这意味着如果您的应用程序被黑,这不仅是运气问题,不是,这只是时间问题。
因此,您最好开始花一些时间来学习最佳做法。 否则,您只是在敞开大门让别人真正利用您的代码,并可能对您的业务造成重大损失。 不仅像我在这里那样出于教学目的显示它。
翻译自: https://hackernoon.com/i-hacked-an-android-app-to-get-a-free-haircut-q91e3yaq
这篇关于我破解了一个Android应用程序以免费理发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!