De1CTF 2020 Web

赛时菜如狗,赛后复现喽


De1CTF 2020 Web1. check in反斜杠转义换行绕过限制利用cgi-script2. calc老实构造读flag大写绕过new读flag%00T(读flag绕过openrasp命令执行3. mixtureWeb部分4. Animal Crossing强制类型转换触发valueOf用throw传递变量读取admin页面图片5. mc_logclient非预期预期解利用icmp外带数据6. Hard_Pentest_17. Hard_Pentest_2More. 参考链接


1. check in

一个php文件上传的题

不允许上传.ph*的后缀文件,且文件内容也有限制,如下

不过服务器是Apache/2.4.6 (CentOS) PHP/5.4.16,且可以上传.htaccess

传统的方法是通过向.htaccess中写

这样apache会将以.ccc结尾的文件用处理php文件的方法去处理程序,可把*.ccc解析成*.php执行

php被过滤了,这里有2种方法

反斜杠转义换行绕过限制

用反斜杠\转义换行符,绕过php限制

再写入1.ccc:<?=eval($_GET[c]);

利用cgi-script

也看到flag显示了cgi,预期解应该是用cgi来做

如下是运行执行cgi的.htaccess

1.ccc:

PS. 改burp里脚本的内容时,注意换行符是%0a而非%0d%0a,不然会爆500错误,本题上传的文件自带执行权限,不然也会500

 

 

2. calc

SpEL注入,有少许过滤,目标是要获取/flag文件

进过一系列手工测试,发现过滤了如下关键字

禁用了 getClass(): Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类

但在SpEL中,''.getClass()等价于''.class,可以得到class java.lang.String

forName(): 查找并加载指定的类,会执行该类的静态代码段,并返回与该类相关的Class对象

于是通过''.class.forName('java.lan'+'g.Ru'+'ntime') 就可以装载一个java.lang.Runtime

getDeclaredMethods(): 可以拿到反射类中的公共方法、私有方法、保护方法、默认访问,但不获得继承的方法

getMethods():获取的是所有public方法,包括:类自身声明的public方法、父类中的public方法、实现的接口方法。

于是通过

可以得到

然后是invoke():用来在运行时动态地调用某个实例的方法

尝试构造了:

发现存在openrasp限制了命令执行

这里稍微列几种解法

老实构造读flag
大写绕过new读flag
%00T(读flag

在SpEL中,使用T()运算符会调用类作用域的方法和常量

绕过openrasp命令执行

可以根据多种姿势openrasp命令执行绕过这篇文章的方法二,使用反射的方式,修改openraspHookHandler类的变量enableHook设置为false。而这个变量是全局的开关。所以我们只需重新关闭这个开关就可以使rasp失效。实现全局绕过。

还看到了另一种绕过方法,详情见bypass openrasp SpEL RCE 的过程及思考

 

 

3. mixture

比赛的时候被题目描述绕坑里去了..

Web部分

打开题目只有一个登录框,当用户名为admin时会检查,用户不为admin可以随便登录

登录后访问admin.php提示当前用户不为admin,那就是要搞到admin的密码

只有一个member.php有正常回显

且这个页面的注释里有<!--orderby-->

尝试orderby=1,orderby=2...都是一样的回显

但是当输入SQL一些关键字时,会提示No~~hacker!

orderby=limit x时会有不同的返回

于是猜测语句是

mysql的limit注入

获取admin密码脚本如下:

 

得到18a960a3a0b3554b314ebe77fe545c85,md5解密得到goodlucktoyou

可登陆admin,可以看到一个phpinfo页面和一个任意文件读取功能

phpinfo中有着这么个奇怪的东西

且通过读取/var/www/html/select.php源码得到

可以看到读取文件的功能是Minclude(urldecode($search));

通过phpinfo知道php.ini路径,读取得到Minclude.so的路径

Pwn部分还是见官方wp

 

 

4. Animal Crossing

Hint: What is the admin doing? 管理员在做什么?

一道xss题,CSP很简单,为default-src 'self' 'unsafe-inline' 'unsafe-eval';object-src 'none'; 允许selfscript执行

这道题共有5个参数可控,头像那里其实还有一个图片上传点(仅支持上传png后缀)

但在js中,这些参数都被单引号或双引号包裹,其中4个参数里的单引号或双引号通通都被替换成了&#39;&quot;,导致没法绕

只能看到最后一个参数:data,双引号并未替换成&quot;

但是直接输入单引号时又会提示Hacker! Illegal data detected! Stop it!

同时,有且只有data参数过滤了一些xss的关键词如eval,alert,windowtry

当用//注释掉后面的单引号时,返回正常

接下来就是构造xss,这里出题人其实是做了两层waf防御

看到2种方法构造(绕过waf)

由于可以直接拼接,但是所有声明/赋值语句都被ban,一些xss常用的关键字也禁用了等

需要用一些字符串替换(base64,字符串连接等)来执行xss

 

强制类型转换触发valueOf

javascript 中几乎所有类型都具有toStringvalueOf属性。几乎所有的类型对象比如Number,String,Boolean,Array,Function,Object,Date,RegExp的原型对象上都有各自的toStringvalueOf方法的实现,故它们的实例化的对象自然就继承了这两个方法。

valueOf()toString()Js强制类型转换中起了很大作用

可以自定义一个参数的valueOf值,让其在强制类型转换时执行valueOf时即可执行js

测试一下触发valueOf()toSting()的情况

发现b直接与数字或者字符串一起操作时,valueOf()触发,而当b被当做数组时,触发了toString(),这题过滤了String,不太好构造toString()的触发

但比较容易构造valueOf,构造如下内容:

这个new是必须加的..不然过不了waf

 

用throw传递变量

原理是

于是payload为:

如果不加%0a(或者%0d)会提示Hacker! Illegal data detected! Stop it!

YWxlcnQoMSk=alert(1)的base64编码

 

读取admin页面图片

直接打admincookie,发现只获取到了前半部分的flag

读取admin所在的页面发现存在大量/island/目录下的图片内容,且直接访问不到

根据出题人赛后提供的3种解法

尝试下比赛时没人用的解法1

由于CSP的原因,不能直接引入站外的js脚本,但是存在一个上传点,虽然规定了后缀必须是png,但可以将js文件改后缀上传,并利用js读取再eval执行

首先尝试上传js.png (html2canvas.js改名后)

然后让admin执行

尝试提交构造的payload

这里发现用throw传递变量这种方法可以执行,但是用constructor.constructor 执行会报错: Uncaught (in promise) ReferenceError: html2canvas is not defined

constructor.constructor构造时不能直接贴在在那个js源码后,原因见下图的demo

constructor.constructor执行的js的globalObject而非Window,所以直接test()是无法找到定义的

payload需要添加到html2canvas.js文件开头如下位置(***YOUR_PAYLOAD***)

发送给admin后获得截图上传的位置

获取到的是base64格式的图片,弄到本地,用<img src="xxxx"/>来查看得到后半部分flag

 

 

5. mc_logclient

Hint 1: Here's your useful tool to write log file without joining in the game. nc SERVER-IP 6000 env: python3.8

Hint 2: common network protocol

题目提供了源码,如下

根据源码,看到有render_template_string(html),且提供了python版本,是一道很明确的模板注入题,只不过没有回显

题目还提供了一个端口直接写log

本地其实这个payload很容易就打通了

 

非预期

由于黑名单不完善出现非预期,可以通过 \x 或者 request.args 进行绕过,无需调用/write

\x65 -> e绕过system 删了空格,可以用tab

发现curlwget均无果,尝试

本地测试成功,讲道理远程应该有请求才对...比赛的时候卡死在这了

比赛后想通了,这里传入的是域名,而域名是需要解析的...题目只有icmp协议可以传出

 

还可用 request.args 绕过限制:

 

预期解

python 3.7 以后,有一个新的函数 sys.breakpointhook() 可以通过它起一个调试器,进行任意代码执行。

pdb: 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。

payload为:

然后访问 /read?work={work}&filename={uuid} 触发 ssti

大概有30秒的时间,去调用 /writew = os.fdopen(session['w'], 'w')以及w.write(text)pdb 去写命令,原因是session['w']定义如下:

后端信息大概是这样

 

利用icmp外带数据

下面的命令在自己的服务器上运行可以查看134.175.230.10与本服务器通信的详细信息

用nc写入后/read成功后收到请求:

 

xxd可将内容转换成16进制,while循环读取赋值给data,进行ping-p指定填充ping数据包的十六进制内容

上面这个我本地可以打,但是远程打不了

只好利用python获取数据再通过ping返回

利用

请求时修改GET的参数c,如下是读取ls /的部分结果(ping一次能带出的数据有限,所以获取flag时也得分多次)

最终获取flag(还需要执行/readflag并计算一个数学题,直接可用eval来计算):

 

 

6. Hard_Pentest_1

打开题目,源码如下

大致看出是要写个不含数字字母的webshell,但后缀不能是php

一开始尝试上传phtml,php3这种都访问不到,一顿fuzz

发现phP可以访问到且解析,所以是台windows(还可以1.php::$DATA

然后是构造webshell

列下一些可用的上的trick

其实这题还允许?>,虽然不允许;还是可以通过分段构造

如果不允许?>;的话,还可以利用三元运算符?:来传参赋值

构造个简单的webshell

上传x1.phP

再写个eval()后门,然后用蚁剑连接

也无发现。

于是msf制作反弹shell win.exe:

服务器msf监听:

后门下载执行win.exe后可以收到请求

然后进入session 1命令:sessions 1

得到meterpretershell

执行net use发现

发现域控共享文件夹Hint有一个压缩包flag1_and_flag2hint.zip

通过蚁剑下载下来,但解压需要密码

net users /domain发现存在HintZip_Pass用户

于是用msfpost/windows/gather/credentials/gpp来获取

密码为zL1PpP@sSwO3d

解压得到flag1和后续hint

 

 

7. Hard_Pentest_2

复现的太慢..复现到这的时候这题挂了,可惜了

只能根据writeup学习学习思路,主要步骤如下:

  1. 需要用户De1ta才能得到flag2,对De1ta用户进行信息收集,发现web用户对De1ta用户的servicePrincipalName属性具有写权限
  2. 根据Hint2猜测应该是通过web用户给De1ta设置spn然后通过Kerberoastinghashcat去暴力破解De1ta用户的密码
  3. 根据Hint3:注意De1ta在域上的拓展权限,然后对域的ACL进行信息收集
  4. 通过基于资源的约束委派对当前主机进行本地提权
  5. 利用Dcshadow修改用户的属性
  6. 使用用户De1ta进行推送,触发域控间数据的同步
  7. 读取flag2

 

 

 

 

More. 参考链接

De1CTF2020 Web 官方 writeup

De1CTF2020 wrtieup by ChaMd5

De1CTF Hard_Pentest1&2 Writeup By W&M

多种姿势openrasp命令执行绕过

bypass openrasp SpEL RCE 的过程及思考

De1CTF 2020 mc_logclient复盘

深入理解JavaScript中的toString,valueOf属性

2020 De1CTF & Animal Crossing

python3 sys.breakpointhook

利用msf在windows下反弹shell

Kerberoasting:一种Kerberos活动目录攻击方法