天涯论坛

 找回密码
 立即注册
搜索
查看: 18|回复: 2

看我怎么样破解一台自动售货机

[复制链接]

3056

主题

155

回帖

9923万

积分

论坛元老

Rank: 8Rank: 8

积分
99238923
发表于 2024-10-3 06:35:44 | 显示全部楼层 |阅读模式

声明:本文仅限技术讨论,严禁用于任何违法用途

毫无疑问,自动售货机是非常受欢迎的东西,咱们总会从中购买获取有些小零食。早几年前,自动售货机只接受离线的硬币支付,之后,慢慢采用了普及的NFC技术功能。倘若我说起“COGES”售货设备 (英国售货设备厂商),我想肯定会勾起非常多人的美好时光回忆。时光辗转,一不留心,有些事情就出现基本性的变化,现如今,这已然是一个被网络万物互联的时代了。今天,我就来和大众分享一个,我是怎样黑掉一台自动售货机,反复实现充值和购买售货机中商品的事例。

事情起因

有一天,我厌烦了深入简出的无聊生活,打算回老家晒晒太阳休憩休憩,临走前,我到了学校拜访一个大学教授。穿过走廊,老师提议,咱们去喝杯咖啡吧,于是,咱们来到了自动售货机旁。

我说:我来吧,我有硬币。

老师:等等,我能够用手机APP来支付,这般会便宜点。

能够看到,这是一台Argenta自动售货机,其APP支付方式是基于蓝牙和NFC功能的,啊,虚拟钱包便是好啊!

此时,我心里闪过的念头 - 我能把它黑掉吗???

白帽心声:赏金就当做是一种鼓励吧。

灰帽心声:就当做练练手吧。

黑帽心声:来吧,伙伴咱们去收拾一下那个东西,这般就很牛了!

于是乎,我就决定改天就开黑。

技术分析

某天,我把我的安卓手机设置开启了USB调试模式,而后从应用商店中下载了自动售货机APP,并把原始APP的apk文件转储到笔记本电脑中,用adb去调试分析:

# adb pull /data/app/com.sitael.vending-1/base.apk ./Argenta.apk

用apktool对它进行反编译:

# apktool d ./Argenta.apk ./Argenta

再用 jadx提取出其中的java源文件:

# jadx ./Argenta.apk

AndroidManifest.xml名单文件是每一个Android程序中必须的文件,它是全部Android程序的全局描述文件,除了能声明程序中的Activities,Content Providers,Services,和Intent Receivers,还能指定应用的名叫作运用的图标、包括的组件以及permissions和instrumentation(安全掌控和测试)。这儿,一起始,需要把AndroidManifest.xml文件中的调试属性更改为ture,之后才可在手机上进行调试,便是往application 标签中添加一行 android:debuggable=”true” 属性。

接下来, 重建apk文件:

# apktool b ./Argenta

而后用工具keytool来创建一个新的密钥:

# keytool -genkey -v -keystore Argenta.keystore -alias Argenta -keyalg RSA -keysize 2048 -validity 10000

接着,运用该创建密钥,用jarsigner来对全部apk文件进行签名:

# jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore Argenta.keystore Argenta.apk Argenta

再用工具zipalign来对apk程序文件进行优化

# zipalign -v 4 Argenta.apk Argenta-signed.apk

最后,就能够安装这个重建好的apk文件了。

# adb install ./Argenta-signed.apk

我在手机上安装运行了这个APP程序,并用工具logcat,经过包名对其程序日志进行过滤分析:

# adb logcat --pid=`adb shell pidof -s com.sitael.vending`

然则,没什么收获,我打算再从其源代码中瞧瞧能有什么线索。从AndroidManifest.xml文件中,我发掘了指向RushOrm的多个引用。

因此这儿首要我找的关键字便是db_name,从这儿发掘了argenta.db的影子:

接下来,在手机中,我用工具Root Explorer继续来瞧瞧这个argenta.db,真的是存在的:

而后,我用adb pull方式把手机中的这个文件拷贝到笔记本电脑中来分析:

# adb pull /data/data/com.sitael.vending/databases/argenta.db ./db

并尝试用SQLite的数据库浏览工具SQLiteBrowser来打开这个db文件:

哦,显然,它是有秘码守护的,打不开。

逆向工程

在源代码中,我分析了RushAndroidConfig.java:

从其中,我竟然发掘了配置数据库的各样办法(method),然则,其中这个键值导致了我的重视

this.encryptionKey = getDeviceId(context)

它的定义如下:

从上图信息中可知,目的APP程序运用了手机的IMEI串号做为以上SQLite数据库argenta.db的加密密钥,一般的手机,在键盘上输入*#06#就可得本身串号。那样咱们用手机串号来试试吧,瞧瞧能否能把数据库文件打开:

哇,真的能够啊:

经过一番检测,我找到了UserWallets这个表:

并对其中的walletCredit一栏做了修改,把它从0改为了5(5欧元):

而后,我再把这个数据库文件拷贝回手机APP中:

# adb pull ./argenta.db /data/data/com.sitael.vending/databases/argenta.db

破解验证

此时,YY一下,我的感觉就像游戏帝国时代(Age Of Empires)中的“罗宾汉”同样能够随便持有1000枚金币。好吧,还是先来写个小程序吧,经过这个程序,能够快捷地对目的APP数据库进行转储/恢复/篡改:

接下来,咱们就带上手机,去自动售货机那试试看吧!呵呵,竟然成功地买了一瓶矿泉水,真的能够用其中的5块钱顺利地进行消费,还能反复消费运用

https://www.youtube.com/watch?v=LfczO8_RfLA

总结

从APP账户中的0元,到之后破解APP数据库后,我能够进行以下操作:

修改APP账户的金额

任意购买自动售货机中的东西

继续用余额购买

余额为0之后可重新更改余额

如此重复消费购买自动售货机中的商品

在对全部APP源代码做了大概分析之后,我发掘其中的非常多代码都未做混淆编码,这寓意着,售货机厂商采取很好的办法来对用户数据和应用程序安全实行守护

再三纠结 ,一月后,出于白帽的心理,我还是向售货机厂商报告了这个漏洞,我礼貌性地意见她们抛弃当前的APP架构,从头研发一个更好、更安全的程序。

*参考源自:hacknoon,clouds编译,转载请注明来自FreeBuf.COM





上一篇:Steam 新游举荐 11.15
下一篇:宝藏APP|EMMO
回复

使用道具 举报

3126

主题

3万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99108615
发表于 2024-10-10 23:55:25 | 显示全部楼层
回顾历史,我们感慨万千;放眼未来,我们信心百倍。
回复

使用道具 举报

3048

主题

3万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99109040
发表于 2024-10-12 07:22:24 | 显示全部楼层
感谢你的精彩评论,为我的思绪打开了新的窗口。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-23 10:33 , Processed in 0.152527 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.