2024 TKKCTF Beginner | WriteUp

学CTF要做到不会的**多搜**,碰到不会的或者没见过的名词和工具,都能在网路上找到详细的解释和教程,不会一个搜一个。多去尝试自己解决遇到的问题,所有的答案都藏在你曾经也许看都不想看的代码、报错和技术文章里,加油 Misc 你好,CTF! flag就在pdf末尾,不解释 阿娜达瓦~ 使用gif逐帧播放可以发现二维码 扫描后即可得到flag 这是什么? 在cyberchef中先解base32再解base64即可 佛说:只能四天🙏 根据提示搜索与佛论禅在线解密工具 但发现无法解密,需要输入一个密码,回到题目描述注意到这一串内容 输入即可解开 引导题 尝试复制后发现需要密码 本题解法不唯一,这里介绍两种。 方法一:搜索在线解锁工具 解锁后即可直接复制被遮盖的内容。放到cyberchef里梭哈base64即可 方法二:如果你是macOS用户,右键搜索即可,不要点拷贝 一样放到base64解码即可 小泽 下载图片后使用010editor或者文本编辑器均可,拉到最下面就能发现flag Up and Down 将文件下载下来后,可以找到在线工具将文件二进制进行反转,下面我演示linux命令的方式进行反转 一行命令即可,本意就是反转文件二进制数据。将输出的图片打开后即可得到flag RFID 比赛原题,直接放网上的wp https://blog.mo60.cn/index.php/archives/2023-fjss.html 乱乱的字符 统计每个字符出现的频率,可以拼出个大概flag。但可以发现有两个字符出现的频率都是7次,也就是A和i。此时回到题目提示 猜测是AsCii这个单词,而且这样排序的话正好两个i的出现频率加起来就是7次,符合条件,因此flag就是 xujc{Ukn0w_AsCii~} void null() {}、Chiikawa https://x.xn–q9jyb4c/p/ctf-record-w0w/ sharkshark 安装wireshark即可打开pcapng格式的流量包,ctrl+f4可以调出搜索框,选择分组字节流+字符串多次 搜索xujc,可以在一堆假flag中找到flag24.txt为trueFlag 好痛 010打开后再中间发现mp3的模板结束了,可以发现后面是zip文件头 手工分离出来,分离时再尾部还可以发现一个key (原本作者是让做题人根据歌名来猜key,被骂了改附件了qwq) 解压压缩包后那首歌是使用MP3Stego来解码因为歌名奇怪,作者建议先改成1.mp3,然后 在cmd使用 Decode -X -P love 1.mp3 就能得到flag ...

October 23, 2024 · 7 min · Red

红包题第四期WP-答案竟在派蒙中

Misc-答案竟在派蒙中 解题过程: FLAG1: 根据题目提示把派蒙拉开,全选后可以看到有白色字符被选中 更改颜色后是一串以等号结尾的编码 解码得到flag FLAG2: 文档的内容可以确定没有挖掘的内容了,接下来对文件本身进行分析 可以用010editor工具进行分析结构 由于docx文件的本质其实是zip压缩文件,但504B0506(zip文件的结束标志)之后依然有数据可以判断文件后方被写入的隐写文件(出题人当时傻逼了忘了是怎么藏的来着,记成是放里面了) kali的binwalk指令也可以得到一样的结果 可以在010中手动分离文件,也可以用foremost分离 (注意这种压缩包套娃的题binwalk -e有几率出现分不出来的情况所以这里用foremost) 分离后的压缩包解压得到小恐龙一只 这里可以用cat指令查看文件(同理010editor或者记事本打开也可以看到信息) 另一个以等号结尾的编码,根据特征判断是base32编码 解码后得到类flag格式的玩意 由于格式相近推测是凯撒移位加密 枚举后得到flag 尾注: 关于base家族的特征和其它编码推荐一篇文章 https://cloud.tencent.com/developer/article/1748394 https://www.bilibili.com/video/BV1GJ411x7h7

