当爬虫工程师遇到CTF丨B站1024安全攻防题解

WriteUp 3年前 (2021) admin
1,157 0 0


当爬虫工程师遇到CTF丨B站1024安全攻防题解

点击上方「蓝字」关注我们

当爬虫工程师遇到CTF丨B站1024安全攻防题解


当爬虫工程师遇到CTF丨B站1024安全攻防题解

最近看到哔哩哔哩上线了一个 1024 程序员节的活动,其中有一个技术对抗赛,对抗赛又分为算法与安全答题和安全攻防挑战赛,其中安全攻防挑战赛里面有 7 个题,其中有 APP 逆向和解密的题目,作为爬虫工程师,逆向分析的技能也是必须要有的,于是 K 哥就以爬虫工程师的角度,尝试做了一下其中逆向相关的两个题,发现逆向不是很难,分享一下思路给大家。

(以爬虫工程师的角度分析安全攻防的题,网安大佬勿喷!最新请关注K哥CSDN)


1024 程序员节活动地址:https://www.bilibili.com/blackboard/20211024.html

安全攻防挑战赛地址:https://security.bilibili.com/sec1024/

当爬虫工程师遇到CTF丨B站1024安全攻防题解

第一题:加密解密

第一题就给了一串密文,什么提示也没有,作为爬虫工程师,K 哥熟练的打开了 F12,翻了翻源码,这里是一个 form 表单,method="post",下面还有一个 id 为 success 的 div 标签,于是初步怀疑是不是把密文解密后发送个 POST 请求,然后 flag 就会显示在这个 id 为 success 的 div 标签下呢?有了想法,K 哥就熟练的翻起了 JS 代码,因为我们爬虫遇到最多的就是 JS 加密嘛,然后发现就加载了 jQuery 和一个 common.js 文件,无论是搜索标签还是怎样,都没有什么有用的信息。


当爬虫工程师遇到CTF丨B站1024安全攻防题解


既然不存在 JS 加密,那应该就是硬解密文了,观察这是两段 48 位的密文,也有可能是一段 96 位的密文,而且没有 == 之类的特殊符号,那么就不可能是最简单的 MD5,不过 K 哥还是试了试,将其拆成 6 个 16 位、3 个 32 位等组合,发现都不是 MD5,于是又尝试了多种加密算法,一段作为 KEY,一段作为密文,或者整段组合成密文,SHA、HMAC、RC4 等算法都不行,再仔细观察网页,K 哥怀疑这个 happy_1024_2233 是不是也是加密的一部分呢?会不会是盐值(IV 值,也叫偏移量)?会不会它才是 KEY?结果多种尝试,最终才得出结论:

  • 加密方式:AES 加密
  • 加密模式:ECB
  • Key:happy_1024_2233
  • 96 位密文:e9ca6f21583a1533d3ff4fd47ddc463c6a1c7d2cf084d3640408abca7deabb96a58f50471171b60e02b1a8dbd32db156
  • 输出方式:Hex(十六进制)

解密结果(flag):a1cd5f84-27966146-3776f301-64031bb9

有关各种加密算法原理与实现可以查看 K 哥往期的文章:【爬虫知识】爬虫常见加密解密算法

当爬虫工程师遇到CTF丨B站1024安全攻防题解

第五题:APP 逆向

第五题是一个安卓逆向题(PS:第五题和第六题是一样的,但flag不一样),如图所示:

当爬虫工程师遇到CTF丨B站1024安全攻防题解

扔到模拟器看看,大概是输入账号密码,错误的话提示“还差一点点~~”,正确的话应该就能拿到 flag 了。

当爬虫工程师遇到CTF丨B站1024安全攻防题解

直接把 apk 扔到 JADX 里看看,没有混淆,代码一目了然,尤其这个 Encrypt 最为显眼:

当爬虫工程师遇到CTF丨B站1024安全攻防题解


当爬虫工程师遇到CTF丨B站1024安全攻防题解


分析代码:MainActivity.java 里,输入账号密码赋值给 obj 和 obj2,再依次调用 Encrypt.java 里的方法进行按位异或 3 的运算和 base64 编码,然后使用 Arrays.equals 方法将处理后的账号密码与正确的账号密码进行对比,正确就输出 bilibili- ( ゜- ゜)つロ 乾杯~,不是很复杂,可以使用 Java 复现,也可以使用 Python 逆向倒推正确的账号密码,使用 Python 复现的时候要注意,给出的正确账号密码是 Java 的两个字节数组,在 Python 中是没有字节数组这个概念的,Python 和 Java 字节的取值范围也不同,Python3 是 0~256,Java 是 -127~128,所以在转换的时候注意需要移动 256 位,Python 推导完整代码如下:

import base64

byte_arr1 = [7810673497912265518971651177810678109781229955891098561]
byte_arr2 = [898766108791099011078106651177910974109781226512079508961]

byte_arr1_ = bytes(b % 256 for b in byte_arr1)
byte_arr2_ = bytes(b % 256 for b in byte_arr2)

bs64_arr1 = base64.b64decode(byte_arr1_)
bs64_arr2 = base64.b64decode(byte_arr2_)

username = password = ""

for i in range(len(bs64_arr1)):
    username += chr(bs64_arr1[i] ^ 3)

for i in range(len(bs64_arr2)):
    password += chr(bs64_arr2[i] ^ 3)

print("username: ", username)
print("password: ", password)
print("flag: ", username + "-" + password)

输出:

username:  516834cc-50e448af
password:  bcf9ed53-9ae4328e
flag:  516834cc-50e448af-bcf9ed53-9ae4328e

在模拟器 APP 中输入账号密码测试成功:

当爬虫工程师遇到CTF丨B站1024安全攻防题解

总结

这两道题比较简单,只不过没有提示,像第一题就需要熟练掌握各种加密算法才能很快推断出加密方式,否则只能一个一个去试了,剩下的题就需要一定的网络安全知识了,反正 K 哥只会这两道逆向题,有兴趣的大佬们可以去试试剩下的题目。

(PS:第二题的 flag 是 36c7a7b4-cda04af0-8db0368d-b5166480,就在 home.vue 页面的注释里哦!)


当爬虫工程师遇到CTF丨B站1024安全攻防题解


当爬虫工程师遇到CTF丨B站1024安全攻防题解

点个在看你最好看


当爬虫工程师遇到CTF丨B站1024安全攻防题解

原文始发于微信公众号(K哥爬虫):当爬虫工程师遇到CTF丨B站1024安全攻防题解

版权声明:admin 发表于 2021年10月23日 上午10:03。
转载请注明:当爬虫工程师遇到CTF丨B站1024安全攻防题解 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...