什么是CTF


CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。

竞赛模式


解题模式:

在解题模式CTF赛制中,参赛队伍可以通过互联网或者现场网络参与,这种模式的CTF竞赛与ACM编程竞赛、信息学奥赛比较类似,以解决网络安全技术挑战题目的分值和时间来排名,通常用于在线选拔赛。题目主要包含逆向、漏洞挖掘与利用、Web渗透、密码、取证、隐写、安全编程等类别

攻防模式

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

混合模式

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

为什么要打CTF / 打CTF能带来什么


  1. 全国大学生信息安全竞赛是列入“高校学科竞赛排行榜”的竞赛之一,在这个比赛获奖可以给综测加分,大多计算机类的学院都认可。
  2. 学习CTF可以认识到许多大佬,从而带动自己的学习,向大佬靠近!
  3. CTF是很多安全公司以及公务员招聘的加分项目,有此经历可以帮助更好地找到好工作。
  4. 能够体验真实的生产环境,例如护网等活动都是会邀请战队参与,不仅能够认识到更多的人,也能大大地加分。

    前置知识


16进制


不同文件有着不同的格式,比如jpg、png、svg是不同的,应该要知道常见文件的文件格式,尤其是各类的文件头、协议、结构等。
那么如何查看文件的结构呢,我们要看的其实文件的16进制。
我们可以使用一些十六进位文件编辑器。
这里我们用010editor作为样例

010 Editor 是一个全新的十六进位文件编辑器,它有别于传统的十六进位编辑器在于它可用「范本」来解析二进位文件,从而让你读懂和编辑它。它还可用来比较一切可视的二进位文件。
利用它的模板功能可以非常轻松的观察文件内部的具体结构并且依此快速更改内容。

010editor
通过不同文件块不同颜色的标注,我们可以快速区分,以及找出隐藏文件等。

脚本语言 (介绍一下常用的库)


再打CTF的过程中,我们经常会要进行很多重复性的操作,或者是一些难以完成的行为。
常见的脚本语言有php、python、lua,下面比较不同之处

php:

php是英文超级文本预处理语言(Hypertext Preprocessor),它是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP语法特点类似于C语言,但又没有C语言复杂的地址操作,而且又加入了面向对象的概念,相对于我们学了C以及C++会更加容易上手操作。
但是其环境有点难配置,不过如果要打Web方向,那么PHP是必须要学的。

python:

相信大家经常看到宣传学python的广告。以普遍理性规律而言,python确实是一个非常非常强大的语言,可以做数据分析、与服务器交互、大量的计算。
python强大的一方面是其环境及其容易配置(除了坏电脑),另一方面是几乎你想到的所有东西都有别人写好的库可以直接调用使用,不用重复地造轮子,以致于使用python编程非常简单(语法也简单)。

lua:

lua其实是使用在开发,提供热更新方案的语言,其特点就是运行速度快,接近于C。
但其没有python那么多的库,虽然较C来说编写较快但是还是比不上python。


