虽然只是一道入门题,但是对于我一个web萌新来说也学到了很多姿势
先看代码
<?php
error_reporting(0);
include_once "flag.php";
show_source(__FILE__);
session_start();
if(!isset($_POST['key'])) {
die("not allow!");
}
if($_POST['key'] != $_SESSION['key']) {
die("Wrong key!");
}
if(isset($_GET['username']) && isset($_GET['password'])) {
if($_GET['username'] == $_GET['password']) {
die("Your password can not be your username!");
}
if(md5($_GET['username']) === md5($_GET['password'])) {
echo $flag;
}
}
根据代码逻辑,要先绕过session验证,再绕过MD5的全等于===
绕过session验证参考这篇文章,只需要用post传入空的key,即key=
再看绕过md5,由于是===
,所以无法用0e
开头的字符串绕过,但是可以用数组绕过,参考文章
构造方法如上图,得到flag:ACTF{8rh8ReeRE9rh3s8134koURHW32}
下载附件得到一张图片,010editor查看可以发现文件尾后有数据,binwalk分离,可以得到一个压缩包,解压可以得到另一张wanan.png和舔狗日记.crypto,分别看这两个文件
两张一模一样的图片,很容易想到由两张图构成的隐写方式:盲水印
GitHub上常用的解盲水印的脚本有两个,而需要注意的是此题用到的是python3的脚本,即bwmforpy3.py
,如果用另一个脚本,在此题无法解出盲水印(压缩包里的图片命名为wanan2.png)
python bwmforpy3.py decode wanan.png wanan2.png out.png
查看得到的out.png,即可得到一串字符串:ARJXU4MjE0
.crypto后缀为Encrypto这个工具加密得到的文件格式,加密的密钥就是盲水印得到的ARJXU4MjE0
,解密可以得到一个文件夹,里面有两个docx文件以及一个bmp文件,第一个docx文档可以正常打开,但里面并没有隐写的痕迹,所以我们尝试binwalk分离文件,可以从中得到remember.zip,其中内容
那天,你告诉了我你最重要的8个数字,我记住了
当然此处也涉及到一个考点:docx文档的另一种形式为zip
所以我们也可以直接将舔狗日记1.docx的后缀改为zip,就可以直接看到其中隐藏的压缩包
压缩包提示文档密码为8位数字,所以现在需要爆破office,除hashcat外也有其他的一些工具可以用来爆破office,比如AOPR,但是效率很低,8位密码要爆破很久很久,所以此处采用hashcat爆破
关于hashcat的使用可参考:https://www.freebuf.com/sectool/164507.html
爆破office密码需要先用到office2john.py来获取文档的hash值,可在此处下载得到,然后运行
python office2john.py 2.docx > hash
打开得到的hash,删除开头冒号及之前的部分,得到
$office$*2007*20*128*16*e8acb3ffadb859fcd9c0f38906f5a9b5*dc0a3deef00efb5fcdc115daa4784734*f97102e56fc53cf48fedba9a927e149d711928b2
可以看到是2007版本的office,再找到对应版本的hash类型
Office97-03(MD5+RC4,oldoffice$0,oldoffice$1): -m 9700
Office97-03($0/$1, MD5 + RC4, collider #1): -m 9710
Office97-03($0/$1, MD5 + RC4, collider #2): -m 9720
Office97-03($3/$4, SHA1 + RC4): -m 9800
Office97-03($3, SHA1 + RC4, collider #1): -m 9810
Office97-03($3, SHA1 + RC4, collider #2): -m 9820
Office2007: -m 9400
Office2010: -m 9500
Office2013: -m 9600
对应-m 9400
,直接用hashcat爆破即可(hash是刚导出的hash值文件名)
hashcat64.exe -m 9400 hash -a 3 ?d?d?d?d?d?d?d?d -w 3 -O
在出现选项时什么都不要选,稍微等一下,就会出现爆破的结果
得到结果:19990821
打开第二个docx文件,显示隐藏文字后将全部文字颜色换成深色,即可看到隐藏的文字
最后还剩一张bmp图片没有用到,图片考点为bmp隐写,需要用到工具wbStego4.3open,其中的密码就是在docx文档中隐写的内容,输入密码后,将解得的内容另存为txt文件,即可看到最后的flag
ACTF{Tr1edT0f0rgeTy0uBuTf1nallyTurnsT0f0rg1ve}
下载附件是一张图片,010editor打开可知文件尾有多余数据,直接binwalk分离,由于分离得到的压缩包是伪加密,所以在binwalk时可以直接将压缩包内部的东西也分离出来,打开里面的txt,得到一个网盘链接
链接:https://pan.baidu.com/s/1CiNtkUut4HR99QUpLQbPLg
提取码:fykq
下载得到一个视频,根据原题所给hint
http://virtualdub2.com/
http://www.compression.ru/video/stego_video/src/msu_stegovideo.zip
可以知道是一种视频隐写形式,在之前的HGAME2020中也出过这种题,而且用到的工具也一样
在上面两个网址分别下载得到VirtualDub2和隐写插件MSU StegoVideo,将vdf后缀文件放在plugins32文件夹中,再运行32位的程序即可
打开程序,File → Open video file,打开刚刚下载的视频,然后Video → Filters → Add,加载隐写插件后点OK
弹出MSU StegoVideo插件窗口,选择Extract file from video,可以看到需要密码,所以接下来需要寻找密码
在最开始给的图片备注中可以看到这样一条信息
Guess what? You_can_really_dance
Guess
提示为outguess隐写,后面给的You_can_really_dance
则为outguess的密钥
outguess -k You_can_really_dance -r Lets_dance.jpg out.txt
打开得到的out.txt,得到视频隐写的密码:8687125
输入密码,选择分离文件的路径,之后一直OK出来,将进度条拉到视频最开始处,然后Go → Preview filtered(或者直接按回车),等视频放完一遍,再看输出的文件里,就有隐写的内容了
Good job. You deserve it.
5peWV4aWFuZ3Fpd3VtYXd
用下面的字符串解压加密的压缩包,打开就是flag
ACTF{oMaewa_Mou_sh1nde1ru}
附件给了一个加密的zip包和一个gif,查看gif,发现只有两种颜色而且交替出现,将每一帧都分离出来
convert 520.gif out.png
两种颜色且总数为40,考虑转为01序列,粉色为1,红色为0,数量不多手撕一下即可
0110111101101000001000010100101101001111
转换成ASCII码,得到oh!KO
再看压缩包,hint中提示伪加密,用工具ZipCenOp解开得到forever.wav,结合刚才得到但还没用上的oh!KO
推测音频是一种需要密钥的加密隐写,想到steghide
steghide extract -sf forever.wav -p 'oh!KO'
打开得到的flag.txt就有flag
ACTF{55520_st3GhiDe_lOove}
搭建docker环境可参考:http://www.ga1axy.top/index.php/archives/38/
启动docker服务
service docker start
将docker镜像pull下来
docker pull registry.cn-hangzhou.aliyuncs.com/in1t/whalefall:misc
查看镜像信息
docker images
得到IMAGE ID:1e89e3b91125
开一个容器运行该镜像(启动交互式终端)
docker run -it 1e89e3b91125
执行env
指令查看该镜像的环境变量,发现hint1
通过执行此命令也可以判断出该镜像是linux环境
根据提示,使用history
指令查看命令的历史执行记录
将里面的echo
命令复制出来并执行,得到hint2
利用find
命令找到whalefall.tar.gz的位置
移动到改目录,将此文件解压
得到一个需要密码的压缩包和另一个文件,根据其文件名得知另一个hint的位置
利用find
命令结合xargs
命令,在/usr目录搜索hint3
注:
find
命令本身不支持使用管道|
来传递参数,所以需要结合xargs
,可参考这里
查找得到文件名/usr/lib/engines-1.1/controls,利用cat
命令输出内容,得到Ook编码的字符串,在线网站解码,得到压缩包密码
Zip Password: Dockerhub_1s_a_n1ce_place
查看本机容器id
docker ps
其中的CONTAINER ID即为对应本机的容器id,得知id后即可将whalefall.zip拷贝出来
docker cp [容器id] [docker中文件路径] [拷贝目的路径]
# 以我自己为例
docker cp 1fbf4a6d8396:/usr/share/apk/keys/x86_64/whalefall.zip /root/下载
解压后010editor打开文件,发现文件尾有多余数据
-.. --- -.-. -.- ...-- .-. .... ..- -... .---- ... .... .- .-. -.. - ----- .-.. ----- --. .---- -. ..... ..... .....
解morse码,即可得到flag
结束后利用rmi
命令删除镜像,再停止docker服务即可
docker rmi 1e89e3b91125 # rmi后接镜像的IMAGE ID
service docker stop
ACTF{DOCK3RHUB1SHARDT0L0G1N555}