WEEK1
第一题 CyberChef’s Secret
来签到吧!下面这个就是flag,不过它看起来好像怪怪的:-)
M5YHEUTEKFBW6YJWKZGU44CXIEYUWMLSNJLTOZCXIJTWCZD2IZRVG4TJPBSGGWBWHFMXQTDFJNXDQTA=
看提示选择喂给CyberChef 但是不知道用什么解码 试试用Magic
如图 获得flag


第二题 机密图片
小宝最近学会了隐写术,并且在图片中藏了一些秘密,你能发现他的秘密吗?

格式为secret.png导入刚装的stegsolve
Analyse→Data Extract→勾选RGB三个通道的第0位平面LSB(RGB都勾选0)
点Save Bin可以获得右边这一列的BIN 注意这时候不要添加后缀名
常见文件头
PNG 文件: ‰PNG (可能看起来乱码,但能看到 PNG)
JPEG 文件: ÿØÿá
ZIP/PK 文件: PK
文本: 直接显示文字
第三题 流量!鲨鱼!
就决定是你了!WireShark!
研究一下wireshark怎么用


打开附件直接进入wireshark 看到大量的流量包

使用过滤式 http && http.response.code == 200
有大量目录扫描爆破流量 于是意味着攻击者可能在疯狂尝试访问各种路径
大多数请求会返回404Not Found 403Fobidden等错误码 只有少量返回200OK

接下来只剩下13个有效包 逐个查看详细内容即可
这时我们终于得到一堆base64形式 解码两次获得flag
第四题 压缩包们
常见的压缩包又能玩出什么花样呢?

喂给010
在右侧的ASCII码里面看到PK字样 注意到这是zip文件头标志
还看到flag.zip字样 注意到这个flag可能隐藏在压缩包内
更进一步 还看到flag.txt后续还有flag.z 说明 ZIP 中有一个文件叫flag.txt,但可能被重命名或损坏。
把文件头的00 00 00 00改成50 4B 03 04即可 保存为zip格式
使用archPR进行zip密码爆破 密码232311 压缩得到flag

第五题 空白格
“我们之间留了太多空白格”
打开txt以后发现啥也没有,都是鼠标光标全选能看到很多。有点困惑。搜一下,于是知道了这是一种很奇妙的编程语言叫whitespace,它的特点是只将空格、制表符和回车/换行视为有效字符,隐蔽性很强。后来我搜到了这个网页可以用来转译
https://vii5ard.github.io/whitespace/ctrl+A再run 获得flag

第六题 隐秘的眼睛
有一双隐秘的眼睛在盯着你…
隐秘的眼睛…想到silenteye于是喂进去就好了获得flag
(第一次我安装成了阉割版 连jpeg都没有qaq)

Q:为什么不能用bmp格式 这俩怎么区分。有损和无损的区别出在隐写题目里面不是更应该用无损么。困惑。难道是因为日常生活用jpeg格式多?也可能这题文件体积到上限了?
WEEK2
第一题 新建Word文档
你喜欢用Word文档吗?
获得一个word文档 打开啥也没有。。想到week1的空白格 但是注意到word文档是一给只读文件 无法ctrl+a ctrl+c于是想到隐藏文字
先是在首页选择文件→选项→格式标记里看到隐藏文字


获得这段生僻字

https://my.chenyu.me/buddha/用这个佛曰加密即可
第二题 永不消逝的电波
或许有节奏的声音中传递着一些信息;flag请按照flag{}的格式进行提交,涉及字母均为小写
试试用刚装的Audacity 看到这个波形图 推测是摩斯密码
看这个波形图的细是.粗是-于是可以得到
..-./.-../.-/–./-/…././-…/./…/-/-.-./-/..-././.-./../…/-.–/—/..-


按照格式就是flag{thebestctferisyou}
第三题 1-序章
你作为一名出色的网络安全专家,正在调查一起网络入侵事件。你获得了一份SQL盲注请求的日志文件,里面记录了攻击者的活动。你的任务是分析这些日志,找出攻击者成功获取到的数据。

