Linux的proc文件系统,proc/&pid与/proc/self的学习---CTF应用

Linux的proc文件系统,proc/&pid与/proc/self的学习---CTF应用_第1张图片

目录

  • 一、/proc目录
  • 二、进程目录
    • 1、cmdline
    • 2、cwd
    • 3、exe
    • 4、environ
    • 5、status
    • 6、comm
    • 7、loginuid
    • 8、fd
    • 9、self

proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口,用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。

一、/proc目录

/proc下的文件表示实时存储在内核中并由内核使用的数据,如下一些常见的的目录文件

/proc/version 内核版本信息
/proc/cpuinfo CPU相关信息
/proc/meminfo 内存相关信息
/proc/mounts 系统挂载的文件系统
/proc/modules 当前加载的内核模块
/proc/sched_debug 正在运行的进程信息
/proc/net/wireless 无线网卡信息和基础信息
/proc/net/dev 网络设备状态信息和基本统计信息
/proc/uptime 机器启动时间 启动时间/空闲时间/秒
/proc/cmdline 在启动时传递至内核的相关参数信息
/proc/net/arp Arp缓存信息,可用于枚举局域网存活主机
/proc/net/route 包含路由表信息,IP地址使用16进制格式
/proc/net/tcp tcp socket表信息,可以用于枚举网络连接和监听端口,ip地址和端口使用16进制表示

并不是所有这些目录在你的系统中都有,这取决于你的内核配置和装载的模块,另外,在/proc下还有三个很重要的目录:net,scsi和sys,Sys目录是可写的,可以通过它来访问或修改内核的参数,而net和scsi则依赖于内核配置,例如,如果系统不支持scsi,则scsi目录不存在

二、进程目录

除了上面的那些目录文件,/proc下有的是一些以数字命名的目录,它们是进程目录,系统中当前运行的每一个进程都有对应的一个目录,以进程的PID号为目录名,它们是读取进程信息的接口,而self目录则是读取进程本身的信息接口

ls -al /proc

Linux的proc文件系统,proc/&pid与/proc/self的学习---CTF应用_第2张图片
右边蓝色的数字为进程号PID

如下/proc目录中1010进程相关的文件,目录中包含其进程本身相关信息的文件

ls -al /proc/1010

Linux的proc文件系统,proc/&pid与/proc/self的学习---CTF应用_第3张图片

1、cmdline

 cmdline文件存储着启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息

cat /proc/1010/cmdline

在这里插入图片描述

2、cwd

 cwd文件显示链接到目前1207进程的工作目录

ls -al /proc/1207/cwd

在这里插入图片描述
也就是1207进程的运行目录为/usr/lib/vmware-caf/pme/bin,可查看当前目录cwd与运行目录下的文件
在这里插入图片描述
即当前cwd目录下的文件与该进程运行目录下的文件相同

3、exe

 exe是一个指向启动当前进程的可执行文件(完整路径)的符号链接,即ManagementAgentHost是该进程的启动文件

ls -al /proc/1207/exe

在这里插入图片描述

4、environ

 environ文件包含当前进程的环境变量,彼此间用空字符(NULL)隔开;变量用大写字母表示,其值用小写字母表示

cat /proc/1207/environ

Linux的proc文件系统,proc/&pid与/proc/self的学习---CTF应用_第4张图片
常用来读取环境变量中的SECRET_KEY或FLAG

5、status

 status文件包含进程名称,状态、PPID、UID、GID等信息

cat  /proc/1207/status

Linux的proc文件系统,proc/&pid与/proc/self的学习---CTF应用_第5张图片

6、comm

 comm文件给出与进程关联的命令名称

cat  /proc/1207/comm

在这里插入图片描述

7、loginuid

 loginuid文件,这个登陆uid用于跟踪使用哪个账户获得系统访问权限

cat  /proc/1207/loginuid

在这里插入图片描述

8、fd

 fd 是一个目录,里面包含这当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接,即每个通过这个进程打开的文件都会显示在这里。所以我们可以通过fd目录里的文件获得指定进程打开的每个文件的路径以及文件内容

ls -al /proc/1207/fd

在这里插入图片描述
查看指定进程打开的某个文件的内容

ls -al /proc/1207/fd/2

这个fd文件比较重要,因为在linux系统中,如果一个程序用open()打开了一个文件但最终没有关闭他,即便从外部(如os.remove(SECRET_FILE))删除这个文件之后,在 /proc 这个进程的 pid 目录下的 fd 文件描述符目录下还是会有这个文件的文件描述符,通过这个文件描述符我们即可得到被删除文件的内容

9、self

 上面这些操作列出的都是目标环境指定进程的信息,但是我们在做题的时候往往需要的当前进程的信息,这时候就用到了 /proc 目录中的self子目录。

/proc/self 表示当前进程目录,前面说了通过 /proc/$pid/ 来获取指定进程的信息,如果某个进程想要获取当前进程的系统信息,就可以通过进程的pid来访问/proc/$pid/目录。但是这个方法还需要获取进程pid,在fork、daemon等情况下pid还可能发生变化

为了更方便的获取本进程的信息,linux提供了 /proc/self/ 目录,这个目录比较独特,不同的进程访问该目录时获得的信息是不同的,内容等价于/proc/本进程pid/,进程可以通过访问 /proc/self/ 目录来获取自己的系统信息,而不用每次都获取pid

有了self目录就方便多了,下面我们演示一下self的常见使用

获取当前启动进程的完整命令:

cat /proc/self/cmdline

获取目标当前进程环境的运行目录

ls -al /proc/self/cwd

获得当前进程的可执行文件的完整路径

ls -al /proc/self/exe

获取当前进程的环境变量信息

cat /proc/self/environ

获取当前进程打开的文件内容

cat /proc/self/fd/{id}

注意:在真正做题的时候,我们是不能通过命令的方式执行通过cat命令读取cmdline的,因为如果是cat读取/proc/self/cmdline的话,得到的是cat进程的信息,所以我们要通过题目的当前进程使用读取文件(如文件包含漏洞,或者SSTI使用file模块读取文件)的方式读取/proc/self/cmdline


应用例题

2020-网鼎杯-白虎组-Web-PicDown(可复现)


参考文章

Linux的proc文件系统详解

Proc 目录在 CTF 中的利用

枚举Linux下的proc文件系统

你可能感兴趣的:(笔记,linux,学习,网络)