2016 西普杯京津冀信息安全挑战赛 WriteUp
🏛️ 组织架构
主办:北京市政府
协调指导:北京市委网信办
组织实施:北京市公安局
承办:北京西普阳光教育科技股份有限公司(西普教育)
协办:中国信息产业商会信息安全产业分会人才建设委员会
📅 赛事规模与流程
赛事历时两个月,规模盛大:
参赛规模:超过 400 支队伍,逾 1400 人次报名
赛程安排:分为分站赛和总决赛两个阶段
分站赛:在天津、河北、北京三地及线上举行,共 4 场选拔赛
总决赛:12 支队伍晋级,于 2016 年 4 月 29 日在北京展览馆举行
🏆 奖项设置
分站赛奖励:前三名分获 5000 元、3000 元、1000 元奖金
总决赛奖励:前三名分获 30000 元、20000 元、10000 元奖金及奖杯
分站赛前三名
| 赛区 | 第一名 | 第二名 | 第三名 |
|---|---|---|---|
| 天津赛区 | IOT战队 (天津理工大学) | zero storm1战队 (天津理工大学) | JLC战队 (中国民航大学) |
| 河北赛区 | 牧星湖战队 (河北科技大学) | 求精战队 (河北师范大学) | 河北翎贺战队 (石家庄工程职业学院) |
总决赛最终排名
| 最终排名 | 队伍名称 | 所属单位 |
|---|---|---|
| 冠军 | 北京邮电大学队 | 北京邮电大学 |
| 亚军 | 牧星湖队 | 河北科技大学 |
| 季军 | 北京航空航天大学队 | 北京航空航天大学 |
| 第6名 | IOT战队 | 天津理工大学 |
Crypto
crypto01(Base64)

直接解码拿到 flag{2dfe75d9a94a67ce1f95493a83ebbb2b}
Reverse
re1(签到)

通关前调用了 sub_401000 函数,进去看看

这里在跟用户的输入作比较,所以 flag 是 flag{ssapdrow}

re2(MFC 逆向 + Base64)

打开程序是经典的 MFC 逆向

IDA 导入,打开字符串窗口发现大量的 Base64 编码

在 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= 处可以看到它被一个函数引用,这个函数地址附近是 sub_4011D0
同时看到注释 *char Str

进入 sub_4011D0 函数反编译代码,这个函数是一个 Base64 解码器,作用是将一个 Base64 编码的字符串解码为原始二进制数据

鼠标放在 sub_4011D0 函数的第一行指令,看谁调用了它

按 X 键,有 6 个调用点地址

先看第一个地址,双击进入,解码字符串 aW9zc67oktsiyu7 得到 密码不能为空
1 | import base64 |

进入第二个地址,将 aW9zc67oktsiyu7 字符串解密得到 密码长度不符合

进入第三个地址,解密得到 HOWMP半块西瓜皮hehe,疑似是密码
在程序中输入拿到 flag

Misc
misc02(签到)


直接扫码得到 429CTF{5cf8ca0d2dd785dd}
Forensics
misc03(日志分析 + SQL 布尔盲注)

一开始日志里出现了 /phpoa/install/install.php 的安装流程,随后进入登录页并登录成功,访问了 /phpoa/admin.php 和 /phpoa/desktop.php。这说明前面是搭建/进入后台环境
后面有典型后台上传行为:POST /phpoa/upload/index.php?userid=1,随后把 shell.php 作为附件保存到 ../data/uploadfile/1/1460085550.php;后续又出现多次类似上传和下载访问
真正关键点在 19/Apr/2016 的请求,攻击者访问 /code/web/admin/content/feedback/export.php 并通过参数 met_parameter_1=met_admin_table where substr(admin_pass,1,1)=0x... 做布尔盲注
规律非常明显:
同一位置枚举字符时,大部分响应长度是 2651
命中正确字符时响应长度变成 2790。比如
admin_pass第 1 位只有0x35返回 2790,也就是字符5;第 2 位只有0x66返回 2790,也就是字符f
用这个规律还原出 admin_pass = 5fec4ba8376f207d1ff2f0cac0882b01
然后继续看 admin_name 字段,攻击者同样在枚举
1 | substr(admin_name,位置,1)=0x字符 |
admin_name 的第 1 位命中 0x34,第 2 位命中 0x32,也就是开头 42;接着第 3 位命中 0x39,第 4 位命中 0x63,第 5 位命中 0x74,第 6 位命中 0x66,组合为 429ctf
所以完整还原结果为
1 | 429ctf{0b078376e1ad7152c252605f6ea3a651} |