初识CTF

初识CTF


CTF简介

CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式,是网络安全爱好者之间的竞技游戏。

竞赛模式

  • 解题模式(Jeopardy)
    解题模式(Jeopardy)常见于线上选拔比赛。在解题模式 CTF 赛制中,参赛队伍可以通过互联网或者现场网络参与,参数队伍通过与在线环境交互或文件离线分析,解决网络安全技术挑战获取相应分值,类似于 ACM 编程竞赛、信息学奥林匹克赛,根据总分和时间来进行排名。
    解题模式一般会设置 一血 、 二血 、 三血。还有一种流行的计分规则是设置每道题目的初始分数后,根据该题的成功解答队伍数,来逐渐降低该题的分值,也就是说如果解答这道题的人数越多,那么这道题的分值就越低。最后会下降到一个保底分值后便不再下降。
    题目类型主要包含 Web 网络攻防 、 RE 逆向工程 、Pwn 二进制漏洞利用 、 Crypto 密码攻击 、Mobile 移动安全 以及Misc 安全杂项这六个类别。

  • 攻防模式
    在攻防模式CTF赛制中,参赛队伍在网络空间互相进行攻击和防守,挖掘网络服务漏洞并攻击对手服务来得分,修补自身服务漏洞进行防御来避免丢分。攻防模式CTF赛制可以实时通过得分反映出比赛情况,最终也以得分直接分出胜负,是一种竞争激烈,具有很强观赏性和高度透明性的网络安全赛制。在这种赛制中,不仅仅是比参赛队员的智力和技术,也比体力(因为比赛一般都会持续48小时及以上),同时也比团队之间的分工配合与合作。

  • 混合模式
    即结合了解题模式与攻防模式的CTF赛制,比如参赛队伍通过解题可以获取一些初始分数,然后通过攻防对抗进行得分增减的零和游戏,最终以得分高低分出胜负。采用混合模式CTF赛制的典型代表如iCTF国际CTF竞赛。

题目分类

1. 安全杂项(Misc)

题目涉及:流量分析、电子取证、人肉搜索、数据分析、大数据统计

  • 信息收集(Recon)      在国内,大家也喜欢称这类题目为 "社工题",对于仅给定图片的 OSINT 题目,通常从图片本身和图片内容入手。
    要求:熟练运用各种搜索引擎及工具(对经验和技巧要求较高)
  • 隐写(Steganography)     Flag会隐藏到图片、音频、视频等各类数据载体中供参赛选手获取。载体就是图片、音频、视频等,可能是修改了这些载体来隐藏flag,也可能将flag隐藏在这些载体的二进制空白位置。
    要求:熟悉使用隐写工具,了解隐写算法
    常见类型:修改文件格式、添加文件头数据、修改图片宽高、盲水印、从图片中提取文件、exif信息、LSB隐写、GIF帧分离查看。
  • 流量分析      流量分析主要是根据元数据(不是通信内容本身)识别对手活动和通信模式,每条记录多达几兆字节的全部活动内容,可能只产生100字节的元数据,如端点(包括ip地址和域名)、端口、收发字节数、连接时长及起止时间,我们将这样一组元数据成为“网络流”(network flows)。
  • 内存取证:     内存取证是指在计算机系统的内存中进行取证分析,以获取有关计算机系统当前状态的信息。内存取证通常用于分析计算机系统上运行的进程、网络连接、文件、注册表等信息,并可以用于检测和分析恶意软件、网络攻击和其他安全事件     详见:内存取证 - Hello CTF

工具:010 Editor、Foremost、binwalk、Stegsolve、Ziperello、Wireshark、ARCHPR、Mp3stego等

2. 网络攻防(Web)

