Contents
  1. 1. 上午场
    1. 1.1. Misc-pingping
    2. 1.2. Misc-out.jpg
    3. 1.3. Crypto-RSA
  2. 2. 正式比赛
    1. 2.1. Web-只有你能看到的注入
      1. 2.1.1. sqlmap
      2. 2.1.2. 手工注入
    2. 2.2. Web-WEBX
    3. 2.3. Misc-瞅啥
    4. 2.4. Misc-misc1
    5. 2.5. Crypto-easy_rsa
    6. 2.6. Reverse-easy_re

上午比赛的时候,平台被ddos攻击,导致上午比赛推迟到了下午,但是上午的时候也下载下来了几道题,做了出来,但是下午的时候直接换题了,Writeup整理的时候我把上午的题目也整理了进去。

上午场

Misc-pingping

用wireshark打开,根据题目,我们需要追踪ping,也就是icmp包

1569067733587

在过滤器中直接输入icmp,可以看到info中的ttl时间不一,刚开始以为flag字符串就存在于其中,后来发现这是一个zip压缩包的数据,flag.txt在压缩包中。

用tshark提取出icmp包

1
tshark -r flag2.pcapng -Y "icmp" > icmp.txt

然后余下的操作用python脚本来完成(此处有一个坑点就是,ttl=0时,需要将其转换成00,因为在十六进制中0要单独占一个字节)

1
2
3
4
5
6
7
8
9
10
11
12
13
#coding=utf-8
f = open("icmp.txt").readlines()
z = open("zip.zip","wb")
flag = "".encode()
for c in f:
ttl = c.rindex("=")
flag_char = chr(int(c[ttl+1:].replace("\n","")))
if flag_char == '0':
flag_char = '00'
flag += flag_char

z.write(flag)
z.close()

完成后打开压缩包即可看到flag

1569068145289

Misc-out.jpg

使用binwalk查看文件

1569068807374

发现图片里隐藏了另外一张图片

这里-e参数并不能提取,不清楚原因,使用dd命令提取

1569068882181

提取后可以正常打开文件

1569068920551

使用Stegsolve.jar打开图片

1569068982493

发现二维码,扫码出来社会主义核心价值观编码

1
诚信自由法治爱国爱国诚信民主民主诚信自由平等敬业友善平等友善平等友善法治友善爱国法治爱国爱国诚信民主民主诚信自由平等爱国平等敬业友善自由诚信自由法治爱国爱国友善平等民主诚信自由自由诚信民主友善自由诚信民主诚信富强友善爱国公正友善平等富强敬业民主友善爱国友善敬业友善平等友善公正爱国民主公正公正公正诚信文明公正民主公正法治文明富强公正敬业法治和谐文明富强公正公正公正友善公正公正民主公正法治法治诚信民主和谐敬业和谐自由公正平等和谐文明和谐平等公正和谐公正和谐和谐平等公正文明和谐民主和谐自由和谐爱国和谐平等公正民主和谐文明和谐富强和谐公正和谐法治公正自由和谐和谐公正自由和谐爱国和谐和谐公正文明和谐自由和谐平等公正文明和谐富强和谐自由和谐法治和谐民主公正文明法治诚信和谐

这里使用在线解码https://z.duoluosb.com/

1569069194027

Crypto-RSA

1
2
3
4
n= 544187306850902797629107353619267427694837163600853983242783
e= 39293
c= 439254895818320413408827022398053685867343267971712332011972
m=???

大因数分解n

这里使用在线网站http://factordb.com/进行分解,这里比较奇怪分解出来是三个

1569069500854

修改下脚本,正常是p*q这里用p1 * p2 * p3

1
2
3
4
5
6
7
8
9
10
11
from Crypto.Util.number import *

n= 544187306850902797629107353619267427694837163600853983242783
e= 39293
c= 439254895818320413408827022398053685867343267971712332011972

p = [694415063702720454699679, 67724172605733871, 11571390939636959887]
phi = (p[0] - 1) * (p[1] - 1) * (p[2] - 1)
d = inverse(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))

1569069874719

运行输出flag

正式比赛

Web-只有你能看到的注入

拿了个三血

sqlmap

注册登陆后,用burpsuite抓包,sqlmap1569058030089

注入点就是登陆后的输入框

1569058499875

然后sqlmap一把梭,根据直接load_file()读题目给出的文件。

1569058650785

手工注入

这里是insert into注入

payload

1
flag0'+ascii(substr(load_file('/ctf/flag'),1,1))+'1

会把回显的ascii码显示到页面上

1569065476811

Web-WEBX

这个题目和2019西湖论剑breakout题目相似度非常高,大概思路是通过投稿页面xss,然后通过提交建议页面把包含xss payload的页面提交,提交建议页面同样有一个md5截断验证,绕过后提交xss payload,xss payload中构造admin.php页面注入(感觉这里有脑洞),将注入成功的值访问带到服务器上。

可能就是因为这个注入,比赛期间并没有人做出这道题,而我是卡在了怎么绕xss这里。

题目hint

xss(iframe)+sqli(/admin.php?id=)=flag

比赛运维赛后给出的xss payload(不包含绕过)

