电子数据取证

一、 取证工具:

火眼证据分析、火眼仿真、取证大师

二、基础知识

Linux取证

目录说明
/bin					用所有用户使用的基本命令,cd、ls等保存在该目录下
/boot 				系统引导核心和配置文件等
/etc					系统和应用程序的配置文件,例如:/etc/passwd 保存的是用户信息
/dev				  包含所有的系统设备文件
/home			    普通用户的个人文件,每个用户有一个目录,用户在自己的目录里具有完整的权限
/lib 					存放系统最基本的共享链接和内核模块
/mnt				  用于挂载文件系统的地方
/root				  系统超级用户的主目录
/sbin				  供超级用户使用的指令,多是系统管理指令,如fsck、reboot
/tmp				  保存临时文件,所有用户可以在这里创建、编辑文件,但只有文件拥有者才能删除文件
/usr					静态的用户级应用程序
/var					动态的程序数据,目录中包括了一些数据文件,如系统日志等
/lost+found		意外丢失的文件
/proc				  存放于内存中的虚拟文件系统,开机情况下才有,里面保存了内核和进程的状态信息
常用命令
uname -a							     查看内核/操作系统/CPU信息
cat /etc/issue					   查看系统操作版本
cat /proc/version			     查看内核版本
cat /proc/cpuinfo			     查看CPU信息
hostname 						       查看计算机名
lspci									     列出所有PCI设备
lsusb									     列出所有usb设备
lsmod								       列出加载的内核模块
env									       查看环境变量
cat /proc/meminfo			     查看内存和交换区情况
df -h									     查看各分区使用情况 
du -sh <目录名>				     查看指定目录的大小				  
uptime 								     查看系统运行时间、用户数、负载
mount | column -t		       查看挂载点的情况
fdisk -l								    查看指定设备的分区情况
swapon -s							      查看所有交换分区
dmesg								        显示系统启动的过程信息
ifconfig								    查看所有网络接口的属性
iptables -L							    查看防火墙设置
route -n								    查看路由表信息
netstat -anptl					    查看所有监听端口和建立的连接
netstat -s							    查看网络统计信息
ps -ef									    查看所有进程							
top										      实时显示进程状态
w											      查看当前登陆的活动用户
id <用户名>						      查看指定用户的信息
last 									      查看系统登录日志
last -f <文件名>             查看指定系统登录日志(wtmp、btmp)
cut -d: -f1 /etc/passwd	    查看系统所有用户
cut -d: -f1 /etc/group	    查看系统所有组
crontab -l							     查看当前用户的计划任务
service  -status-all				 列出所有系统服务
grep										-c 	 只输出匹配行数
  											-i	 匹配时不区分大小写
  											-n	 显示匹配行和行号
 												-s	 不显示不存在或无匹配文本的错误信息
												-v	 显示不包含匹配文本的所有行
												-o	 只显示正则匹配的文本
  											-r	 递归查找所有子目录内容
history 									查看历史操作
取证实战
基本信息获取
系统信息

​ 系统版本信息

uname -a  系统内核版本
lsb_version -a 若command not found 则须 yum install redhat-lsb -y
cat /proc/version   查看内核版本
查看操作系统版本:
对于debian及其衍生版 head -n 1 /etc/issue   cat /etc/issue  cat /etc/issue.net cat /etc/lsb-release  cat /etc/os-release
对于CentOS cat /etc/centos-release 
对于Fedora cat/etc/fedora-release

​ 用户和组信息

cut -d: -f1 /etc/passwd   查看用户信息
cut -d: -f1 /etc/group    查看用户组信息

网络信息

ip a show 		网络接口信息
ip route 			路由信息
ss -tanp 			端口信息
iptables -L 	防火墙信息

​ 分区信息

fdisk -l		列出所有的分区
cat /etc/fstab 查看分区文件系统
df -T 查看所有已挂载分区文件系统
mountgrep "^/dev"

查看文件系统

系统运行状态

​ 任务计划

cat /etc/crontab //查看系统任务计划
/var/spool/cron/USERNAME //用户任务计划

