Linux的proc目录
proc被称为虚拟文件系统,它是一个控制中心,可以通过更改其中某些文件改变内核运行状态,
它也是内核提空给我们的查询中心,用户可以通过它查看系统硬件及当前运行的进程信息。
Linux中许多工具的数据来源正是proc目录中的内容,比如lsmod的命令是cat /proc/modules的别名。
/proc目录下常用文件介绍:
- /proc/loadavg 前三列分别保存最近1分钟,5分钟,及15分钟的平均负载。
- /proc/meminfo 当前内存使用信息
- /proc/diskstats 磁盘I/O统计信息列表
- /proc/net/dev 网络流入流出统计信息
- /proc/filesystems 支持的文件系统
- /proc/cpuinfo CPU的详细信息
- /proc/cmdline 启动时传递至内核的启动参数,通常由grub进行传递
- /proc/mounts 系统当前挂在的文件系统
- /proc/uptime 系统运行时间
- /poc/version 当前运行的内核版本号等信息
进程目录下常用文件介绍
-
cmdline,保存了当前进程的启动命令,如果这个进程是
zombie
进程,则这个文件没有任何内容。- 先随便启动一个进程,以haroopad为例:
获取进程号 - 查看proc中相应进程id的cmdline:
- 先随便启动一个进程,以haroopad为例:
-
cwd 执行进程的运行目录,是一个符号链接
-
exe: exe是一个软链接,指向进程的可执行文件,通过它可以启动当前进程的一个拷贝
打开burpsuite:
综合两个看发现exe指向的是启动程序的环境,第一个haroopad是通过dash命令窗口启动,第二个是java环境启动
-
environ: 进程包含的环境变量
-
fd: 包含了进程打开的每一个文件的文件描述符,这些描述符是指向实际文件的符号链接。可以通过它恢复删除的文件
目录中的每一项都是一个符号链接,指向打开的文件,数字则代表文件描述符
-
root :
/proc/[pid]/root
是进程根目录的符号链接。举例如下: -
stack :
/proc/[pid]/stack
显示当前进程的内核调用栈信息,只有内核编译时打开了CONFIG_STACKTRACE
编译选项,才会生成这个文件。举例如下: -
comm:
/proc/[pid]/comm
包含进程的命令名。 -
maps 参考
截取一部分ctfwp ctf
源码读取
那么思路应该是利用文件包含进行文件读取了
但是不能进行目录穿越,于是得先知道绝对路径,这里想到之前HCTF的方法:
1 | http://107.167.188.241/static?file=/proc/self/environ |
发现500了,应该是没有权限,换个思路
1 | http://107.167.188.241/static?file=/proc/self/maps |
1 | if filename != '/home/ctf/web/app/static/test.js' and filename.find('/home/ctf/web/app') != -1: |
我们没有办法使用这个绝对路径,尝试了一下bypass,例如
1 | /home/ctf/web_assli3fasdf/././././app |
发现也不行,出题人说用了abspath
看来只能想想有没有其他途径读取文件,这里想到如下方法
我们知道
1 | /proc/[pid]/cwd是进程当前工作目录的符号链接 |
既然之前的路径无法用,那么我们可以考虑从proc进行读取,如下:
1 | http://107.167.188.241/static?file=/proc/self/cwd/app/__init__.py |