下面使用python进行介绍,平时比赛用的多的也是python(√

request库


request库可以让你轻松地与Web服务器交互,即网页端。
可以轻松地发get,post请求,以及附加上header,cookie等信息。
其主要特点还是可以自动化。

1
2
3
4
#导入requests库
import requests
#发送一个get请求并得到响应
r = requests.get('https://www.baidu.com')

所以,使用request库可以写一个简单的爬虫,实现全自动的文件下载等。

Re库


re库是python内置的正则表达式库,主要用于处理一组字符串等。
这里只做基本介绍,以及样例示范。

1
2
3
4
s="我是一个人(中国人)aaa[真的]bbbb{确定}"
a = re.sub(u"\\(.*?\\)|\\{.*?}|\\[.*?]", "", s)
print a
#我是一个人aaabbbb
1
2
3
4
5
import re

text = “JGood is a handsome boy, he is cool, clever, and so on…”
regex = re.compile(r'\w*oo\w*')
print regex.findall(text) #查找所有包含'oo'的单词

使用re库,可以很快地从大量具有相同特征的字符串中,提取出你想要的东西。

Crypto库


Crypto库使用于密码学方面,它将一些常用的计算全部已经写好封装了,例如求逆元,模运算等等。

相较于使用python自己写,Crypto库以及Cmath库使用C编写,运行速度不知道比python快多少。

1
2
3
4
5
6
7
8
9
from  Crypto.Cipher import  AES
import  base64

secret = "12345678912345678912345678912345"    # 由用户输入的16位或24位或32位长的初始密码字符串
cipher = AES.new(secret)                # 通过AES处理初始密码字符串,并返回cipher对象
s = cipher.encrypt("1234567891234567")  # 输入需要加密的字符串,注意字符串长度要是16的倍数。16,32,48..
print(s) # 输出加密后的字符串
print(base64.b64encode(s)) # 输出加密后的字符串的base64编码。
print(cipher.decrypt(s))  

使用工具


打CTF一个重点是,善于使用各种工具,不要重复造轮子。
工具用好了也可以做出来很多题目了。

linux


linux在网络空间安全方面有诸多运用,具体表现在以下方面:

  1. 服务器一般使用的是linux,如果不熟悉linux,应该很难做出题目。
  2. 很多工具仅限于linux而没有windows。
  3. 有部分题目是仅linux能打开的二进制文件,windows束手无策。
  4. 提前给以后工作作准备。(bushi
  5. 别问Mac,买不起。
  6. 推荐装kali(渗透专用)、ubuntu、Debian。
  7. 可以装wsl、VMware都可以,or双系统最猛了。

netcat


ncnetcat 的缩写,这是一款非常强大的工具,可以读、写TCP或UDP网络连接。(或许你看不懂这句话,这没有关系)

总而言之,使用 nc 这个工具,可以帮助你与服务器进行连接,从而进行下一步的交互。

一般来说,有很多题目都会要求你使用 nc 连接到他们的服务器,并且进行交互,获得 flag

如何安装 nc?


nc 命令在 macOS 中是自带的,在 Linux 中一般自带,或是可以使用相应的软件包管理器安装(如在 Debian/Ubuntu 中这个包名叫 netcat)。

当然,如果你在看这篇手册,你的操作系统很有可能是 Windows。它不自带 nc,尽管可以用 WSL 或者虚拟机的方式解决,但是如果你觉得这样太麻烦了,也有另外一些方法。(虽然如果想要进一步的学习,linux是必备的)

解决方案:使用搜索引擎,找到一个你喜欢的安装包,运行安装即可。

如何使用 nc?


Windows

你需要在你的 Windows 中打开 命令提示符(cmd) 或者 powershell以及各种各样的终端来使用这个工具。

avatar

这个黑黑的框就是命令提示符了

nc -h

当显示以上内容时,说明你成功运行了它。(当然可能由于版本不同命令也不同)

Linux & macOS

打开「终端」,输入 nc

avatar

出现类似的界面即为成功。

示例

在我们使用浏览器上网的时候,我们和服务器使用了 HTTP 协议进行连接。关于 HTTP 协议的更多细节,你需要自己上网搜索。一般来说,默认是 80 端口。

我们可以使用 nc,尝试一次与网页服务器的连接,以百度为例。

输入 nc www.baidu.com 80(或者 ncat www.baidu.com 80,或者 ./ncat www.baidu.com 80,请根据以上的介绍自行修改),程序会等待你的输入。

输入 GET / HTTP/1.0。这表示,我们使用 HTTP/1.0 这个协议版本,用 GET 的方式请求根 /。输入两下回车,代表我们的 HTTP 请求完成。如果你的网络畅通,百度的网页服务器会立刻返回大量信息,可以自行搜索,了解它们的含义。现在,你成功(在不使用浏览器的情况下)完成了一次与百度网站的连接!

avatar

比赛实例:

avatar

使用 nc ctf.w4terdr0p.team 49809连接

注意:使用nc时连接端口没有冒号!!!

vscode


Visual Studio Code是款由微软开发且跨平台的免费源代码编辑器。该软件支持语法高亮、代码自动补全(又称 IntelliSense)、代码重构、查看定义功能,并且内置了命令行工具和 Git 版本控制系统。用户可以更改主题和键盘快捷方式实现个性化设置,也可以通过内置的扩展程序商店安装扩展以拓展软件功能。

为什么说vscode好用呢,

  1. vscode体积小,仅仅只有几百M,相较于其他ide完全没有压力。
  2. vscode开源,你不仅仅能够使用其他人开发好的插件,你还能自己创建独特的vscode。由此vscode可以做到几乎所有事,比如听音乐,刷B站,发知乎等等。
  3. vscode并不是专门针对某一语言的ide,vscode仅仅是文本编辑器,装上不同的插件,配置好环境,完全可以用来写任何语言(好像说的有点过了)

notion


notion 是现在流行的协作文档,清华,浙大以及各大战队都在使用。
主要有以下几个方面的作用:

  1. 战队成员共享知识,并且可以技术传承下去。
  2. 记录参与过的比赛的writeups以供其他未参赛的成员复现。
  3. 在比赛过程中,共享做题进度,可以及时地交流思路。

    markdown


Markdown 是一种轻量级标记语言,相较于其他的文本编辑器(例如word),markdown可以让你专注于文本的内容,而不用去管字体字号等等杂七杂八的方面。

另外markdown被广泛运用于github、简书等来撰写帮助文档或是用于论坛上发表消息,如果你要建立自己的个人博客,也使用markdown更为方便。

Misc


信息搜集


在CTF比赛中,信息搜集能力非常重要。
在线上比赛一般是允许上网查阅资料,这时候,找到对应的参考资料的速度,基本上决定了你解出题目的速度。

善用搜索引擎,百度,csdn也不是不能用,但更多的其实是使用google或者是必应。

搜索出出题来源,出题论文等都是常见的。

另一方面,收集优秀的资料用于学习也是非常厉害的。

编码 (1分钟)

隐写 (3分钟)

流量包 (各种协议,然后这是完全不懂的)(或许就提一嘴)

压缩包 (1分钟)

Web

burp suite(?)

getshell (4分钟)

SQL (是什么,然后为什么有用) (5分钟)

PHP (同上)

XSS (2分钟)

CSRF / SSRF (2分钟)

Crpto

模运算 (1分钟)

RSA (可以直接讲(原理),应该听得懂)(5分钟)

(还想讲别的再讲吧)

RE

机器语言->汇编语⾔ (2分钟)

反汇编,反编译 (举个例子吧)(3分钟)

(算了我是真不会)(包括Pwn)