​ 进程信息

ps aux 
//a 与终端相关的进程
u 以用户为中心组织进程状态信息显示
x 与终端无关的进程
ps -ef //e 显示所有进程  f显示完整格式程序信息
ps -eFH //F显示完整格式的进行信息 H以进程层级格式显示进程相关信息
top 动态显示正在运行的进程

​ 服务信息

systemctl list-units --type=service //显示所有已启动的服务    
systemctl list-units -t service -a //所有开启和关闭的
systemctl list-unit-files -t service -a //服务状态,是否开机启动,static:开机不启动,但是可以被另一个服务激活
/usr/lib/systemd/system //服务目录
service --status-all
日志分析

日志的主要用途是系统审计、监测追踪和分析统计。

UNIX/ Linux采用了syslog工具来进行日志记录,所有在主机上发生的事情都会被记录下来不管是好的还是坏的。

syslog:Linux 内核由很多子系统组成包括网络、文件访问、内存管理等。

子系统需要给用户传送一些消息这些消息内容包括消息的来源及其重要性等。所有的子系统都要把消息送到一个可以维护的公用消息区于是就有了 syslog

syslog 是一个综合的日志记录系统

它的主要功能:方便日志管理和分类存放日志。

syslog 配置文件:/etc/syslog.conf

三类日志:

系统接入日志:

根据该日志跟踪到谁在何时登录到系统

/var/log/wtmp和/var/run/utmp //telnet、ssh等程序会更新wtmp和utmp文件

进程统计日志:分析系统使用者对系统进行的配置以及对文件进行的操作

pacct或acct
常用指令:
1) ac [参数] 按要求统计帐号总连接时间, 不加参数则统计连接时间总和
ac常用参数
       ac     [ -d | --daily-totals ] [ -y | --print-year ]
              [ -p | --individual-totals ] [ people ]
 
2) lastcomm [参数] 可以看到由近到远帐号执行命令内容,时间点,终端,消耗的CPU时钟. 不带参数时你还可以看到系统服务执行的命令。使用管道执行的命令每个命令都会占用一行。
lastcomm常用参数:
       lastcomm
              [ command-name ...  ]
              [ user-name ...  ]
              [ terminal-name ...  ]
 
3) accton 打开/关闭统计
 
4) sa  以命令为单位报告系统资源消耗量.

错误日志:

/var/log/messages

常用日志文件:

/var/log/boot.log //该文件记录了系统在引导过程中发生的事件就是Linux系统开机自检过程显示的信息。
/var/log/cron //该日志文件记录crontab守护进程crond所派生的子进程的动作,前面加上用户、登录时间和PID以及派生出的进程的动作.
/var/log/maillog //该日志文件记录了每一个发送到系统或从系统发出的电子邮件的活动。它可以用来查看用户使用哪个系统发送工具或把数据发送到哪个系统
/var/log/messages //该日志文件是许多进程日志文件的汇总
/var/log/syslog //RHEL/Centos默认不开启,需要配置,它和/etc/log/messages日志文件不同它只记录警告信息,
该日志文件能记录当用户登录时login记录下的错误口令、Sendmail的问题、su命令执行失败等信息。
/var/log/secure //记录与安全相关的信息,主要是一些和认证、权限使用相关的信息。其是sshd会将所有信息记录[其中包括失败登录]在这里信息
  
/var/log/lastlog //记录最近成功登录的事件和最后一次不成功的登录事件,只能root执行
/var/log/wtmp //永久记录每个用户登录、注销及系统的启动、停机的事件,该日志文件可以用来查看用户的登录记录,last命令就通过访问这个文件获得这些信息
/var/run/utmp //该日志文件记录有关当前登录的每个用户的信息, who、w、users、finger 访问此文件 ,随着用户登录和注销系统而不断变化,它只保留当时联机的用户记录不会为用户保留永久的记录
//以上提及的3个文件/var/log/wtmp、/var/run/utmp、/var/log/lastlog是日志子系统的关键文件,都记录了用户登录的情况。这些文件的所有记录都包含了时间戳。这些文件是按二进制保存。不能用less、cat之类的命令直接查看这些文件,而是需要使用相关命令通过这些文件而查看

