记录一道完全超出我能力的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的更多相关文章

  1. 利用简易爬虫完成一道基础CTF题

    利用简易爬虫完成一道基础CTF题 声明:本文主要写给新手,侧重于表现使用爬虫爬取页面并提交数据的大致过程,所以没有对一些东西解释的很详细,比如表单,post,get方法,感兴趣的可以私信或评论给我.如 ...

  2. 记录一道有意思的js题目

    偶然机会,在codewars上面开始做题,遇到一道有意思的题目,记录一下: 题目是这样的: In this kata, you will write a function that returns t ...

  3. 一道内部ctf文件包含题

    拿到题目 在burp里看下 拿到源码 很明显是一道文件包含题目,包含cookie里的值,于是构造Cookie:language=chinese试试   文件变成中文的了,说明中文语言进行了包含并替换 ...

  4. DP 优化方法大杂烩 & 做题记录 I.

    标 * 的是推荐阅读的部分 / 做的题目. 1. 动态 DP(DDP)算法简介 动态动态规划. 以 P4719 为例讲一讲 ddp: 1.1. 树剖解法 如果没有修改操作,那么可以设计出 DP 方案 ...

  5. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  6. AtCoder刷题记录

    构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...

  7. $NOIp$做题记录

    虽然去年做了挺多了也写了篇一句话题解了但一年过去也忘得差不多了$kk$ 所以重新来整理下$kk$ $2018(4/6$ [X]积木大赛 大概讲下$O(n)$的数学方法. 我是从分治类比来的$QwQ$. ...

  8. 蓝色的成长记录——追逐DBA(8):为了夺回SP报告,回顾oracle的STATSPACK实验

    ***********************************************声明*************************************************** ...

  9. Linux(2)---记录一次线上服务 CPU 100%的排查过程

    Linux(2)---记录一次线上服务 CPU 100%的排查过程 当时产生CPU飙升接近100%的原因是因为项目中的websocket时时断开又重连导致CPU飙升接近100% .如何排查的呢 是通过 ...

随机推荐

  1. 分享一款免费的工控组态软件(PCHMI)

    PCHMI严格的讲它并不是一款组态软件,也不是一款SCADA软件,而是一个基于.NET构架的DLL文件,开发者可以使用微软的Visual Studio将PCHMI.DLL加载到工具箱里面进行二次开发. ...

  2. 61 C项目------家庭收支软件

    1,目标: ①模拟实现一个基于文本界面的<家庭收支软件> ②涉及知识点 局部变量和基本数据类型 循环语句 分支语句 简单的屏幕输出格式控制 2,需求说明: ①模拟实现基于文本界面的< ...

  3. 最近学习总结 Nodejs express 获取url参数,post参数的三种方式

    express获取参数有三种方法:官网实例: Checks route params (req.params), ex: /user/:id Checks query string params (r ...

  4. NO14 快照-克隆-必须掌握的Linux目录结构

    壹  VMware克隆,快照讲解及相应问题讲解: ·快照:比喻:假设把人生作一个快照.1岁10岁20岁6无限还原到前一个设置的节点. ·克隆学习一般用链接克隆,不另外占用磁盘,但是依赖本体虚拟机.完整 ...

  5. 蓝桥杯-机器繁殖 第6届C语言C组决赛第4题

    题目叙述: 标题:机器人繁殖 X星系的机器人可以自动复制自己.它们用1年的时间可以复制出2个自己,然后就失去复制能力.每年X星系都会选出1个新出生的机器人发往太空.也就是说,如果X星系原有机器人5个, ...

  6. swift中数据之间的转换

    1.swift 开发 - NSDictionary与NSData互转.Dictionary与Data互转 https://blog.csdn.net/SuperMageHuang/article/de ...

  7. Java 统计整数二进制中1的个数

    package cookie; public class CountBinary_1 { public static void main(String[] args) { System.out.pri ...

  8. HDU 4901 多校4 经典计数DP

    RT 最近不想写博客,累积了一周多的题目,今天趁着周日放假,全部补上吧 dp[i][j]表示前i个数,操作后的值为j的总个数 注意取或不取,有种完全背包的意味.因为数字小于1024,所以异或的结果也绝 ...

  9. 干货分享:想要写好Proposal,这四个问题必须解决

    当大家确定了毕业论文选题之后,下一步就是着手写开题报告,也就是proposal.开题报告或者说是研究计划要回答四个问题:为什么这个问题重要,为什么这个问题很难解决,为什么现在要考虑解决这个问题,为什么 ...

  10. Java交换数据为何不起作用原因分析

    一.概述 目前各类语言中向函数传递参数的类型分为三种: 按值传递 按引用传递 按指针传递 其中按值传递表示方法(函数)接收的是调用者提供的变量的拷贝,不改变参数的值:按引用传递表示方法(函数)接收的调 ...