ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

搞懂 Linux “一切皆文件“:目录地图、7 种文件类型一次讲清

搞懂 Linux “一切皆文件“:目录地图、7 种文件类型一次讲清 关键词Linux、文件系统、FHS、一切皆文件、设备文件、/proc、inode本文为安全学习与授权测试用途所有操作均在本地环境完成请勿用于未授权目标。文章目录0. 从一个反直觉的现象说起1. 一切皆文件到底是什么意思2. FHSLinux 的目录地图3. 七种文件类型ls -l 第一列会说话3.1 Linux 不靠扩展名判断文件3.2 设备文件最典型的一切皆文件3.3 套接字藏着容器逃逸的经典路径4. /proc不存在于磁盘的文件5. 动手练一遍6. 写在最后0. 从一个反直觉的现象说起刚接触 Linux 的同学大概率被下面几条命令整懵过cat/etc/hostname# 读文本正常cat/dev/null# 读一个叫 null 的文件啥也没有cat/proc/cpuinfo# 读一个叫 cpuinfo 的文件居然输出了 CPU 信息echo1/proc/sys/net/ipv4/ip_forward# 往文件里写个 1居然开启了内核转发硬盘、CPU、内核参数为什么在 Linux 里统统能当成文件来读写这背后就是 Linux 最核心的设计哲学——一切皆文件Everything is a file。搞懂这句话你对 Linux 的理解会上一个台阶而且它是后面学命令注入、提权、容器逃逸绕不开的底层认知。这篇文章我们一次讲透。1. 一切皆文件到底是什么意思在 Windows 的世界里.txt是文本、.exe是程序、C 盘 D 盘是不同磁盘各有各的操作方式。Linux 不一样。内核对外部世界的统一抽象就是文件。不管你操作的是普通的文本、数据一个目录一块硬盘、一个 U 盘键盘、终端一张网卡一个正在运行的进程的信息内核都尽量用同一套接口对待open()打开、read()读、write()写、close()关闭。你不需要为读硬盘和读文本学两套操作。上面那条cat命令内部就是open()→ 循环read()→ 输出到屏幕它根本不关心自己读的是磁盘、设备还是普通文件。这种统一抽象由内核里的VFS虚拟文件系统层实现VFS 规定一个文件该支持哪些操作再让具体的文件系统ext4、设备驱动、虚拟文件系统各自去实现。对上层来说背后差异被完全屏蔽了。2. FHSLinux 的目录地图Linux 没有盘符概念所有文件都挂在从根/开始的同一棵目录树里。顶层布局遵循FHS文件系统层次标准。记住这张表你就不会在系统里迷路目录放什么安全/运维相关性/根目录整棵树的起点—/bin/sbin基础命令 / 需要 root 的管理命令应急、提权/etc系统和服务的配置文件纯文本改配置、找密钥/home普通用户的家目录用户数据、.ssh 密钥/rootroot 用户的家目录管理员痕迹/usr大部分程序和数据只读安装的软件/var经常变化的数据日志、缓存、数据库/var/log 看日志/tmp临时文件重启可能清空临时工具/dev设备文件磁盘、null、zero一切皆文件的体现/proc进程与内核信息虚拟文件系统看进程、环境变量/sys硬件与内核参数虚拟文件系统设备、驱动/boot启动引导程序和内核启动相关/opt第三方附加软件手动装的软件/mnt/media临时挂载点额外磁盘、U 盘挂载新存储安全学习中最常打交道的几个单独划重点/etc服务配置都在这/etc/passwd用户列表、/etc/shadow密码哈希、/etc/ssh/sshd_configSSH 配置。弱口令、硬编码密钥、错误权限都是排查重点。/var/log所有日志的家auth.logDebian 系/secureRed Hat 系记录登录行为是排查入侵的第一站。/proc每个进程在/proc/PID/下有个目录cmdline启动命令、environ环境变量可能含口令、fd/打开的文件都是信息收集金矿。/tmp和/dev/shm全局可写常被用来放临时工具。小知识Ubuntu 这类现代发行版里/bin/sbin其实是指向/usr/bin/usr/sbin的软链接usrmerge 方案ls -l /bin会看到它是个链接属于历史演进不影响使用。3. 七种文件类型ls -l 第一列会说话一切皆文件不等于文件都长一样。Linux 把文件分成七种用ls -l输出的第一个字符辨认$ls-l/etc/hostname -rw-r--r--1root root12... /etc/hostname ↑ 第一个字符就是类型首字符类型说明典型例子-普通文件数据载体文本或二进制脚本、ELF 程序d目录存放文件名→inode映射的特殊文件/home、/tmpl软链接指向另一个路径/bin→/usr/binb块设备按块随机存取通常是磁盘/dev/sdac字符设备按字节流顺序读写/dev/null、/dev/ttyp命名管道进程间传递数据的 FIFOmkfifo创建s套接字进程间/网络通信端点/run/docker.sock3.1 Linux 不靠扩展名判断文件这是和 Windows 最大的区别之一。一个文件是文本还是程序看的是内容本身不是扩展名。file命令读文件开头的魔数来判断$file/bin/ls /bin/ls: ELF64-bit LSB pie executable, x86-64...# ELF 魔数 可执行程序$file/etc/hostname /etc/hostname: ASCII text# 纯文本$echohellofake.png $filefake.png fake.png: ASCII text# 扩展名是 .png内容是文本照样被认出来所以把脚本改名不影响它的本质。能不能执行看两件事有没有执行权限x以及文件开头的shebang#!/bin/bash、#!/usr/bin/env python3告诉内核用哪个解释器。3.2 设备文件最典型的一切皆文件/dev下的设备文件让你能用读写文件的方式操作硬件。几个天天用到的虚拟设备设备行为常见用法/dev/null数据黑洞写入全丢弃读返回空command 2/dev/null丢弃错误输出/dev/zero源源不断提供\0字节生成指定大小文件/dev/urandom提供随机字节生成密钥、随机数/dev/tty当前终端脚本强制向终端输出体会这套抽象想丢弃输出就写进一个叫 null 的文件想造 1GB 全零文件就从零源读 1GB 再写进新文件ddif/dev/zeroofdisk.imgbs1Mcount1024# 生成 1GB 全零镜像head-c32/dev/urandom|xxd# 生成 32 字节随机数3.3 套接字藏着容器逃逸的经典路径套接字用于进程间/网络通信。安全里最该记住的是/run/docker.sock——Docker 守护进程的 Unix 套接字。谁能读写这个套接字谁就能控制 Docker进而等价于 root这是容器逃逸的经典路径。排查容器挂载时看到/var/run/docker.sock被挂进容器就要高度警惕。4. /proc不存在于磁盘的文件/proc是 procfs 虚拟文件系统这里的文件不占磁盘在你读取的瞬间由内核动态生成。$ls/proc110cpuinfo meminfo version... └┬─┘ 每个数字一个进程 PID对应一个目录每个进程的/proc/PID/目录是信息收集重点路径内容安全相关性cmdline进程启动命令含参数还原服务怎么启动的environ环境变量可能含密码、密钥、令牌fd/打开的所有文件找日志、socketmaps内存映射分析二进制、找 libc 基址status运行状态、UID/GID看进程以谁的身份跑# 查看 1 号进程的启动命令\0 分隔用 tr 转换cat/proc/1/cmdline|tr\0 “读文件 查状态写文件 改配置”一套读写语义通吃所有内核状态这就是一切皆文件的威力。5. 动手练一遍打开任意一台 Linux云服务器、WSL 都行按顺序敲# 1. 看顶层目录布局对照 FHS 表ls-l/# 2. 辨认文件类型注意首字符ls-l/etc/hostname# - 普通文件ls-ld/etc# d 目录ls-l/bin# l 软链接ls-l/dev/null# c 字符设备# 3. 验证不靠扩展名file/bin/ls /etc/hostname /dev/nullechox/tmp/test.pngfile/tmp/test.png# 4. 体验 /proc 虚拟文件cat/proc/cpuinfo|headls/proc/self/cat/proc/self/cmdline|tr\0 ;echo# 5. 体验设备文件ddif/dev/zeroof/tmp/zeros.binbs1Mcount1ls-lh/tmp/zeros.bin敲完这一遍你应该能对着ls -l脱口说出文件类型、解释 /dev 和 /proc 为什么也是文件、以及为什么改扩展名骗不了 Linux。6. 写在最后这篇文章最值得带走的三点第一一切皆文件是 Linux 的统一抽象普通数据、目录、设备、进程状态都通过 open/read/write 一套接口对待这种机制统一、组合简单正是 Unix 工程美学的核心。第二记住 FHS 目录地图配置在 /etc、日志在 /var/log、设备在 /dev、进程信息在 /proc遇到任何系统都不会迷路。第三Linux 不靠扩展名判断文件看的是文件头魔数和权限位理解这一点后面分析脚本、程序和设备才不会被表象误导。如果你想顺着这条线继续看 inode、软硬链接、挂载机制以及更多从零基础到内网/域控的体系化安全文章可以访问我的安全学习站点站点地址详见本文开头或结尾官网【光跃Eason·安研社】里面有完整的漏洞实战导航、成体系的安全文章以及配套靶场环境和探测脚本具体联系方式见站点相关页面也欢迎加微信交流。我会持续更新 Linux 基础和真实漏洞复现的经验我们下篇文章见。免责声明本文仅用于网络安全研究与教学所有测试均在本人授权的环境中进行。请严格遵守《网络安全法》切勿对任何未授权系统测试。技术本身中立关键在于使用它的人。
返回列表