每次有一个用户登录时login程序在文件lastlog中查看用户的UID。
如果存在则把用户上次登录、注销时间和主机名写到标准输出中,
然后login程序在lastlog中记录新的登录时间打开utmp文件并插入用户的utmp记录。
该记录一直用到用户登录退出时删除。utmp文件被各种命令使用包括who、w、users和finger。

下一步login程序打开文件wtmp附加用户的utmp记录。当用户登录退出时具有更新时间戳的同一utmp记录附加到文件中。

wtmp文件被程序last使用。

查看日志文件:

绝大多数是文本文件, cat、tac、more、less、tailgrep进行查看

日志文件的格式:以 /var/log/messages 为例

该文件中每一行表示一个消息而且都由四个域的固定格式组成

时间戳:Timestamp 表示消息发出的日期和时间。

主机名:Hostname 表示生成消息的主机名

生成消息的子系统名称:“Kernel”表示消息来自内核

消息:Message :具体的消息内容

Dec 16 03:32:41 cnetos5 syslogd 1.4.1: restart. // syslog 发出的消息说明了守护进程已经在 xxx 重新启动了

查看非文本格式日志文件:

lastlog :使用 lastlog 命令来检查某特定用户上次登录的时间并格式化输出上次登录日志 /var/log/lastlog 的内容
last:搜索 /var/log/wtmp 来显示自从文件第一次创建以来登录过的用户
lastb:命令搜索 /var/log/btmp 来显示登录未成功的信息
who:查询 utmp 文件并报告当前登录的每个用户 
 who /var/log/wtmp //查询历史登录用户

登录日志

二进制日志文件:

1、最近一次日志
/var/log/lastlog lastlog //最近一次用户登录的时间记录
2、用户登录日志
/var/log/wtmp
[root@localhost ~]# last 
- 或
[root@localhost ~]# last -f <filename> # 指定输入文件
 last -u 用户名显示用户上次登录的情况
 last -t 天数显示指定天数之前的用户登录情况。

系统日志

应用日志

apache日志:

/var/log/httpd/access.log  #[Apache服务器的客户系统访问记录]
/var/log/httpd/error.log #[Apache服务器的所有出错记录]

cups 打印日志:CUPS [ Common Unix Printing System ] 通用UNIX打印系统

/var/log/cups/access_log # 访问日志文件,其中记录了打印机的设置情况,提交的打印作业,以及打印作业的状态记录等信息
/var/log/cups/error_log # 默认的日志文件,存储各种错误信息

Samba 服务器日志

> [目录] /var/log/samba
[root@localhost ~]# ls /var/log/samba
> log.smbd # 其中包含Samba服务器启动以及SMB/CIFS文件与打印共享方面的信息
> log.nmbd # 其中包含基于IP协议的NETBIOS网络通信方面的信息
> log.sysname # 用于记录特定客户系统的服务请求信息,文件名中的sysname是客户系统的主机名,如 log.winxp
LVM逻辑卷
LVM的工作原理

LVM(Logical Volume Manager)逻辑卷管理,是在硬盘分区和文件系统之间添加的一个逻辑层,为文件系统屏蔽下层硬盘分区布局,并提供一个抽象的盘卷,在盘卷上建立文件系统。管理员利用LVM可以在硬盘不用重新分区的情况下动态调整文件系统的大小,并且利用LVM管理的文件系统可以跨越物理硬盘。当服务器添加了新的硬盘后,管理员不必将原有的文件移动到新的硬盘上,而是通过LVM直接扩展文件系统来跨越物理硬盘。

LVM就是通过将底层的物理硬盘封装,然后以逻辑卷的方式呈现给上层应用。当我们对底层的物理硬盘进行操作时,不再是针对分区进行操作,而是通过逻辑卷对底层硬盘进行管理操作。

基础术语