1
iframe=document.createElement("iframe");iframe.src="/admin.php?id=-999 union select 1,2,flagg from flag";

包含绕过的xss payload

1
<svg><script>eval&#40String.fromCharCode&#40 97,108,101,114,116,40,57,41,59&#41&#41;</script>

md5截断验证脚本

1
2
3
4
5
6
7
8
9
10
11
import hashlib

def md5(key):
m = hashlib.md5()
m.update(key.encode('utf-8'))
return m.hexdigest()

for i in range(1000000000):
if md5(str(i))[0:6] == 'ba4aee':
print(i)
break

1569066431815

环境在比赛结束后几分钟就关掉了,一点也不友好,导致赛后也没有复现。

Misc-瞅啥

用binwalk提取出压缩包

1569076474882

发现压缩包需要密码

用winhex修改rabbit.png的高度

1569076737486

可以看到密码

1569076797263

该密码就是压缩包的密码

打开docx

ctrl + a 右键菜单->文字 去掉隐藏文字勾选

1569077339151

出现flag

1569077390108

Misc-misc1

用wireshark打开流量包,在过滤器中输入http

1569081225235

发现是盲注数据包

用tshark提取http协议的数据包

1
tshark -r misc.pcapng -Y "http" > http.txt

通过分析流量包可以发现,flag被盲注了出来

将提取出来的数据包文件,写python脚本来分析出盲注数据每一位的正确的ASCII码,并在最后将其转换成字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# coding:utf-8
import re
import urllib

f = open("http.txt","r")
lines = f.readlines()
s = open("c.txt","w")
datas = {}
for line in lines:
if("flag" in line):
t = urllib.parse.unquote(line)
a = re.search(r"limit 0,1\),(.+?),1\)\)=(.+?)#",t)
key = int(a.group(1))
value = int(a.group(2))
datas[key]=value
flag = ""
for value in datas.values():
flag += chr(value)
print(flag)

这里使用字典的方式来判断正确的字符ascii码,每一位的最后一个尝试的就是正确的flag,利用字典key不重复的特性,来达到保留每一位最后一个值的目的

运行脚本,输出flag

1569081454141

Crypto-easy_rsa

1
2
3
n=0xEFF76062D52A7D4927DF587FBBC293CF9A622F56E854055D6A30DCF77C9B7591
e=0x10001
c=0x6cd55a2bbb49dfd2831e34b76cb5bdfad34418a4be96180b618581e9b6319f86

进行十六进制转十进制后,用在线大数分解即可,和上午思路一样,只不过多了一个十六进制转十进制

十六进制转十进制

1
2
3
>>> n = "0xEFF76062D52A7D4927DF587FBBC293CF9A622F56E854055D6A30DCF77C9B7591"
>>> int(n,16)
108539847268573990275234024354672437246525085076605516960320005722741589898641L

用在线网站进行大数分解

1569136757380

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from Crypto.Util.number import *

n = "0xEFF76062D52A7D4927DF587FBBC293CF9A622F56E854055D6A30DCF77C9B7591"
e = "0x10001"
c = "0x6cd55a2bbb49dfd2831e34b76cb5bdfad34418a4be96180b618581e9b6319f86"

n = int(n,16)
e = int(e,16)
c = int(c,16)

p = [325593180411801742356727264127253758939,333360321402603178263879595968004169219]

phi = (p[0] - 1) * (p[1] - 1)
d = inverse(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))

运行结果

1569136879541

Reverse-easy_re

感谢崂山校区的小伙伴的帮助,让我这个re小萌新也有机会可以复现题目

首先用ida打开re1.exe

View->Open subviews->Strings搜索所有字符串(或者按Shift+F12)

1569139451057

发现这里有个假的flag,不必理会

1569139669317

双击right,按x交叉引用,找到程序中的位置

1569139719838

找到其位置,按F5查看生成的伪代码

1569139780803

发现其对存储用户输入数据的数组byte_40336C进行了+1与6异或的操作,并且最后和unk_402124中的数据进行比较

1569139924480

根据其写出对应代码

1
2
3
4
5
6
7
8
9
10
#coding=utf-8
flag_list = [0x78,0x49,0x72,0x43,0x6A,0x7E,0x3C,0x72,0x7C,0x32,0x74,0x57,0x73,0x76,0x33,0x50,0x74,0x49,0x7F,0x7A,0x6E,0x64,0x6B,0x61]
flag_list.reverse()
flag = ""

for c in flag_list:
c = (c ^ 6) -1
flag += chr(c)

print(flag)

成功输出flag

1569141879728

Contents
  1. 1. 上午场
    1. 1.1. Misc-pingping
    2. 1.2. Misc-out.jpg
    3. 1.3. Crypto-RSA
  2. 2. 正式比赛
    1. 2.1. Web-只有你能看到的注入
      1. 2.1.1. sqlmap
      2. 2.1.2. 手工注入
    2. 2.2. Web-WEBX
    3. 2.3. Misc-瞅啥
    4. 2.4. Misc-misc1
    5. 2.5. Crypto-easy_rsa
    6. 2.6. Reverse-easy_re