September 22, 2024 · 1 min · Red

CISCN 2019华北Day1 web1

一道很适合新手入门完整网站项目漏洞挖掘的题目,网上wp多半只讲了利用链和exp,我会从网站逻辑开始分析并写得尽量详细易懂,同样适合新手入门 复现靶场为nssctf,https://www.nssctf.cn/problem/2 搜题号应该也能搜到 文件获取 拿到页面后是个登录框,先注册一个账号登进去看看 进来后是个文件管理的界面 随便传个文件 这里就会涉及到一个任意文件读取的思路。一般一些制作并不是那么精良的网站都会直接使用文件名匹配的方式去读取文件内容从而达到下载的效果,所以我们点击下载的时候抓个包试一下看能不能通过修改文件名从而把原代码下载下来 成功读取。照着这个方法把几个已知页面的代码都读一遍 网站代码逻辑 因为代码比较多,所以这里我这里先介绍一下网站的主要实现逻辑 我的习惯是从主界面也就是index.php开始看调用,在index.php中可以发现下面这段 进入到class.php,查看一下Filelist类 class FileList { private $files; private $results; private $funcs; public function __construct($path) { $this->files = array(); $this->results = array(); $this->funcs = array(); $filenames = scandir($path); $key = array_search(".", $filenames); unset($filenames[$key]); $key = array_search("..", $filenames); unset($filenames[$key]); foreach ($filenames as $filename) { $file = new File(); $file->open($path . $filename); array_push($this->files, $file); $this->results[$file->name()] = array(); } } public function __call($func, $args) { array_push($this->funcs, $func); foreach ($this->files as $file) { $this->results[$file->name()][$func] = $file->$func(); } } public function __destruct() { $table = '<div id="container" class="container"><div class="table-responsive"><table id="table" class="table table-bordered table-hover sm-font">'; $table .= '<thead><tr>'; foreach ($this->funcs as $func) { $table .= '<th scope="col" class="text-center">' . htmlentities($func) . '</th>'; } $table .= '<th scope="col" class="text-center">Opt</th>'; $table .= '</thead><tbody>'; foreach ($this->results as $filename => $result) { $table .= '<tr>'; foreach ($result as $func => $value) { $table .= '<td class="text-center">' . htmlentities($value) . '</td>'; } $table .= '<td class="text-center" filename="' . htmlentities($filename) . '"><a href="#" class="download">下载</a> / <a href="#" class="delete">删除</a></td>'; $table .= '</tr>'; } echo $table; } } 从构造函数开始,会发现这里传入了一个path形参 ...

June 28, 2024 · 2 min · Red

SECCON Beginners CTF 2024

打seccon的第一年,为了队友的日本旅行梦,跟他们爆了! WEB ssrforlfi 主要代码如下 import os import re import subprocess from flask import Flask, request app = Flask(__name__) @app.route("/") def ssrforlfi(): url = request.args.get("url") if not url: return "Welcome to Website Viewer.<br><code>?url=http://example.com/</code>" # Allow only a-z, ", (, ), ., /, :, ;, <, >, @, | if not re.match('^[a-z"()./:;<>@|]*$', url): return "Invalid URL ;(" # SSRF & LFI protection if url.startswith("http://") or url.startswith("https://"): if "localhost" in url: return "Detected SSRF ;(" elif url.startswith("file://"): path = url[7:] if os.path.exists(path) or ".." in path: return "Detected LFI ;(" else: # Block other schemes return "Invalid Scheme ;(" try: # RCE ? proc = subprocess.run( f"curl '{url}'", capture_output=True, shell=True, text=True, timeout=1, ) except subprocess.TimeoutExpired: return "Timeout ;(" if proc.returncode != 0: return "Error ;(" return proc.stdout if __name__ == "__main__": app.run(debug=True, host="0.0.0.0", port=4989) 其实一开始看到这即过滤localhost又过滤file://的思路很容易被带着跑,就想着要怎么通过域名打ssrf。但是如果仔细看就会发现就算我现在有办法访问到127.0.0.1或者localhost也无济于事,根本不知道下一步要干嘛 ...