物理存储介质(The physical media):LVM存储介质,可以是硬盘分区、整个硬盘、raid阵列或SAN硬盘。设备必须初始化为LVM物理卷,才能与LVM结合使用。

物理卷PV(physical volume):物理卷就是LVM的基本存储逻辑块,但和基本的物理存储介质比较却包含与LVM相关的管理参数,创建物理卷可以用硬盘分区,也可以用硬盘本身。

卷组VG(Volume Group):LVM卷组类似于非LVM系统中的物理硬盘,一个卷组VG由一个或多个物理卷PV组成。可以在卷组VG上建立逻辑卷LV。

逻辑卷LV(logical volume):类似于非LVM系统中的硬盘分区,逻辑卷LV建立在卷组VG之上。在逻辑卷LV之上建立文件系统。

物理块PE(physical Extent):物理卷PV中可以分配的最小存储单元,PE的大小可以指定,默认为4MB

逻辑块LE(Logical Extent):逻辑卷LV中可以分配的最小存储单元,在同一卷组VG中LE的大小和PE是相同的,并且一一相对。

现在常用的有LVMLVM2

​ 总结:多个磁盘/分区/raid–>多个物理卷PV–>合成卷组VG–>从VG划分出逻辑卷LV–>格式化LV,挂载使用。

查看文件或文件夹的权限

使用 ls -l filename 命令查看文件的权限,例如:

-rw-r–r-- 1 root root 298 Sep 30 21:31 os-release

  • 第一个字符 - 代表这是一个文件,d表示目录(即文件夹,在Linux内,文件夹也是一种特殊的文件),l表示链接
  • 接下来三个字符rw- 表示文件的所有者对该文件可读(r,read)可写(w,write)但不可运行(x)
  • 之后三个字符r-- 表示文件所有者所在的用户组 的其他用户们 对该文件可读,不可写,不可运行
  • 最后三个r-- 表示其他用户对该文件可读,不可写,不可运行
  • 数字1表示链接的文件数(与l类型的文件有关)
  • 之后的root 表示为文件所属的用户
  • 第二个root 表示为文件所属的用户(即root用户)所在的用户组为root用户组
  • Sep 30 21:31 表示文件最后的更改日期
  • os-release 为文件名

修改文件或文件夹的权限

1、使用数字表示

例如:rw-r–r–,以二进制表示为110,100,100,即644

chmod 644 os-release

例如 rwxrw-r–,以二进制表示为111,110,100,即764

chmod 764 os-release

2、使用字母表示

chmod u+x os-release

表示给文件所属的用户(u)增加(+)运行(x)权限;

chmod g-wx os-release

表示给文件所属用户的用户组(g)去除(-)写权限(w)和运行权限(x)

chmod o+wx os-release

表示给文件所属用户用户组之外的用户(o)增加(+)写权限(w)和运行权限(x)

chmod a+r os-release

表示给所有用户(a)增加读(r)权限

3、改变文件所有者

chown命令(change owner)

chown user1 os-release 将os-release文件所有者改为user1

chgrp命令(change group)

chgrp basic—user os-release 将os-release文件所属用户组改为basic-user

重要文件

1、 /etc/passwd 保存了用户数据库,其中包括用户名、加密过的密码等

2、/etc/group 保存了用户组的信息

3、/etc/issue 默认是发行版信息,实际上,文件里的内容用来显示在每次登录系统后终端显示的欢迎文字

4、/var/log 保存了许多程序的日志文件,例如登录日志

5、/sys/class/net 存储了各个网卡信息,例如eth0 文件夹内的address 文件记录了eth0 网卡的MAC 地址

6、/etc/timezone 时区信息:Asia/Shanghai

7、/etc/system-release 发行版信息:CentOS Linux release 7.3.1611 (Core)

8、/etc/locale.conf 系统使用语言:LANG=en_US.UTF-8

9、/etc/hostname 主机名称

10、/etc/motd 登录欢迎语:Welcome to Alibaba Cloud Elastic Compute Service !

11、/etc/resolv.conf 使用的DNS 地址

查看文件系统

