关于CTF的点点滴滴
常见CTF知识点的总结
0x01 CTF简介
概述
CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。发展至今,已经成为全球范围网络安全圈流行的竞赛形式,2013年全球举办了超过五十场国际性CTF赛事。而DEFCON作为CTF赛制的发源地,DEFCON CTF也成为了目前全球最高技术水平和影响力的CTF竞赛,类似于CTF赛场中的“世界杯”。
CTF 为团队赛,通常以三人为限,要想在比赛中取得胜利,就要求团队中每个人在各种类别的题目中至少精通一类,三人优势互补,取得团队的胜利。同时,准备和参与 CTF 比赛是一种有效将计算机科学的离散面、聚焦于计算机安全领域的方法。
赛事介绍
CTF是一种流行的信息安全竞赛形式,其英文名可直译为“夺得Flag”,也可意译为“夺旗赛”。其大致流程是,参赛团队之间通过进行攻防对抗、程序分析等形式,率先从主办方给出的比赛环境中得到一串具有一定格式的字符串或其他内容,并将其提交给主办方,从而夺得分数。为了方便称呼,我们把这样的内容称之为“Flag”。
CTF竞赛模式具体分为以下三类:
解题模式(Jeopardy) 在解题模式CTF赛制中,参赛队伍可以通过互联网或者现场网络参与,这种模式的CTF竞赛与ACM编程竞赛、信息学奥赛比较类似,以解决网络安全技术挑战题目的分值和时间来排名,通常用于在线选拔赛。题目主要包含逆向、漏洞挖掘与利用、Web渗透、密码、取证、隐写、安全编程等类别。
攻防模式(Attack-Defense) 在攻防模式CTF赛制中,参赛队伍在网络空间互相进行攻击和防守,挖掘网络服务漏洞并攻击对手服务来得分,修补自身服务漏洞进行防御来避免丢分。攻防模式CTF赛制可以实时通过得分反映出比赛情况,最终也以得分直接分出胜负,是一种竞争激烈,具有很强观赏性和高度透明性的网络安全赛制。在这种赛制中,不仅仅是比参赛队员的智力和技术,也比体力(因为比赛一般都会持续48小时及以上),同时也比团队之间的分工配合与合作。
混合模式(Mix) 结合了解题模式与攻防模式的CTF赛制,比如参赛队伍通过解题可以获取一些初始分数,然后通过攻防对抗进行得分增减的零和游戏,最终以得分高低分出胜负。采用混合模式CTF赛制的典型代表如iCTF国际CTF竞赛。
题目类别
Reverse
题目涉及到软件逆向、破解技术等,要求有较强的反汇编、反编译功底。主要考查参赛选手的逆向分析能力。
所需知识:汇编语言、加密与解密、常见反编译工具
Pwn
Pwn 在黑客俚语中代表着攻破,获取权限,在 CTF 比赛中它代表着溢出类的题目,其中常见类型溢出漏洞有整数溢出、栈溢出、堆溢出等。主要考查参赛选手对漏洞的利用能力。
所需知识:C,OD+IDA,数据结构,操作系统
Web
Web 是 CTF 的主要题型,题目涉及到许多常见的 Web 漏洞,如 XSS、文件包含、代码执行、上传漏洞、SQL 注入等。也有一些简单的关于网络基础知识的考察,如返回包、TCP/IP、数据包内容和构造。可以说题目环境比较接近真实环境。
所需知识:PHP、Python、TCP/IP、SQL、JAVA
Crypto
题目考察各种加解密技术,包括古典加密技术、现代加密技术甚至出题者自创加密技术,以及一些常见编码解码,主要考查参赛选手密码学相关知识点。通常也会和其他题目相结合。
所需知识:矩阵、数论、密码学
Misc
Misc 即安全杂项,题目涉及隐写术、流量分析、电子取证、人肉搜索、数据分析、大数据统计等,覆盖面比较广,主要考查参赛选手的各种基础综合知识。
所需知识:常见隐写术工具、Wireshark 等流量审查工具、编码知识
Mobile
主要分为 Android 和 iOS 两个平台,以 Android 逆向为主,破解 APK 并提交正确答案。
所需知识:Java,Android 开发,常见工具
AWD线下赛
Attack With Defence,简而言之就是你既是一个 hacker,又是一个 manager。
比赛形式:一般就是一个 ssh 对应一个服务,可能是 web 也可能是 pwn,然后flag 五分钟一轮,各队一般都有自己的初始分数,flag 被拿会被拿走 flag 的队伍均分,主办方会对每个队伍的服务进行 check,check 不过就扣分,扣除的分值由服务 check 正常的队伍均分。
Web 题目类型
- 出题人自己写的 CMS 或者魔改后的 CMS(注意最新漏洞、1day 漏洞等)
- 常见(比如 Wordpress 博客啊、 Discuz! 论坛啊)或者不常见 CMS 等
- 框架型漏洞(CI等)
- 如何在 CTF 中当搅屎棍
- AWD 模式生存技巧
- 能力:漏洞反应能力、快速编写脚本、web代码审计
- 心态放好,因为 web 比较容易抓取流量,所以即使我们被打,我们也可以及时
通过分析流量去查看别的队伍的 payload,从而进行反打。 - 脚本准备:一句话,文件包含,不死马、禁止文件上传等
- 警惕 web 弱口令,用最快的速度去补。
Bin 题目类型
大部分是 PWN,题目类型包括栈、堆、格式化字符串等等。
能力:
迅速找到二进制文件的漏洞,迅速打 patch 的能力
全场打 pwn 的 exp 脚本编写
熟悉服务器运维
尽快摸清楚比赛的 check 机制
如果二进制分析遇到障碍难以进行,那就去帮帮 web 选手运维看看现场环境是否可以提权,这样可以方便我们搞操作(如魔改 libc 等等)
技巧
如果自己拿到 FB, 先用 NPC 服务器或者自己服务器测试,格外小心自己的
payload 不要被别的队伍抓取到, 写打全场的 exp 时,一定要加入混淆流量。
提前准备好 PHP 一句话木马等等脚本。
小心其他队伍恶意攻击使我们队伍机器的服务不能正常运行,因此一定要备份服务器的配置。
尽可能在不搞崩服务和绕过 check 的情况下,上 WAF,注意分析别人打过来的流量,如果没有混淆,可以大大加快我们的漏洞分析速度。
工具准备: 中国菜刀、 Nmap、Xshell、 合适的扫描器等。
心态不要崩。
不要忽视 Github 等平台,可能会有写好的 exp 可以用。
将 flag 的提交自动化。
0x02 Linux 基础
系统目录
1 | /bin 、 /sbin :链接到 /usr/bin ,存放 Linux 一些核心的二进制文件,其包含的命令可在 shell 上运行。 |
权限设置
在 Linux 中,文件或目录权限的控制分别以读取、写入、执行 3 种一般权限来区分,另有 3 种特殊权限可供运用。
使用 ls -l [file] 来查看某文件或目录的信息:
1 | $ ls -l / |
第一栏从第二个字母开始就是权限字符串,权限表示三个为一组,依次是所有者权限、组权限、其他人权限。每组的顺序均为 rwx ,如果有相应权限,则表示成相应字母,如果不具有相应权限,则用 - 表示。
- r :读取权限,数字代号为 “4”
- w :写入权限,数字代号为 “2”
- x :执行或切换权限,数字代号为 “1”
通过第一栏的第一个字母可知,第一行是一个链接文件 ( l ),第二行是个目录( d ),第三行是个普通文件( - )。
用户可以使用 chmod 指令去变更文件与目录的权限。权限范围被指定为所有者( u )、所属组( g )、其他人( o )和所有人( a )。
-R:递归处理,将指令目录下的所有文件及子目录一并处理;
<权限范围>+<权限设置>:开启权限范围的文件或目录的该选项权限设置
$ chmod a+r [file] :赋予所有用户读取权限
<权限范围>-<权限设置>:关闭权限范围的文件或目录的该选项权限设置
$ chmod u-w [file] :取消所有者写入权限
<权限范围>=<权限设置>:指定权限范围的文件或目录的该选项权限设置;
$ chmod g=x [file] :指定组权限为可执行
$ chmod o=rwx [file] :制定其他人权限为可读、可写和可执行
环境变量
分类
按照生命周期划分
永久环境变量:修改相关配置文件,永久生效。
临时环境变量:使用 export 命令,在当前终端下生效,关闭终端后失效。
按照作用域划分
系统环境变量:对该系统中所有用户生效。
用户环境变量:对特定用户生效。
设置方法
在文件 /etc/profile 中添加变量,这种方法对所有用户永久生效。如:
1
2
3# Set our default path
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"
export PATH添加后执行命令 source /etc/profile 使其生效。
在文件 ~/.bash_profile 中添加变量,这种方法对当前用户永久生效。其余同上。
直接运行命令 export 定义变量,这种方法只对当前终端临时生效。
常用变量
使用命令 echo 打印变量:
1 | $ echo $PATH |
使用命令 env 可以打印出所有环境变量:
1 | $ env |
使用命令 set 可以打印处所有本地定义的 shell 变量:
1 | $ set |
使用命令 unset 可以清楚环境变量:
1 | $ unset $变量名 |
proc路径
1 | /proc/[pid] |
0x03 注入
基本原理
用一个不严谨的说法来形容注入攻击,就是,本应该处理用户输入字符的代码,将用户输入当作了代码来执行,常见于解释型语言。主要有以下几种形式:
类别 | 说明 |
---|---|
SQL注入 | 最常见的注入形式,通过恶意拼接数据库语句,来实现非预期的功能 |
XML外部实体注入 | XML文档外部实体注入,实现任意文件读取或者是命令执行 |
系统命令注入 | 通过拼接来执行非预期的操作系统指令 |
表达式语言注入 | Java 中常见的命令注入执行方式 |
服务端模板注入 | 使用模板引擎的语言常见的注入形式(PHP smart模板注入、 Python SSTI模板注入) |
SQL注入
常见函数
1 | version() MySQL 版本 |
报错语句
1 |
|
注入语句
1 | # union select |
XML外部实体注入(XXE)
通用实体
通常用在有回显xxe注入中
1 |
|
参数实体
通常在无回显的情况下使用
1 | # 新建外部实体 test.dtd |
命令执行
0x04 文件上传
0x05 代码审计
常见PHP特性
常见PHP函数
代码执行函数
1 | # eval |
文件包含函数
1 | # 4.2.1 include() |
命令执行函数
1 | exec() — 执行一个外部程序 |
文件操作函数
1 | copy — 拷贝文件 |
0x06 反序列化
信息收集
常见的信息收集手段
web扫描器:御剑、awvs 收集站点目录,获取重要站点信息文件。如后台、爬虫文件。
nmap扫描:站点服务器端口、服务开放情况、所用中间件的版本详情
做题技巧
源码分析,查看源码是否有什么可疑的注释信息。
扫描器收集信息。
访问可以文件或者页面。
CMS站点
常见cms存在的一些文件,安装完成后为及时删除,造成站点被篡改。
如:install/install.php data/install.lock
弱口令爆破
常见的:admin、admin123、admin123456、1q2w3e4r。。。
使用butpsuite抓包爆破。intruder
sql注入
sql注入的产生原因:
由于服务器接收用户数据并且拼接了用户的可疑sql代码。并且没有进行严格的过滤,将sql语句带入查询。
了解其中的危害性:
数据库信息泄露,用户重要的饮食数据。
网页篡改
网站被挂马
数据库被恶意操作
服务器被远程控制
常见的注入类型:
寻找注入点:动态页面与数据库交互。
方法:单引号法,判断是否有错误返回and 1=1 和 and 1=2
基于时间类型的盲注:测试方法,查看页面返回延时
做题:首先基本的判断注入,执行注入语句,进行注入操作,可以手注,可自动化注入
POST型注入
sqlmap跑出注入点时,爆库、表、字段、内容的步骤
python sqlmap.py -u "http://172.16.5.107/stage/5/get_info.php?title=xiaoshiniudao&id=1"
爆库: --dbs
爆表: -D databasename --tables
爆字段: -D databasename -T tablename --columns
爆字段的内容: -D databasename -T tablename -C “——,——” --dump
union联合查询猜解库,表,名,字段
1 union select table_name from information_schema.schemata 库
1 union select table_name from information_schema.tables where table_schema=’xxxxx’ 库中的表
1 union select column_name from information_schema.columns where table_schema=’xxxxx’ and table_name=’xxxx’
1 union select xxxx from xxxx
常见查询函数
version() MySQL 版本
user() 数据库用户名
database() 数据库名
@@datadir 数据库路径
@@version_compile_os 操作系统版本
hex() 把十进制转为十六进制
concat() 连接字符串
ascii() ascii编码
length() 获取长度
substring() mid() 取出字符串
group_concat() 连接一个组的所有字符串 以逗号分隔每一条数据
updatexml()、extractvalue() 用于报错注入
sleep() 休眠
1 | 时间盲注语句 |
xss 跨站脚本攻击(cross-site scripting)
出现于web应用程序的安全漏洞。对用户输入过滤不足。插入恶意脚本。
危害
cookie劫持、会话劫持、钓鱼欺骗
攻击条件
a) 需要向web页面注入恶意代码
b)这些恶意代码能够被浏览器成功执行
分类
反射型:也称非持久型、参数型跨站脚本
恶意代码没有保存在目标站点,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击。
存储型:
XSS存储型攻击,恶意代码被保存到目标网站的服务器中,这种攻 击具有较强的稳定性和持久性,比较常见场景是在博客,论坛等社交网 站上,但OA系统,和CRM系统上也能看到它身影,比如:某CRM系 统的客户投诉功能上存在XSS存储型漏洞,黑客提交了恶意攻击代码, 当系统管理员查看投诉信息时恶意代码执行,窃取了客户的资料,然而 管理员毫不知情,这就是典型的XSS存储型攻击。
DOM型:
文件包含
原理
代码通过php函数来包含其他php的代码文件,并且当成php代码来执行,使得代码重复利用,降低开发的开发成本。
常见文件包含函数
include()、include_once()、require()、require_once()
漏洞产生原因
文件包含函数加载的参数没有经过严格过滤活或者严格定义,可以被用户控制包含其他恶意文件,导致执行了非预期的代码。
本地文件包含漏洞
a)无限制本地文件包含
b) 常见的敏感信息路径
windows:
c:\boot.ini // 查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam // 存储Windows系统初次安装的密码
c:\ProgramFiles\mysql\my.ini // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
c:\windows\php.ini // php 配置信息
Linux:
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件
/var/log/
c)session文件包含
d) 有限制本地文件包含漏洞绕过
%00截断
条件:magic_quotes_gpc = Off php版本<5.3.4
远程文件包含
支持的协议和封装协议 //官方文档
任意文件上传
前端js上传检测绕过
判断方法:使用bp抓包,直接上传后缀为php的文件,发现bp没有抓到包,但是已经弹窗显示上传文件格式不允许。
绕过方法:
1)上传合法后缀的文件。使用bp截包改后缀名。即可绕过。
2)审查元素,修改js验证代码的
3)删除对js验证脚本的调用
服务器端MIME类型检测绕过
检测原理:当用户上传文件至服务端时,服务端程序会获取上传文件的MIME类型
绕过方法:MIME类型在HTTP请求字段里的Content-type字段,修改该字段的值即可绕过
黑名单绕过
检测原理:服务器端根据一份后缀名的名单来判断是否允许当前文件上传到服务器,若在名单中,就禁止该文件上传
绕过方法:
1)文件名大小写绕过。(pHP Asp)
2)名单列表绕过
3)特殊文件名绕过。 windows可以自动修改。 但是linux|unix没有这个特性 1.jpg 1.jpg. 1.jpg.abc
4)0x00截断绕过
5).htaccess文件攻击
6)解析调用/漏洞绕过
白名单绕过
服务端文件内容绕过
web应用程序解析绕过
1)apache解析漏洞
解析:test.php.(任意不属于黑名单且也不属于Apache解析白名单的名称),比如test.php.lala
描述:一个文件名为test.x1.x2.x3的文件,apache会从x3的位置开始尝试解析,如果x3不属于apache能够解析的扩展名,那么apache会尝试去解析x2,直到能够解析到能够解析的为止,否则就会报错。
2)ISS解析漏洞
解析:test.asp/(任意文件名)|test.asp;(任意文件名) | (任意文件名)/(任意文件名).php
描述:IIS6.0在解析asp格式的时候有两个解析漏洞,一个是如果目录名包含".asp"字符串,那么这个目录下所有的文件都会按照asp去解析,另一个是只要文件名中含有".asp;"会优先按asp来解析;IIS7.0/7.5是对php解析时有一个类似于Nginx的解析漏洞,对任意文件名只要在URL后面追加上字符串"/任意文件名.php"就会按照php的方式去解析;
3)nginx解析漏洞\****
解析: (任意文件名)/(任意文件名).php | (任意文件名)%00.php
描述:目前Nginx主要有这两种漏洞,一个是对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg,可以添加为test.jpg/x.php进行解析攻击。还有一种是对低版本的Nginx可以在任意文件名后面添加%00.php进行解析攻击。
命令执行
常见shell拼接符(&、&&、|、||)
A&B: 顺序执行多条命令,而不管命令是否执行成功
A&&B: 顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
A|B: 管道命令,如:dir . /s/a | find /c ".exe" 表示:先执行 dir 命令,对其输出的结果执行后面的 find 命令
A||B: 顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
常见绕过方式
空格绕过
1 | IFS |
绕过关键字
1 | wh\o\ami //反斜线绕过 |
任意字符插入执行(可绕过命令和文件名)
1 | cat /f`who`la`ks`g 反斜杠之间的字符会作为命令执行 |
只可绕过文件名
1 | cat fl[abc]g.php //匹配[abc]中的任何一个 |
文件名绕过
1 | 利用正则:比如要读取etc/passwd |
命令执行函数绕过
1 | system("cat /etc/passwd") |