2130 字
11 分钟
CTF浅尝
2017-12-18

签到题#

  • 打开题目,只有key在哪里?几个字,打开开发者工具,直接找到 flag
<body>
  <a style="display:none">nctf{flag_admiaanaaaaaaaaaaa}</a>key在哪里?
</body>
  • 第二个签到题,尝试输入口令,失败,打开控制台,发现输入框限制输入长度,直接编辑 html 删去限制,再次输入口令,得到 flag

签到2

<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' | md5sum
0e830400451993494058024219903391

这题不是 WEB#

  • 答案又是啥。。答案应该藏在附图中,保存图片,尝试用解压工具打开,失败。拖入 WinHex 中,在文件尾部找到 flag

这题不是WEB

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 intact
  • 进入题目后提示please login first!,根据题目提示,查找页面 cookies
  • 看到一个Login的 cookies ,使用工具将值修改为 1,刷新,得到 flag

Py 交易#

  • 题目给了一个 .pyc 文件,使用工具(如 uncompyle2)反编译得到如下代码
#!/usr/bin/env python
# encoding: utf-8
import 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-8
import 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

参考文献#

CTF浅尝
https://www.waterwater.moe/posts/2017/2017-12-18_ctf浅试/
作者
whitewater
发布于
2017-12-18
许可协议
CC BY-NC-SA 4.0