有点意外的lab
获得的hint竟然只有三个词:
find a way
(我们在此只证明存在性,其余留给读者作为习题)
总结一下,本次lab7考察:
学会用Burp Suite(Proxy/Repeater/Intercept)
复习lab6的知识(???)
以及通过神秘数字猜测助教的意图
需要你find a way to log in
怎么说呢,反正你log in就会得到神秘数字:
哇我真是苦思冥想了好久
然后逆向一下,发现服务器发回来的Message会在APK里被解密
好的写个smali解密一下(调用原本APK的decode方法):
得到登陆的hint,有点东西
成功登陆之后呢,会进入一个Guest页面,获得助教无情的233嘲笑
此时就需要admin登陆了
先用和之前一样的方法解密一下233的来源:
看下源码,我们要做的就是在HTTP的response把is_admin改成1
再看下加解密方法,是一个对称加密,可以直接用提供的encode进行加密(部分符号需要手动修改),再用burp的intercept截获response,改完再传回去
按上图的格式,改完用smali加密:
new-instance v0, Lorg/json/JSONObject;
invoke-direct {v0}, Lorg/json/JSONObject;-><init>()V
const-string v1, "username"
const-string v2, "admin"
invoke-virtual {v0, v1, v2},
Lorg/json/JSONObject;->put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
const-string v1, "id"
const-wide v2, XXXX
invoke-virtual {v0, v1, v2, v3}, Lorg/json/JSONObject;->put(Ljava/lang/String;J)Lorg/json/JSONObject;
const-string v1, "is_admin"
const/16 v2, 1
invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;I)Lorg/json/JSONObject;
const-string v1, "result"
const/16 v2, 1
invoke-virtual {v0, v1, v2}, Lorg/json/JSONObject;->put(Ljava/lang/String;I)Lorg/json/JSONObject;
invoke-virtual {v0}, Lorg/json/JSONObject;->toString()Ljava/lang/String;
move-result-object v0
const-string v1, key//源码里有secret key
invoke-static {v0, v1}, Lcom/pore/sniffing/utils/AesUtil;->encrypt(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
move-result-object v1
实在是妙啊,轻轻按一下小button
发现还是不能拿到secret
原来在你按button的一瞬间,传出去的is_real_admin是0
所以无法得到secret的response
其实思路是一样的,按照这个格式改一下smali,is_real_admin改1
再smali加密,获得按button的request再把它改掉(手动狗头)
然后得到有secret的response:
传回去就可以拿到secret~
你以为这就做完了吗hhh
写一个Burp插件,自动实现上面的步骤
此处非常感谢这位大佬:
https://www.freebuf.com/articles/terminal/106673.html
不参考框架我也不知道自己在干什么
第一步先打开extender把包包给下载下来(save interface files)
获得包包之后就可以用Java快乐的实现接口了
此处选择实现IBurpExtender, IHttpListener两个接口就可以了
一个是必须的,一个是为了实现我们的功能
public class BurpExtender implements IBurpExtender, IHttpListener {
private IExtensionHelpers helpers;
@Override
public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
helpers = callbacks.getHelpers();
callbacks.registerHttpListener(this);
}
第一个功能就是log in的时候修改收到的response,使得APK拿到的报文是admin成功登陆
非常暴力,直接替换即可
@Override
public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {
if (!messageIsRequest) {
IResponseInfo analyzedResponse = helpers.analyzeResponse(messageInfo.getResponse());
List<String> header = analyzedResponse.getHeaders();
short statusCode = analyzedResponse.getStatusCode();
int bodyOffset = analyzedResponse.getBodyOffset();
if (statusCode == 200) {
try {
String response = new String(messageInfo.getResponse());
String body = response.substring(bodyOffset);
body = body.replace("原来收到的报文", "替换并加密后的报文");
byte[] bodybyte = body.getBytes();
messageInfo.setResponse(helpers.buildHttpMessage(header, bodybyte));
} catch (Exception e) {
e.printStackTrace();
}
}
哦对的很坑的是虽然是对称加密,但是有几个符号被改了,要自己还原
第二个功能是按下admin button后会自动toast你的secret
一样的啦,只不过是改request,逻辑和上面一样~
最后IDEA导出JAR包
https://www.cnblogs.com/ffaiss/p/10908483.html
第一次导出时候说java版本太高了,需要手动改,不然不能运行……(应该是我的Burp破解版版本有些低)
添加到Burp的extender,运行即可
想要debug发现太困难…还好没什么问题