当前的Linux 正在使用什么文件系统,可以在 /etc/fstab 文件中查看,通常为ext4

NTP时间同步

NTP 服务使用UDP123 端口与NTP服务器通信,更新系统时间,ntp 服务器配置保存在/etc/ntp.conf 文件中

Docker取证

我们可以把Docker 当作多功能沙盒,可以将需要的软件放在一个容器内运行,而不干扰容器外的系统。例如,在两个个容器内分别运行nginx服务器,容器一对外开放端口10801,容器二对外开放端口10802,这样,在同一台主机内,两个web服务器就可以同时互不干扰地运行。

区分两个概念:

  1. Docker镜像image

  2. Docker容器container

    我们可以从Docker Hub上下载各种images,例如nginx、mysql、ubuntu等,也可以将自己的软件运行环境打包成一个image,使用image新建一个container

Docker入门

例如:

查阅Docker Hub内的官方MySQL 文档,首先下载MySQL镜像

docker pull mysql

如果要指定某个版本的MySQL,在mysql后加冒号指定版本,例如:

docker pull mysql:8.0.10

不指定版本则默认为latest(最新版)

等待下载完成,下载完成后查看目前已经下载好的images:

docker images

确认镜像已经下载成功,接下来使用这个镜像新建一个容器:

docker run --name first_mysql_container -p 23306:3306 -e MYSQL_ROOT_PASSWORD=yourpassword -d mysql

其中的命令和参数分别为:

  • run:docker操作,用来新建容器;
  • –name first_mysql_container:给容器命名,可选;
  • -p 23306:3306:端口映射,将容器内的3306端口映射到主机的23306端口
  • -e MYSQL_ROOT_PASSWORD=yourpassword:设置MySQL root密码
  • -d :容器创建后将会在后台运行,命令执行后返回一个container id
  • mysql:使用mysql镜像,如果要指定版本,则写为 mysql:tag

使用命令 docker ps 来查看已经创建的容器,Docker会显示以下详情:

  • CONTAINER ID :唯一的容器id,对应每一个单独的容器
  • IMAGE:这个容器是使用什么镜像创建的
  • COMMAND
  • CREATED: 容器创建的时间
  • STATUS:容器已经运行了或者停止了多长时间
  • PORTS:端口映射情况
  • NAMES:容器的名字

创建好容器之后,进入容器,亲手操作mysql:

docker exec -it first_mysql_container /bin/bash
  • exec:docker命令,在运行的容器中执行命令
  • -it:我一般都加上这两个参数
  • first_mysql_container:容器名字,此处填容器ID亦可
  • bash:在这个容器内运行bash

之后输入 mysql -u root -p 即可使用MySQL

查看正在运行中的docker容器:

docker ps

查看docker容器的详细信息:

docker inspect id
Docker 的配置目录与文件分析

1、如果系统还可以仿真运行,docker服务可以启动,使用一下命令:

docker version 查询docker client 和server 版本,

docker info 可以详细调查正在运行、暂停或停止的container数量,是否使用了docker集群需要的swarm网络模式,docker镜像源地址等

docker sespect ImageID 查询某个镜像的详细信息

2、如果系统不能仿真,或是仿真之后无法启动docker服务,应该首先考虑修复系统丢失的文件或进行合理配置,恢复docker服务。

3、如果只能从硬盘分析入手,则考虑一下方法:

  • 要确定Docker Server的版本,可以查找apt 包管理程序的日志:/var/log/apt/term.log
  • 查看已经下载了哪些镜像,检查 /var/lib/docker/image/overlay2/repositories.json 文件

* 需要注意的是,docker image 使用OverlayFS 分层存储在/var/lib/docker/overlay2,不好区分

  • 查看container的详细信息,在/var/lib/docker/containers找到对应containerID 的文件夹,查看config.v2.json 中的内容,其中包含:当前容器是否在运行、暂停或者停止,容器运行的虚拟主机名称Hostname,在容器内使用的端口ExposedPorts,容器内的环境变量Env,容器所使用的镜像ID,容器映射的端口Network Settings.Ports 等等
