热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

wtf.sh150

前言:最近在刷ctf题,在理解了大佬们的wp后自己做完之后,从头到尾把思路过了一遍,做次记录为以后复习和打比赛做准备&#x

前言:

最近在刷ctf题,在理解了大佬们的wp后自己做完之后,从头到尾把思路过了一遍,做次记录为以后复习和打比赛做准备,同时也希望能帮到别人。


0x01

进入网址,发现是一个论坛,有注册,登录和发表的功能,初步猜测应该是可以利用账号进行获取flag,我们先顺着页面向下找一找,看有没有什么提示信息,没有什么发现,然后路径扫描试试,发现有一个post.wtf路径存在路径穿越漏洞,能够获取网站的源码,所以我们试着用这个进行网站源码的获取

进入页面

向下找找看有没有什么有没有有用的东西,一堆源码,太花时间,所以我们直接搜索flag关键词,看有没有

果然有,get_flag1,所以我们把这段源码整理一下,整理如下




$ if contains 'user' ${!URL_PARAMS[@]} && file_exists "users/${URL_PARAMS['user']}"
$ then
$ local username=$(head -n 1 users/${URL_PARAMS['user']});
$ echo "

${username}'s posts:

";
$ echo "
    ";
    $ get_users_posts "${username}" | while read -r post; do
    $ post_slug&#61;$(awk -F/ &#39;{print $2 "#" $3}&#39; <<<"${post}");
    $ echo "
  1. $(nth_line 2 "${post}" | htmlentities)
  2. ";
    $ done
    $ echo "