June 16, 2024 · 2 min · Red

2024 CISCN WP

simple_php 先看代码 <?php ini_set('open_basedir', '/var/www/html/'); error_reporting(0); if(isset($_POST['cmd'])){ $cmd = escapeshellcmd($_POST['cmd']); if (!preg_match('/ls|dir|nl|nc|cat|tail|more|flag|sh|cut|awk|strings|od|curl|ping|\*|sort|ch|zip|mod|sl|find|sed|cp|mv|ty|grep|fd|df|sudo|more|cc|tac|less|head|\.|{|}|tar|zip|gcc|uniq|vi|vim|file|xxd|base64|date|bash|env|\?|wget|\'|\"|id|whoami/i', $cmd)) { system($cmd); } } show_source(__FILE__); ?> open_basedir限制了访问路径,但是对system等命令执行函数是无效的,因此先不管。 再来看一下escapeshellcmd 简单来说就是会对上述字符进行转义,引号会在成对的时候被ban掉 继续往下看正则,当时队友试出了几个能用的,其中包括ps -e,base32。后面看其他师傅的wp还有rev,paste等文件读取的指令,后面发现还可以用%0a绕过函数过滤,这里也记录学习一下。 不过试来试去都没发现flag,但是在/etc/passwd发现了个mysql 之前西湖论剑的经验让我第一反应是udf提取,但没法执行或者连接mysql,所以只能另寻他法。后面找到了个-e参数能够执行sql指令 结合上面没找到flag文件,因此猜测flag在数据库里。但是-e参数后面跟的内容是要带引号的,所以还是得找到来绕过引号的办法。而且只执行是不行的,还得把内容输出出来,这里就得再套一层echo和反引号,也就是 echo `mysql -uroot -proot -e 'show databases;'`; 想起来php还有个-r参数能不带引号执行指令 直接上 php -r eval($a=1;print_r($a)); 在kali尝试是可以的,这里还得想办法往-r后面塞指令。既然绕过不行,那就编码,第一反应就是当时队友试出的base32,但是没找到php中有对应的函数可以解,于是就想到了16进制,可以把16进制编码后的指令用hex2bin解码,再把解码出来的东西给eval执行,到这步我们的payload就变成了 php -r eval(hex2bin(6563686F20606D7973716C202D75726F6F74202D70726F6F74202D65202773686F77206461746162617365733B27603B)); 执行后出现报错 分析原因是因为把数字开头的16进制当成数字型数据而不是字符串了,所以在最前面随便加个非数字的字符,用substr截断一下就行 php -r eval(hex2bin(substr(_6563686F20606D7973716C202D75726F6F74202D70726F6F74202D65202773686F77206461746162617365733B27603B,1))); 可以读库了,后面就正常查表即可 easy_cms 和网上一些师傅的审计不太一样,我当时写出来是队友找到了这个接口 对于fuzz了半天没试出什么东西的我断定可控接口肯定只有这几个…..于是去搜索有哪些文件调用了这几个接口 在/dayrui/Fcms/Core/Helper.php找到下面这段 明显thumb和text可控,但还是不知道这里的thumb传入进去后在哪处理,后面才在/dayrui/Fcms/Control/Api/Api.php找到下面这段对thumb参数的解析 结合后来队友告诉我发现的dr_catcher_data函数存在curl调用 因此推断这里存在ssrf,去访问题目描述给出的flag.php 这里直接构造payload就是 ?s=api&c=api&m=qrcode&thumb=http://127.0.0.1/flag.php?cmd=ls&text=100 但是这样打过去会发现并没有反应,因为没有回显的地方,因此这里只能用curl请求外带,起一个vps搭一个php服务,分别写1.php和2.php两个文件(记录一下队友教的php一句话简易服务:php -S 0.0.0.0:9999 -t . ) ...

May 28, 2024 · 1 min · Red