文章目录
- /proc目录
- /proc/self的使用
 
在做SSTI模板注入的CTF题中,发现有师傅提到可以用/proc/self这个目录获取flag,所以也来学习一波主要参考.
(我才知道😁😁😁)可以通过/proc/$pid/来获取指定进程的信息,例如内存映射、CPU绑定信息等。详细来说,如果某个进程想获取本进程的系统信息,就可以通过进程的pid编号来访问/proc/$pid/目录,但是这个方法不仅需要获取进程的pid编号,且在fork、daemon等情况下pid还会变化(属实有点太懂,fork是创建进程,daemon是守护进程,合起来就不知道具体啥情况了,哈哈😅😅😅)。为了更加方便的获取本进程的信息,linux提供了/proc/self/目录,在这个目录下,不同的进程访问该目录获取的信息是不同的,内容等价于/proc/$pid/。
/proc目录
proc文件系统是一个伪文件系统,它的存在是为了在运行时访问内核内部数据结构、改变内核设置的机制,它只存在于内存中,不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。
在该目录下除了/proc/self/目录,还有一些以数字命令的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc目录下,以进程的pid号为目录名,它们是读取进程信息的接口。self目录则是读取进程本身的信息接口,是一个link。
 
 /proc目录中是一些与进程有关的目录,再下一级目录/proc/具体pid中是其进程本身相关的文件。下面简要介绍/proc/100目录下的常见文件夹和文件,其中有些文件是每个进程都会具有的:
 
-  cmdline 
 cmdline文件存储启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息,可以通过查看cmdline目录获取启动指定进程的完整命令:cat /proc/1303/cmdline
  
-  cwd 
 cwd文件是一个指向当前进程运行目录的符号链接,可以通过查看cwd文件获取指定进程环境的运行目录。
  
 可见PID为1303的进程的运行目录为/home/kali,然后我们可以查看该运行目录。
-  exe 
 exe是一个指向启动当前进程的可执行文件(完整路径)的符号链接,通过exe文件,我们可以获取指定进程的可执行文件的完整路径。
  
-  environ 
 environ文件存储着当前进程的环境变量列表,彼此见使用空字符(NULL)分隔,变量用大写字母表示,其值用小写字母表示。可以通过environ目录来获取指定进程的环境变量信息:cat /proc/1303/environ
  
-  fd(*) 
 fd目录里面包含当前进程打开的每一个文件的描述符,这些文件描述符是指向实际文件的一个符号链接,即每个通过这个进程打开的文件都会显示在这里。所以我们可以通过fd目录的文件知道该进程打开的文件路径和文件内容
  
 查看指定进程打开的某个文件的内容,cat /proc/1303/fd/3
  
 fd这个文件目录比较重要,在linux系统中,如果一个程序open()打开了一个文件,但是始终没有关闭它,即使从外部(如os.remove(file_path))删除该文件后,访问/proc/self/fd,该目录下仍然存在被删除的文件的文件描述符,通过这个文件描述符我们可以得到被删除的文件的内容。
/proc/self的使用
-  获取启动当前进程的完成命令: cat /proc/self/cmdline
  
-  获取目标当前进程的运行目录: ls al /proc/self/cwd;获取目标当前进程的运行目录里的文件:ls /proc/self/cwd
  
  当不知道目标网站的Web路径或者 当前路径时,经常用这招。 
-  获得当前进程的可执行文件的完整路径: ls -al /proc/self/exe
  这里应该是 ls命令的地址
-  获取当前环境变量: cat /proc/self/environ
  
-  获取当前进程打开的文件内容: cat /proc/self/fd/{id}