[CTF] SamsClass靶场-Obfuscation0
题目地址:
https://attack.samsclass.info/ob/ob0.htm
题目翻译
挑战:代码混淆 0
下方登录页面并未采用 HTTPS 加密传输,但它会对账号密码做混淆加密处理,因此你无法在抓包工具中直接读取明文账号密码。
你的任务:逆向破解这套混淆加密逻辑。
理清加密原理后,分析提供的 pcap 抓包文件,找出真实正确的账号密码,完成登录。
你可以独立解题;如果需要解题提示,往下翻阅。
JavaScript 混淆逆向入门教程
-
在登录框输入测试账号:用户名
admin,密码password,用 Wireshark 抓下 HTTP POST 请求数据包。 -
抓包底部会出现分行文本数据,包含两个传参字段:
xi=benjoxp=qbttxpse
想要弄懂加密逻辑,查看网页的 HTML 源代码即可。
登录表单说明
页面登录表单中:账号输入框字段名为id,密码输入框字段名为pw。
点击登录按钮时,表单提交事件onsubmit会执行一段名为obfuscate()的 JavaScript 混淆加密函数。
最重要的一点就是分析pcap文件
So to deobfuscate the credentials, open the pcap file and move each character one letter backwards in the alphabet to find the correct credentials.
When you get it right, you'll be able to log in and see this page:
正文
这道题考的就是简单的逆向分析,前端代码没有进行任何混淆,加密也能随意复现,在安全的角度考虑,此题可以有多种通过方式。
随意输入账号密码抓包

返回的响应是访问被拒绝,通过题目意思可知正确的账号密码放在客户端

找到登录按钮事件去全局搜索


obfuscate函数收集的是scramble函数处理之后的值,这说明浏览器最终提交了 4 个字段,混淆后的用户名,混淆后的密码,原始用户名被清空,原始密码被清空。如此可证明有用的便是混淆后的用户名,混淆后的密码,接下来分析混淆加密函数scramble
【----帮助网安学习,以下所有学习资料免费领!加vx:YJ-2021-1,备注 “博客园” 获取!】
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC漏洞分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)


scramble函数的意义就是输入一个字符串,把其中每个字符的 ASCII/Unicode 编码加 1,得到新字符串。后续解密可以通过加密反推解密
// 定义混淆加密函数scramble,接收字符串参数text(原始账号/密码)
function scramble(text)
{
// 初始化空字符串output,用来存放加密完成后的结果
var output = "";
// for循环:x作为索引,从0开始,循环到字符串最后一位(小于字符串总长度)
for(x=0; x<text.length; x++)
{
// 分步拆解:
// text.charCodeAt(x):取出当前下标x字符对应的ASCII码
// + 1:ASCII码数值加1,字符向后偏移一位(凯撒密码偏移1)
// String.fromCharCode():把计算后的ASCII数字转回对应字符
// += 拼接到输出字符串末尾
output += String.fromCharCode(text.charCodeAt(x) + 1);
}
// 循环结束,返回全部字符移位后的密文字符串
return output;
}
发包逻辑,加密混淆都分析完了,接下来就是分析pcap文件
certutil -encodehex ob0.pcap -
输入长度 = 751
输出长度 = 3477
CertUtil: -encodehex 命令成功完成。
查看十六进制,xi=Tuvefou&xp=Tfdsfu&id=&pw=

第一种方式:通过加密函数写反推
已知源码规则:
明文字符 + 1 = 混淆字符
那么:
混淆字符 - 1 = 明文字符
所以:
Tuvefou -> Student
Tfdsfu -> Secret
py代码:
def descramble(text):
return ''.join(chr(ord(c) - 1) for c in text)
print(descramble("Tuvefou"))
print(descramble("Tfdsfu"))
得到账号是Student,密码是Secret

第二种方法便是通过js去hook 不做
hook代码:
obfuscate = function () {
document.form.xi.value = "Tuvefou";
document.form.xp.value = "Tfdsfu";
document.form.id.value = "";
document.form.pw.value = "";
return true;
}

通过

更多网安技能的在线实操练习,请点击这里>>

浙公网安备 33010602011771号