记录一道神仙CTF-wtf.sh-150
记录一道完全超出我能力的CTF神仙题(不愧是世界级比赛的真题orz),此题我仅解出了第一部分的flag,第二部分则参考了WP。不得不说这种题目解出来还是很有自豪感的嘛~ 直接看题!
0x01 第一部分flag
打开题目:
随便点击几个浏览可以看出题目环境是一个论坛,我们先注册个账号:
通过一些简单的测试像是sql注入,目录爆破,源码泄露这种常见套路走不通了hhhhhh,最后不断尝试:在展示文章的页面 post.wtf 下发现路径穿越漏洞(如果应用程序使用用户可控制的数据,以危险的方式访问位于应用服务器或其它后端文件系统的文件或目录,就会出现路径遍历。攻击者可以将路径遍历序列放入文件名内,向上回溯,从而访问服务器上的任何文件)
,可以获得网站源码:
寻找flag关键字:
代码格式化:
发现如下部分:
可以看到只要登录 admin 账号就可以获得 flag1:
在泄露的源码里得知有 users 目录,继续尝试路径穿越:
可以看到里面有我们的账号信息和admin的信息,看到这些字符串如果经验丰富的话可以猜测是cookie或者是代表我们身份的令牌:老套路抓包试试:
可以看到我们用户名下面的第二行就是代表我们身份的令牌,admin的令牌也知道了,可以进行 cookie 欺骗啦HHH~,抓包修改!
拿到第一个flag!
0x02:第二个flag
get_flag1和get_flag2是Set-UID(SUID)二进制文件,我们想要提升到flag1和flag2用户的权限以读取这些文本文件并不容易,因此,我们需要代码执行
因为 wtf 不是常规的网页文件,故寻找解析 wtf 文件的代码:
格式化代码:
max_page_include_depth= page_include_depth= function include_page { # include_page pathname local pathname=$ local cmd= [[ ${pathname(-)} = '.wtf' ]]; local can_execute=$; page_include_depth=$(($page_include_depth+)) if [[ $page_include_depth -lt $max_page_include_depth ]] then local line; while read -r line; do # check if we're in a script line or not ($ at the beginning implies script line) # also, our extension needs to be .wtf [[ $ = ${line01} && ${can_execute} = ]]; is_script=$; # execute the line. if [[ $is_script = ]] then cmd+=$'n'${line#$}; else if [[ -n $cmd ]] then eval $cmd log Error during execution of ${cmd}; cmd= fi echo $line fi done ${pathname} else echo pMax include depth exceeded!
pfi }
通过这段代码我们发现服务器能够解析并执行 wtf 文件,如果还能够上传 wtf 文件并执行的话,就可以达到控制服务器的目的。
于是继续审计代码,发现如下代码给了这个机会:
function reply { local post_id=$; local username=$; local text=$; local hashed=$(hash_username "${username}"); curr_id=$(for d in posts/${post_id}/*; do basename $d; done | sort -n | tail -n 1); next_reply_id=$(awk '{print $1+1}' <<< "${curr_id}"); next_file=(posts/${post_id}/${next_reply_id}); echo "${username}" > "${next_file}"; echo "RE: $(nth_line 2 < "posts/${post_id}/1")" >> "${next_file}"; echo "${text}" >> "${next_file}"; # add post this is in reply to to posts cache echo "${post_id}/${next_reply_id}" >> "users_lookup/${hashed}/posts"; }
这是评论功能的后台代码,这部分也是存在路径穿越的。
这行代码把用户名写在了评论文件的内容中:echo "${username}" > "${next_file}";
通过上面的分析:如果用户名是一段可执行代码,而且写入的文件是 wtf 格式的,那么这个文件就能够执行我们想要的代码。 (而且wtf.sh只运行文件扩展名为.wtf的脚本和前缀为'$'的行)
先普通地评论一下,知晓评论发送的数据包的结构,在普通评论的基础上,进行路径穿越,上传后门sh.wtf
:
%09
是水平制表符,必须添加,不然后台会把我们的后门当做目录去解析。
访问后门,发现成功写入:
为了写入恶意代码,我们得让用户名里携带代码,故注册这样一个用户:${find,/,-iname,get_flag2} 写入后门:
访问后门,执行代码,寻找get_flag2
(因为之前获得 flag1 的时候是 get_flag1
):
获得 flag2 所在的路径。
继续注册新用户:$/usr/bin/get_flag2 写入后门:
访问后门,获得 flag2:
0x03总结
第一部分的话仔细研究还是能做的:路径穿越和cookie欺骗还是很常规的CTF赛题
此题的第二部分对于我目前是超出了能力范围,所以我也是借鉴了网上得WP(https://blog.cindemor.com/post/ctf-fairy-1.html)
代码审计能力还是要加强啊orz,还有一些小细节如“%09
是水平制表符,必须添加,不然后台会把我们的后门当做目录去解析。”当时也没有想到T_T。
这种国际赛题虽然难,还是要做的嘛~~迎难而上才能突破自己鸭!
今天刚报名了下学期的省赛 接下来还是要继续去各大平台刷题总结 。加油啦!!
萌新的第一篇博客 请各位大佬多多指教啦!
记录一道神仙CTF-wtf.sh-150的更多相关文章
- 利用简易爬虫完成一道基础CTF题
利用简易爬虫完成一道基础CTF题 声明:本文主要写给新手,侧重于表现使用爬虫爬取页面并提交数据的大致过程,所以没有对一些东西解释的很详细,比如表单,post,get方法,感兴趣的可以私信或评论给我.如 ...
- 记录一道有意思的js题目
偶然机会,在codewars上面开始做题,遇到一道有意思的题目,记录一下: 题目是这样的: In this kata, you will write a function that returns t ...
- 一道内部ctf文件包含题
拿到题目 在burp里看下 拿到源码 很明显是一道文件包含题目,包含cookie里的值,于是构造Cookie:language=chinese试试 文件变成中文的了,说明中文语言进行了包含并替换 ...
- DP 优化方法大杂烩 & 做题记录 I.
标 * 的是推荐阅读的部分 / 做的题目. 1. 动态 DP(DDP)算法简介 动态动态规划. 以 P4719 为例讲一讲 ddp: 1.1. 树剖解法 如果没有修改操作,那么可以设计出 DP 方案 ...
- ZJOI2019一轮停课刷题记录
Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...
- AtCoder刷题记录
构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...
- $NOIp$做题记录
虽然去年做了挺多了也写了篇一句话题解了但一年过去也忘得差不多了$kk$ 所以重新来整理下$kk$ $2018(4/6$ [X]积木大赛 大概讲下$O(n)$的数学方法. 我是从分治类比来的$QwQ$. ...
- 蓝色的成长记录——追逐DBA(8):为了夺回SP报告,回顾oracle的STATSPACK实验
***********************************************声明*************************************************** ...
- Linux(2)---记录一次线上服务 CPU 100%的排查过程
Linux(2)---记录一次线上服务 CPU 100%的排查过程 当时产生CPU飙升接近100%的原因是因为项目中的websocket时时断开又重连导致CPU飙升接近100% .如何排查的呢 是通过 ...
随机推荐
- SPFA和堆优化的Dijk
朴素dijkstra时间复杂度$O(n^{2})$,通过使用堆来优化松弛过程可以使时间复杂度降到O((m+n)logn):dijkstra不能用于有负权边的情况,此时应使用SPFA,两者写法相似. 朴 ...
- 解决phpinfo 和php -v版本不一致的问题
解决方法:参考博文 http://blog.csdn.net/laomengnevergiveup/article/details/52104862
- ①java环境变量配置以及简单的dos框操作
DOS:英文全称Disk Operation System,即磁盘操作系统,是个人电脑上使用的一种操作系统,并曾是世界上最广泛使用的操作系统. JDK: 英文全称Java Development Ki ...
- Python中pandas透视表pivot_table功能详解(非常简单易懂)
一文看懂pandas的透视表pivot_table 一.概述 1.1 什么是透视表? 透视表是一种可以对数据动态排布并且分类汇总的表格格式.或许大多数人都在Excel使用过数据透视表,也体会到它的强大 ...
- P1429 平面最近点对(加强版)(分治)
P1429 平面最近点对(加强版) 主要思路: 分治,将点按横坐标为第1关键字升序排列,纵坐标为第2关键字升序排列,进入左半边和右半边进行分治. 设d为左右半边的最小点对值.然后以mid这个点为中心, ...
- 【pwnable.kr】 unlink
pwnable.kr 第一阶段的最后一题! 这道题目就是堆溢出的经典利用题目,不过是把堆块的分配与释放操作用C++重新写了一遍,可参考<C和C++安全编码一书>//不是广告 #includ ...
- 二、JavaScript之点击按钮改变HTML样式 (CSS)
一.代码如下 二.点击前 三.点击后 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" c ...
- 十九、SAP查询所有数据库表的所有数据
一.我们打款SAP自带的一个演示数据库SCARR 二.表结构如下 三.代码如下 四.执行结果如下 我们对比一下数据库的内容,很perfect 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微 ...
- jQuery原理系列-css选择器实现
jQuery最强大的功能在于它可以通过css选择器查找元素,它的源码中有一半是sizzle css选择器引擎的代码,在html5规范出来之后,增加了document.querySelector和doc ...
- jqGrid 添加 合计行 footDate
jQuery(table_id).jqGrid({ url : url,//组件创建完成之后请求数据的url datatype : "json",//请求数据返回的类型.可选jso ...