0x00 前 言
在Linux系统中,进程的环境变量是一些用来传递配置信息的键值对。当一个进程被创建,会继承其父进程的所有环境变量(如下所示)。操作系统通过/proc/[pid]/environ
文件向用户态提供查看进程环境变量的途径,该文件内容由一个个键值对构成,并以空字节(�
)分隔。
部分攻击手段会在登录终端后设置临时环境变量,在执行完恶意进程后,终端进程退出,临时环境变量即被清除。那么去检查像.bashrc
/etc/profile
文件等并不能发现异常配置,因为上述的环境变量是临时的,并不会持久化。所以在应急响应过程中,进程的环境变量也是一个必需的检查项。
笔者通过本文和各位读者分享Linux应急响应过程中进程环境变量的妙用,希望对各位有所帮助。
0x01 正 文
校验数据来源的正确性
上文提到环境变量的数据来源为/proc/pid/envrion
文件,正常情况下,这个文件的格式是非常固定的:n*(key=value'�')
,如果不满足这个格式,那么进程的环境变量大概率被篡改过。篡改环境变量的行为并不能直接判定该进程为恶意进程,因为很多正常的进程也会出现此情况,这个在之前Linux进程伪装系列的三篇文章中有提到过,此处不再赘述。
如果说进程的环境变量格式正常,那么我们可以通过tr命令将空字节替换为换行符,以可读性较高的形式去阅读进程的环境变量。
分析关键环境变量
获取到环境变量信息之后,应当关注哪些环境变量的值呢?笔者通常关注如下环境变量:
环境变量 |
含义 |
USER/LOGNAME |
进程运行时登录的用户,两个值应该是相同的 |
SSH_CLIENT |
进程是用户通过ssh登录终端后创建的,信息中包含了登录IP地址 |
SSH_CONNECTION |
同SSH_CLIENT,但信息中多了本机IP |
PWD |
进程创建时所处目录 |
OLDPWD |
进程创建前从OLDPWD切换到PWD |
HISCONTROL |
如果值包含ignorespace,则代表如果执行的命令以空格开始,则不记录到历史记录中 |
HISTSIZE |
如果值为0,则代表不会记录历史命令,可能是攻击者所为 |
HISTFILESIZE |
同上 |
HISTFILE |
如果值为/dev/null等异常文件,则代表不会记录历史命令,可能是攻击者所为 |
HISTIGNORE |
忽略特定命令,如果为*,则忽略所有 |
还有一个环境变量传递的信息并不直接,但是笔者认为也有一定的参考价值,可以辅助推测进程行为。SHLVL
是一个表示shell嵌套级别的环境变量,每当启动一个新的shell,当前的SHLVL
就会+1。默认情况下SHLVL
初始值为1,但是也不绝对,例如ubuntu16.10的默认值为2。
如果一个进程存在SHLVL
的环境变量,首先说明该进程创建过shell。如果值等于默认值,则说明只调用过1次;但是如果超过默认值,也就是说存在嵌套创建shell的情况,从攻击手段的角度来讲,笔者会优先考虑进程本身或进程创建前是否存在提权行为。
原文始发于微信公众号(风奕安全):Linux应急响应:进程环境变量的妙用
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论