题目涉及到许多常见的WEB漏洞,如:SQL 注入、XSS 跨站脚本、CSRF 跨站请求伪造、文件上传、文件包含、框架安全、PHP 常见漏洞、代码审计等。

  • SQL 注入      SQL 注入是一种将 SQL 代码插入或添加到应用(用户)的输入参数中,之后再将这些参数传递给后台的 SQL 服务器加以解析并执行的攻击。
    常用工具:Burp Suite、hackbar、SQLMap、Proxy SwitchyOmega、dirsearch
  • XSS跨站脚本攻击      攻击者利用网站漏洞把恶意的脚本代码注入到网页中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害用户可能采取 Cookies 资料窃取、会话劫持、钓鱼欺骗等各种攻击。
  1. 反射型 XSS       反射型跨站脚本(Reflected Cross-Site Scripting)是最常见,也是使用最广的一种,可将恶意脚本附加到 URL 地址的参数中。
    反射型 XSS 的利用一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。此类 XSS 通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。
  2. 持久型 XSS      持久型跨站脚本(Persistent Cross-Site Scripting)也等同于存储型跨站脚本(Stored Cross-Site Scripting)。
    此类 XSS 不需要用户单击特定 URL 就能执行跨站脚本,攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。持久型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。
  3. DOM型      传统的 XSS 漏洞一般出现在服务器端代码中,而 DOM-Based XSS 是基于 DOM 文档对象模型的一种漏洞,所以,受客户端浏览器的脚本代码所影响。客户端 JavaScript 可以访问浏览器的 DOM 文本对象模型,因此能够决定用于加载当前页面的 URL。换句话说,客户端的脚本程序可以通过 DOM 动态地检查和修改页面内容,它不依赖于服务器端的数据,而从客户端获得 DOM 中的数据(如从 URL 中提取数据)并在本地执行。另一方面,浏览器用户可以操纵 DOM 中的一些对象,例如 URL、location 等。用户在客户端输入的数据如果包含了恶意 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到基于 DOM 的 XSS 攻击。
  • php       包括php代码审计、PHP 序列化及反序列化、文件上传、文件包含、变量覆盖、命令执行等。
    要求:熟练掌握PHP语法,了解PHP特性。 PHP 教程 | 菜鸟教程
  • CSRF跨站请求伪造        对于 CSRF,其两个关键点是跨站点的请求与请求的伪造,由于目标站无 token 或 referer 防御,导致用户的敏感操作的每一个参数都可以被攻击者获知,攻击者即可以伪造一个完全一样的请求以用户的身份达到恶意目的。
    按请求方式:POST、GET
    按攻击方式:HTML CSRF、JSON HiJacking、Flash CSRF
  • SSRF服务端请求伪造        SSRF是一种由攻击者构造形成由服务器端发起请求的一个漏洞。一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统。

3. 密码攻击(Crypto)
全称Cryptography。可分为:古典密码和现代密码。需要了解并掌握常见编码方式

  • 古典密码
  1. 移位密码
    栅栏密码、曲路密码、列移位密码
  2. 替换密码
  • 单表替换(明密文一一对应)
    例:埃特巴什码、凯撒密码、仿射密码
  1. 在密钥空间较小的情况下,采用暴力破解方式
  2. 在密文长度足够长的时候,使用词频分析,quipqiup - cryptoquip and cryptogram solver
  • 多表替换

对于多表替换加密来说,加密后的字母几乎不再保持原来的频率,所以我们一般只能通过寻找算法实现对应的弱点进行破解。
例:Playfair、Polybius(棋盘密码)、维吉尼亚密码、Nihilist(关键字密码)、Hill(希尔密码)、AutokeyCipher(自动密钥密码)

3.其他类型加密

培根密码、01248 密码 、JSFuck、BrainFuck、ook、猪圈密码、键盘密码

古典密码分析思路

  1. 确定密码类型:根据题目提示、加密方式、密文字符集、密文展现形式等信息
  2. 确定攻击方法:包括直接分析、蛮力攻击、统计分析等方法。对于无法确定类型的特殊密码,应根据其密码特性选用合适的攻击方法。
  3. 确定分析工具:以在线密码分析工具与 Python 脚本工具包为主,以离线密码分析工具与手工分析为辅。
  • 现代密码
  1. 对称加密(DES、AES、RC4)
  • 分组密码(块密码)

所谓块加密就是每次加密一块明文,我们也可以把块加密理解一种特殊的替代密码,但是其每次替代的是一大块。而正是由于一大块,明文空间巨大,而且对于不同的密钥,我们无法做一个表进行对应相应的密文,因此必须得有 复杂 的加解密算法来加解密明密文。
而与此同时,明文往往可能很长也可能很短,因此在块加密时往往需要两个辅助

1.padding,即 padding 到指定分组长度
2.分组加密模式,即明文分组加密的方式。

  • 序列密码(流密码)
  • 流密码一般逐字节或者逐比特处理信息。在已知明文的情况下,可以非常容易地获取密钥流
  • 流密码的密钥长度会与明文的长度相同。
  • 流密码的密钥派生自一个较短的密钥,派生算法通常为一个伪随机数生成算法。伪随机数生成算法生成的序列的随机性越强,明文中的统计特征被覆盖的更好。
  1. 非对称加密(RSA、ELGamal、椭圆曲线加密)
    RSA学习 RSA 介绍 - CTF Wiki

  2. 哈希函数(MD5、SHA-1、SHA-521)

  3. 数字签名(RSA签名、ELGamal签名、DSA签名)
  • 编码        编码不同于密码,他的关键不是隐藏信息,而是处理信息,是信息的另一种表示形式,用于解决一些特殊字符、不可见字符的传输问题。将原始信息变成编码信息的过程为 「编码 Encoding 」,反之,将编码信息转化回原始信息,转化的过程称之为 「解码 Dncoding 」。

