「声明:本博客中涉及到的相关漏洞均为官方已经公开并修复的漏洞,涉及到的安全技术也仅用于企业安全建设和安全对抗研究。本文仅限业内技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。」
面向全球的入门级CSAW CTF 2013比赛已经落幕。
中秋时跟Tony组队玩了一下。感觉好多reverse
和exploit
的题目,苦手啊。
这里对其中Web类的300分题目作一个小结。
题目内容是一个apk应用,运行如下图:
很简单的一个应用,貌似只有一个简单的登录功能。通过查看资源文件,发现了url地址:https://webchal.isis.poly.edu/csaw.php
目测就是向这个地址提交登录数据。使用dex2jar反编译该apk,代码没有经过混淆,但是登录的关键类AuthRequest的主要方法无法编译出源码。
于是打开burpsuit,配置模拟器代理,想抓包分析一下登录过程。但是发现apk好像会检测ssl证书的真实性,在模拟器上安装了burpsuit的证书仍然不行,会返回Unknown Error
的错误信息。查找反编译出来的源码,发现apk中的有个方法会检查SSL证书:
使用apktool反汇编apk,得到smali源码,找到该方法对应的smali代码:
与java代码比对,smali代码中,分别将传入的数组中的每个元素与对应的局部变量比较,如果不相等就跳转到:cond_0代码段。
:cond_0代码段就是将v2(也就是false)作为boolean型赋值给v0,然后跳转到:goto_0代码段return v0。如果全部相等则不会跳转直接顺序执行直到:goto_0代码段return v0(此时为true)。这里将:cond_0代码段改为也返回true。即绕过apk中ssl证书的验证。
使用apktool重新构建,autosign给apk签名。使用篡改过的apk登录,可以正常抓包。但是服务端返回Client integrity fault。貌似会检测apk的完整性。查找源代码,登录代码如下:
登录时除了传送email和password外,还会提交应用的signature值。
写了一个小应用来获取apk的签名值,关键代码如下:
得到了原版apk的签名,抓包时提交正确的signature值,可以跟服务器正常交互。
登录数据包为:
identity=base64(用户名)&secret=base64(密码)=&integrityid=APK签名值
服务器返回信息为:
经过多次尝试,最终发现登录时增加一个role字段,值为base64(‘admin’)时,可以直接通过验证。
服务器返回信息为
Key: Yo dawg I heard you leik to derp so i put a herp in your derp so you could herpderp while you derpderp
References
- http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html