使用Linux进程环境变量进行取证

注:下面来自半翻译,半实践

对Linux进程进行取证,可以通过/proc/<PID>/environ来查看某个进程的环境变量,来获取一些信息。

所以说,遇到可疑的进程不要立即杀掉,不然取证都可能无从下手。

背景

当在Linux上启动一个进程时,该进程的许多环境变量将在其运行期间保持不变。那么虽然启动该进程的原始shell已经消失很久,但在有一些shell变量仍然继承下来了。

在进程的环境变量中可以获得什么呢?

  1. history anti-forensics的证据

  2. 二进制文件的命令行和路径

  3. 启动进程的用户

  4. 启动时二进制文件使用的自定义变量,可能包含密钥和其他内容

  5. SSH连接信息:哪个ip启动的

  6. ……

    对于第5点,即使攻击者从日志中清除了他们的IP地址,如果他们通过SSH进入,很有可能他们使用的IP地址仍然留在他们启动的进程中,等待被获取。

模拟实验

模拟攻击

假如我们是攻击者,连上一台机子的ssh

注: HISTSIZE是一个环境变量,用于控制命令历史记录的大小。通过将HISTSIZE设置为0,即export HISTSIZE=0,实际上是告诉操作系统不保存任何命令历史记录。这意味着你运行的每个命令都不会被记录下来,无法通过上下箭头键或history命令访问之前执行的命令。

ssh连上后我们在机子上执行

1
2
3
4
export HISTSIZE=0
export PATH=.:$PATH
cp /bin/nc x
x -lp 6666 &

取证

通过列出正在监听的端口,可以查看到一个x的可疑进程。

1
2
3
4
5
6
7
8
9
10
$ netstat -antp | grep LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 391/rpcbind
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 392/systemd-resolve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 874/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 32334/cupsd
tcp 0 0 0.0.0.0:6666 0.0.0.0:* LISTEN 16343/x
tcp6 0 0 :::111 :::* LISTEN 391/rpcbind
tcp6 0 0 :::80 :::* LISTEN 1050/apache2
tcp6 0 0 :::22 :::* LISTEN 874/sshd
tcp6 0 0 ::1:631 :::* LISTEN 32334/cupsd

查看进程环境变量(我手动将ip用X打码了)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$ strings /proc/16343/environ 
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
LC_MEASUREMENT=zh_CN.UTF-8
SSH_CONNECTION=10.82.X.X 5561 172.16.2.3 22
LESSCLOSE=/usr/bin/lesspipe %s %s
LC_PAPER=zh_CN.UTF-8
LC_MONETARY=zh_CN.UTF-8
LANG=en_US.UTF-8
OLDPWD=/root
S_COLORS=auto
LC_NAME=zh_CN.UTF-8
XDG_SESSION_ID=2246
USER=root
GOPATH=/root/go
QT_QPA_PLATFORMTHEME=appmenu-qt5
PWD=/tmp
HOME=/root
GOROOT=/usr/local/go
SSH_CLIENT=10.82.X.X 5561 22
LC_ADDRESS=zh_CN.UTF-8
LC_NUMERIC=zh_CN.UTF-8
SSH_TTY=/dev/pts/0
MAIL=/var/mail/root
TERM=xterm
SHELL=/bin/bash
SHLVL=1
LC_TELEPHONE=zh_CN.UTF-8
LOGNAME=root
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus
XDG_RUNTIME_DIR=/run/user/0
PATH=.:.:/usr/lib/llvm-11/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin:/root/go/bin
LC_IDENTIFICATION=zh_CN.UTF-8
PS1=\[\e]0;\u@\h: \w\a\]\[\e[34m\]#\[\e[m\] \[\e[37m\]\u\[\e[m\] @ \[\e[36m\]\h\[\e[m\] in \[\e[34m\]\w\[\e[m\] [\t]\n$
HISTSIZE=0
LESSOPEN=| /usr/bin/lesspipe %s
LC_TIME=zh_CN.UTF-8
_=./x

从上面我们可以提取出下面有用的信息

  • HISTSIZE=0,这个说过了,属于反取证的方式

  • SSH_CONNECTION=10.82.X.X 5561 172.16.2.3 22 这个比下面的多了本机的网卡的ip

  • SSH_CLIENT=10.82.X.X 5561 22 这两个就是ssh的信息,10.82.X.X就是攻击者所使用的ip,该ip或许只是攻击者的跳板

  • SHELL=/bin/bash 启动所使用的shell

  • PWD=/tmp 启动时的路径

  • OLDPWD=/root 进入/tmp目录之前的路径

  • USER=root 启动进程的用户

总结

可以看到,在调查进程活动之前,不要草率地终止可疑的进程。在弄清楚进程活动之前就终止进程,会立即丢失许多有用的信息,比如进程环境变量。

参考

https://sandflysecurity.com/blog/using-linux-process-environment-variables-for-live-forensics/

打赏专区