OpenSSH

使用SSH 来远程连接Linux 主机。

被连接的主机:安装SSH server

进行连接的主机:安装SSH client

查看SSH 连接日志、SSH config 文件可以检索到曾经连接过这台主机的客户机IP地址。

常见的几个文件:

文件名说明
/var/log/secure日志文件,记录登录历史记录
~/.ssh/configssh 配置文件,用来进行快速密钥认证登录,其中可能记录了私钥
~/.ssh/authorized_keys记录公钥

密钥认证基本流程:

使用ssh-keygen 命令生成一对密钥,私钥放在主机A 的config 文件里(当然需要编辑host等字段),公钥放在主机B 的authorized_keys 内,主机A 则可以无需密码通过SSH 连接主机B。

参考:

1、Docker文件目录 - 简书

2、mysql - Docker Hub

3、李鹏超, 周凯. 基于Docker容器的电子数据取证方法[J]. 吉林大学学报(理学版), 2019, 57(06): 1485-1490.

数据库

cat /root/.dbshell查看数据库操作

mysql数据库

除了使用容器运行数据库外,MySQL 还可以直接安装在主机上,直接在Linux 文件目录中留下痕迹。

数据库取证一般遵循以下步骤:

1、系统镜像可以仿真,并且能够直接使用MySQL 进行交互的,考虑去除root 用户密码,使用SQL语句检查整个数据库的内容

2、系统无法仿真的,或者仿真之后无法运行MySQL 的,考虑在不损坏或者已备份MySQL相关目录的前提下,修复运行环境,运行MySQL

3、系统无法仿真或者MySQL 文件目录不完整,单独排查MySQL 配置和数据目录中的文件

  • 确定MySQL 数据文件的存放路径: 搜索ibdata1 文件:

    find / -name ibdata1

  • 确定MySQL 版本:用16进制编辑器打开任意一个.frm 文件,检查0x34 和0x33 的位置,例如0x34 为0xC6,0x33 为0x29 ,则MySQL 版本为0xC629,即5.07.29

  • 复制整个MySQL 数据目录,删除ib_logfile 文件,转移到新安装的MySQL 环境中,检索其中的数据

  • 跳过root 密码:在 /etc/mysql/mysql.conf.d/mysqld.cnf 文件中[mysqld] 下添加 skip-grant-tables

  • 重启MySQL 服务,使用root 登录

mongo数据库

mongostore -u -p --authenticationdatabase==admin -d --archive

文件服务器(FTP,SMB,NAS)

磁盘阵列参考:

FTP

可以在CentOS 或Ubuntu 使用vsftpd 配置FTP 服务。FTP服务使用TCP 21端口验证身份信息,使用TCP 20端口传输数据。

  • /etc/vsftpd/vsftpd.conf vsftpd 的核心配置文件
  • /etc/vsftpd/ftpusers 黑名单文件,此文件里的用户不允许访问 FTP 服务器
  • /etc/vsftpd/user_list 白名单文件,此文件里的用户允许访问 FTP 服务器
  • /etc/vsftpd.chroot_list 允许访问FTP 服务器的用户列表

** 配置文件也可能直接存放在/etc 目录下

vsftpd.conf 配置文件中的相关设置有:

配置变量配置说明
local_root登录FTP 服务器后所在目录
xferlog_enableYes: 启用日志
pasv_address服务器所在IP地址

vsftp的日志文件保存在 /var/log/vsftpd.log,其中包含的信息有尝试登录此FTP 服务器的IP地址等

Samba

Samba 是使用SMB 协议的一款软件。SMB 协议用来在Linux 与Windows 系统之间无痛共享存储与打印机

NAS

NAS 通常用来将大容量磁盘挂载在网络上,形成网络存储。在电子取证领域,时常需要分析大容量磁盘,但其实NAS 本身的配置等内容不常出现。

NAS 本身不代表任何协议,它可以使用FTP,Samba,甚至HTTP 等协议传送文件。

//TODO: 考虑是否有补充的必要

防火墙(iptables)

//TODO

RAID重组
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