常见编码:ASCII 编码、Hex(16进制)、Base家族(2、16、32、58、64、85)、URL编码(百分号编码)、摩斯电码、敲击码、中文电码、unicode码
工具:CyberChef GitHub - gchq/CyberChef: The Cyber Swiss Army Knife - a web app for encryption, encoding, compression and data analysis
           Ciphey GitHub - Ciphey/Ciphey: ⚡ Automatically decrypt encryptions without knowing the key or cipher, decode encodings, and crack hashes ⚡
           随波逐流 随波逐流工作室

4. 二进制漏洞利用(Pwn)
PWN在黑客俚语中代表着攻破,取得权限,在CTF比赛中它代表着溢出类的题目,其中常见类型溢出漏洞有栈溢出、堆溢出。主要考察参数选手对漏洞的利用能力。

  • 栈上数组越界&栈溢出        在学习C语言的过程中,使用数组,字符串(可以理解为特殊的数组)时,都会注意下标是否会越界,以保证程序正常运行。而在这里,我们将会反其道而行之,探索栈溢出或栈上数组越界时会发生什么,以及怎么利用这些漏洞实现攻击。
  • ROP(面向返回编程)入门        ROP的主要目的便是通过在合适的位置布置一连串的返回地址,从而实现相对复杂的逻辑。举个栗子,我们已经在 Stack_Overflow 中学习到了如何劫持返回地址,但是我们所做的只是一个跳转至“后门函数”,其距离可以真正劫持到恶意代码上还有很远的路要走,而ROP就是一种解决方案,其通过精心布局栈上的地址来完成复杂逻辑的跳转
  1. 32位 ROP
  2. 64位 ROP

gadget        gadget在这里指的是以ret指令结尾的代码片段,例如leave; ret就是一个很常用的gadget。我们可以利用各种合适的gadget拼凑出需要的程序逻辑。
工具:ROPgadget(获取)、grep(搜索)

5. 逆向工程(RE)
题目涉及到软件逆向、破解技术等,主要指对软件的结构,流程,算法,代码等进行逆向拆解和分析,要求有较强的反汇编、反编译扎实功底。主要考查参赛选手的逆向分析能力。
要求

  • 熟悉如操作系统,汇编语言,加解密等相关知识
  • 具有丰富的多种高级语言的编程经验
  • 熟悉多种编译器的编译原理
  • 较强的程序理解和逆向分析能力

常规逆向流程
1. 使用strings/file/binwalk/IDA等静态分析工具收集信息,并根据这些静态信息进行google/github搜索
2. 研究程序的保护方法,如代码混淆,保护壳及反调试等技术,并设法破除或绕过保护
3. 反汇编目标软件,快速定位到关键代码进行分析
4. 结合动态调试,验证自己的初期猜想,在分析的过程中理清程序功能
5. 针对程序功能,写出对应脚本,求解出 flag
逆向Tips
1. 编码风格
2. 集中原则 程序员开发程序时,往往习惯将功能相关的代码或是数据写在同一个地方,而在反汇编代码中也能显示出这一情况,因此在分析时可以查看关键代码附近的函数和数据。
3. 代码复用 在分析时可以找一些特征(如字符串,代码风格等)在 Github 搜索,可能会发现类似的代码,并据此恢复出分析时缺失的符号信息等。
4. 七分逆向三分猜 合理的猜测往往能事半功倍,遇到可疑函数却看不清里面的逻辑,不妨根据其中的蛛丝马迹猜测其功能,并依据猜测继续向下分析,在不断的猜测验证中,或许能帮助你更加接近代码的真相。
5. 区分代码 拿到反汇编代码,必须能区分哪些代码是人为编写的,而哪些是编译器自动附加的代码。人为编写的代码中,又有哪些是库函数代码,哪些才是出题人自己写的代码,出题人的代码又经过编译器怎样的优化?我们无须花费时间在出题人以外的代码上,这很重要。如果当你分析半天还在库函数里乱转,那不仅体验极差,也没有丝毫效果。
6. 耐心

总结

ctf之路任重而道远,只有一点点学习才能不断超越自我。加油!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值