";
$ if is_logged_in && [[ "${COOKIES[&#39;USERNAME&#39;]}" &#61; &#39;admin&#39; ]] && [[ ${username} &#61; &#39;admin&#39; ]]
$ then
$ get_flag1
$ fi
$ fi

在这段代码中的关键代码是&#xff1a;

if is_logged_in && [[ "${COOKIES[&#39;USERNAME&#39;]}" &#61; &#39;admin&#39; ]] && [[ ${username} &#61; &#39;admin&#39; ]]
$ then
$ get_flag1

这段代码的意思是说&#xff0c;如果我们的登录用户是admin&#xff0c;那么我们就能获得flag1&#xff0c;所以&#xff0c;看来&#xff0c;如果我们想要获得flag1&#xff0c;就必须是admin用户登录&#xff0c;那么如何登录呢&#xff1f;代码中也给了提示&#xff0c;代码检查的是COOKIEs&#xff0c;经过抓包&#xff0c;发现登录用户都会有自己的一个Token&#xff0c;看来我们只需要修改登录用户名和登录的Token即可登录admin用户

那么&#xff0c;我们从哪里获得admin用户的Token呢&#xff1f;我们还是利用路径穿越漏洞&#xff0c;看看有没有保存用户的目录&#xff0c;发现真的有

红色框里的是Token&#xff0c;在这个上面还有一串字符&#xff0c;经过分析是sha1&#xff0c;但是对于我们登录admin用户没有用处&#xff0c;所以我们伪造usernam和Token登录admin&#xff0c;但是这里提醒一下&#xff0c;不仅仅需要修改Token就可以进去&#xff0c;同时还得修改

这里解释一下为什么需要修改这个

这里我们发现每一个用户应该都是有一个文件来存储&#xff0c;所以想要登陆某个用户&#xff0c;也得加上这个&#xff0c;除非你是账号密码登陆

发现flag1&#xff0c;但是这个flag不是完整的&#xff0c;看来我们还得继续寻找第2个flag


0x02

到这里我们想想还有什么我们没有注意到&#xff0c;就是wtf&#xff0c;我们知道wtf不是一般常规的网页文件&#xff0c;所以我们试着寻找解析wtf文件的代码

这段就是解析wtf文件的代码&#xff0c;经过整理如下&#xff1a;

max_page_include_depth&#61;64
page_include_depth&#61;0
function include_page {# include_page pathnamelocal pathname&#61;$1local cmd&#61;[[ ${pathname(-4)} &#61; &#39;.wtf&#39; ]];local can_execute&#61;$;page_include_depth&#61;$(($page_include_depth&#43;1))if [[ $page_include_depth -lt $max_page_include_depth ]]thenlocal line;while read -r line; do# check if we&#39;re in a script line or not ($ at the beginning implies script line)# also, our extension needs to be .wtf[[ $ &#61; ${line01} && ${can_execute} &#61; 0 ]];is_script&#61;$;# execute the line.if [[ $is_script &#61; 0 ]]thencmd&#43;&#61;$&#39;n&#39;${line#$};elseif [[ -n $cmd ]]theneval $cmd log Error during execution of ${cmd};cmd&#61;fiecho $linefidone ${pathname}elseecho pMax include depth exceeded!pfi
}

这段代码是能够解析并执行wtf文件

function reply {local post_id&#61;$1;local username&#61;$2;local text&#61;$3;local hashed&#61;$(hash_username "${username}");curr_id&#61;$(for d in posts/${post_id}/*; do basename $d; done | sort -n | tail -n 1);next_reply_id&#61;$(awk &#39;{print $1&#43;1}&#39; <<<"${curr_id}");next_file&#61;(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 cacheecho "${post_id}/${next_reply_id}" >> "users_lookup/${hashed}/posts";
}

这段代码是能够上传wtf文件并执行&#xff0c;那这样的话我们上传执行命令上去&#xff0c;让服务器执行我们的命令&#xff0c;从而我们能够找到服务器中flag2的位置和内容

到这里为止&#xff0c;我们想起论坛还有一个发表的功能

echo "${username}" > "${next_file}";

这段代码就是把用户名写在了评论文件的内容中&#xff0c;如果用户名是一段可执行代码&#xff0c;并且写入文件的格式是wtf格式的&#xff0c;那么这个文件就可以执行我们的代码了&#xff0c;所以我们需要怎么做呢&#xff1f;


0x03

通过以上分析&#xff0c;我们大致知道我们要做什么了&#xff0c;那接下来就来完成相应过程&#xff0c;首先&#xff0c;我们要写入一个后门&#xff0c;然后我们通过访问后门来得代码返回的结果&#xff0c;那么我们需要先注册一个用户名&#xff0c;而且用户名是可执行代码&#xff0c;然后观察返回结果


一、

上传后门

注册了一个普通用户&#xff0c;然后发表发表评论出上传一个后门&#xff0c;上面加%09的原因是&#xff1a;%09是水平制表符防止后台把我们的后门当做目录去解析&#xff0c;到此&#xff0c;后门上传成功&#xff0c;接下来注册含执行代码的用户


二、

注册用户

${find,/,-iname,get_flag2}

将用户名写入后门中

然后访问后门地址&#xff0c;得到如下回显

说明flag2的位置在这个路径&#xff0c;这里解释一下为什么要注册一个这样的用户&#xff0c;前面我们在得到flag1的时候的格式是get_flag1&#xff0c;所以这里我们注册一个get_flag2的用户&#xff0c;来寻找falg2,


三、

注册用户

$/usr/bin/get_flag2

让后访问后门地址

得到如下结果&#xff1a;

到此得到flag2


0x04


总结&#xff1a;这道题应该是最近做过的最难的了&#xff0c;通过这道题学到了很多姿势。对wtf格式的文件增长了利用姿势&#xff0c;通过用户名来执行代码在之前是真没想过。总之这题不愧为国际赛题


推荐阅读
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 本文介绍了在PostgreSQL中批量导入数据时的优化方法。包括使用unlogged表、删除重建索引、删除重建外键、禁用触发器、使用COPY方法、批量插入等。同时还提到了一些参数优化的注意事项,如设置effective_cache_size、shared_buffer等,并强调了在导入大量数据后使用analyze命令重新收集统计信息的重要性。 ... [详细]
  • FIN7后门工具伪装成白帽工具进行传播
    fin7,后门,工具,伪装,成,白, ... [详细]
  • 【BP靶场portswigger服务端10】XML外部实体注入(XXE注入)9个实验(全)
    前言:介绍:博主:网络安全领域狂热爱好者(承诺在CSDN永久无偿分享文章)。殊荣:CSDN网络安 ... [详细]
  • Java程序员必会的40个Linux命令!
    你知道的越多,不知道的就越多,业余的像一棵小草!你来,我们一起精进!你不来,我和你的竞争对手一起 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • DSP中cmd文件的命令文件组成及其作用
    本文介绍了DSP中cmd文件的命令文件的组成和作用,包括链接器配置文件的存放链接器配置信息、命令文件的组成、MEMORY和SECTIONS两个伪指令的使用、CMD分配ROM和RAM空间的目的以及MEMORY指定芯片的ROM和RAM大小和划分区间的方法。同时强调了根据不同芯片进行修改的必要性,以适应不同芯片的存储用户程序的需求。 ... [详细]
  • 本文探讨了容器技术在安全方面面临的挑战,并提出了相应的解决方案。多租户保护、用户访问控制、中毒的镜像、验证和加密、容器守护以及容器监控都是容器技术中需要关注的安全问题。通过在虚拟机中运行容器、限制特权升级、使用受信任的镜像库、进行验证和加密、限制容器守护进程的访问以及监控容器栈,可以提高容器技术的安全性。未来,随着容器技术的发展,还需解决诸如硬件支持、软件定义基础设施集成等挑战。 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
author-avatar
低碳的S
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有