在做SSTI模板注入的CTF题中,发现有师傅提到可以用/proc/self
这个目录获取flag,所以也来学习一波主要参考.
(我才知道😁😁😁)可以通过/proc/$pid/
来获取指定进程的信息,例如内存映射、CPU绑定信息等。详细来说,如果某个进程想获取本进程的系统信息,就可以通过进程的pid
编号来访问/proc/$pid/
目录,但是这个方法不仅需要获取进程的pid编号,且在fork、daemon等情况下pid还会变化(属实有点太懂,fork是创建进程,daemon是守护进程,合起来就不知道具体啥情况了,哈哈😅😅😅)。为了更加方便的获取本进程的信息,linux提供了/proc/self/
目录,在这个目录下,不同的进程访问该目录获取的信息是不同的,内容等价于/proc/$pid/
。
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
,该目录下仍然存在被删除的文件的文件描述符,通过这个文件描述符我们可以得到被删除的文件的内容。
获取启动当前进程的完成命令: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}