给了我一个access.log文件 里面记录了黑客攻击服务器的请求 使用了SQL注入 我们要从日志里找出他偷了什么信息 也就是说 日志里藏着一串被黑客猜出来的字符 我要把它还原出来
172.17.0.1 - - [20/Aug/2023:00:08:21 +0800] “GET /app/action/edit_sell.php?pid%5B0%5D=-1%20or%20if(ascii(substr((select%20group_concat(username,password)%20from%20user),1,1))=40,sleep(1),1)–+&totalPrice=0 HTTP/1.1” 500 353 “-“ “python-requests/2.28.2”
172.17.0.1 - -这是客户端ip和用户信息 通常是Docker容器内部的地址
[20/Aug/2023:00:08:21 +0800] 这是请求发生的时间+0800是东八区
GET 指的是HTTP请求方法 表示获取资源
/app/action/edit_sell.php是请求的页面路径 是一个php脚本
?pid%5B0%5D=这是查询参数 ?后面是传给php的参数
%5B和%5D是URL编码 表示[ 和 ]所以说pid%5B0%5D解码以后就是pid[0]
也就是说原始参数是pid[0]=…表示pid是一个数组 pid[0]是第一个元素
-1表示是一个永远为假的条件 这样后面的or才能生效
or是sql的操作符 意思是如果前面为假 就看后面
select%20group_concat(username,password)%20from%20user表示从user表中查出所有用户的username和password 并用逗号拼成一个字符串
比如说 如果数据库有 username:admin,password:123 username:guest,password:456
那么结果就是admin,123,guest,456
substr(…,1,1)就是说 取上面字符串的第一个字符 长度是1 比如说admin,123…的第一个字符是a
基于时间延迟的sql注入(sleep(1))
每次只测试一个字符的ASCII值 当某个位置的ASCII匹配成功 服务器就会延时响应也就是sleep1秒 表示该字符正确 成功后进入下一位爆破
GET /app/action/edit_sell.php?pid[0]=-1 or if(ascii(substr((select group_concat(username,password) from user),7,1))=110,sleep(1),1)–+&totalPrice=0 HTTP/1.1” 500 353 “-“ “python-requests/2.28.2”
说明第7个字符的ASCII码是110 对应’n’
if(ascii(substr((select … ),N,1))=X,sleep(1),1)
N是当前正在爆破的字符位置 X是猜测的ASCII码 只有正确才会触发sleep(1) 所以我们要找每一个位置N上 导致sleep的那个X
注意看状态码是500 说明无论成功与否都会返回错误 所以我们不能靠状态码判断 真实的判断依据是攻击者只会对成功的尝试继续下一位
就是说 一旦某一位猜对 就会立刻开始猜下一位
写一个python3脚本 直接看的官方WP 因为不会写脚本 吃完晚饭学一下
import re
import urllib.parse
f = open(‘access.log’,’r’)
lines = f.readlines()
datas = []
for line in lines:
t = urllib.parse.unquote(line)
datas.append(t)
flag_ascii = {}
for data in datas:
matchObj = re.search(r’user),(.?),1))=(.?),sleep’, data)
if matchObj:
key = int(matchObj.group(1))
value = int(matchObj.group(2))
flag_ascii[key] = value
flag = ‘’
for value in flag_ascii.values():
flag += chr(value)
print(flag)
即可得到flag
you_w4nt_s3cretflag{just_w4rm_up_s0_you_n3ed_h4rder_6026cd32}
https://www.cnblogs.com/0yst3r-2046/p/12322110.html
学习了一下本文
第四题 base!
https://cloud.tencent.com/developer/article/2160364
base! 贝斯!贝斯也有自己的秘密
打开附件看到这些
https://files.buuoj.cn/files/5a083e553a38e414b81786363ee8e25e/base.txt
写python3脚本
import base64
b64chars = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 +/‘
with open(‘base.txt’, ‘rb’) as f:
bin_str = ‘’
for line in f.readlines():
stegb64 = ‘’.join(line.decode(‘utf-8’).split())
decoded = base64.b64decode(stegb64)
rowb64 = base64.b64encode(decoded).decode(‘utf-8’).replace(‘\n’, ‘’)
steg_char = stegb64.replace(‘=’, ‘’)[-1]
row_char = rowb64.replace(‘=’, ‘’)[-1]
offset = abs(b64chars.index(steg_char) - b64chars.index(row_char))
equalnum = stegb64.count(‘=’)
if equalnum:
bin_str += bin(offset)[2:].zfill(equalnum * 2)
result = ‘’
for i in range(0, len(bin_str), 8):
if i + 8 <= len(bin_str):
byte = bin_str[i:i + 8]
result += chr(int(byte, 2))
print(result)
得到隐写内容:
iDMb6ZMnTFMtFuouYZHwPTYAoWjC7Hjca8

base64知识梳理
详细梳理一下关于Base64编码的知识
为什么叫Base64呢
64指的是一共使用了64个字符 A-Z a-z 0-9 + /
来表示一些二进制数据 每3字节原始数据就编码为4个Base64字符
最后一位往往是= 这一位被称为填充位
填充位前的最后一个字符往往非常重要
如果原始数据不是3的倍数 Base64就会用=来填充
余2个就写1个= 余1个就写2个=
编码过程中 结尾的无效比特位可以被修改而不影响解码效果 也就是说你去掉一个=也根本无所谓嗯嗯 于是这些无效比特位就成为了隐藏信息的载体
echo”HelloWorld”
得到原封不动的HelloWorld
echo”HelloWorld” base64
得到SGVsbG9Xb3JsZAo=
原理是什么呢
1.转换编码对象为二进制

2.以6为单位分组

位数不够就补0
3.转换成十进制

4.映射

编码之后必须是4的倍数 如果不是就用等号补齐
解码相反即可
下面这些原理也相同

第五题 WebShell的利用
我靶机打不开
第六题Jvav
给阿姨来一杯卡布奇诺,多看看题目名哦,秘密就隐藏在图片中
我死活安装不出java盲水印的工具
阳光开朗大男孩

emoji加密(flag)

社会主义核心价值观加密(secret)