Linux Electronic Forensics Learning Handbook


Linux Electronic Forensics Learning Handbook

声明

 Author:Qftm
 Data:2020/03/10
 Blog:https://qftm.github.io/

正文

This Handbook:记录 Linux 电子取证的一些知识、慢慢完善 + ing

Table of Contents

Linux 文件取证艺术

You know it ? ? ?

 → Qftm ← :~# rm -rf /
 or
 → Qftm ← :~# rm -rf /*

Linux Inode

Inode

Linux 文件系统的最基本单元:inodeinode 译成中文就是索引节点,每个存储设备(例如硬盘)或存储设备的分区被格式化为文件系统后,应该有两部份,一部份是inode,另一部份是block,block 是用来存储数据用的。而 inode 呢,就是用来存储这些数据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。inode 为每个文件进行信息索引,所以就有了 inode 的数值。

linux 操作系统下可以使用 ls –id命令来查看文件或者目录的 inode 值。

image-20200310152033787

Inode内容

(1)inode包含文件的元信息,具体来说有以下内容

  • 文件的字节数

  • 文件拥有者的User ID

  • 文件的Group ID

  • 文件的读、写、执行权限

  • 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。

  • 链接数,即有多少文件名指向这个inode(一般是指硬链接,因为软链接指向的是连接的文件)

  • 文件数据block的位置

(2)可以用stat命令,查看某个文件的inode信息

stat filename

image-20200310151804513

PS:除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,是因为,文件名和其节点会存放在相应的目录块里面。

Inode大小

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。

每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。

df -i

image-20200310152712387

查看每个inode节点的大小,可以用如下命令:

dumpe2fs -h /dev/sdb1 | grep "Inode size"  

image-20200310152919399

由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。

目录文件

Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。

目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。

ls命令只列出目录文件中的所有文件名

ls -i命令列出整个目录文件,即文件名和inode号码

image-20200310153216666

硬链接

一般情况下,文件名和inode号码是”一一对应”关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。

这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为”硬链接”(hard link)。

ln命令可以创建硬链接:

ln 源文件 目标文件

image-20200310153603911

运行上面条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做”链接数”,记录指向该inode的文件名总数,这时就会增加1。

image-20200310153657837

反过来,删除一个文件名,就会使得inode节点中的”链接数”减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。

image-20200310153754818

这里顺便说一下目录文件的”链接数”。

创建目录时,默认会生成两个目录项:”.”和”..”。前者的inode号码就是当前目录的inode号码,等同于当前目录的”硬链接”;后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的”硬链接”。所以,任何一个目录的”硬链接”总数,总是等于2加上它的子目录总数(含隐藏目录)。

软链接

除了硬链接以外,还有一种特殊情况。

文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的”软链接”(soft link)或者”符号链接(symbolic link)。

这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:”No such file or directory”。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode”链接数”不会因此发生变化。

ln -s命令可以创建软链接:

ln -s 源文文件或目录 目标文件或目录  

image-20200310154047013

查看file1.txt链接数

image-20200310154208656

查看file2.txt信息

image-20200310154237038

文件恢复

数据恢复

在Linux文件系统中,每个文件都是通过 inode 来描述其数据存放的具体位置,当文件被删除以后,文件的inode会被标记为删除,但是文件的数据块还在,这个时候还可以将删除的文件恢复,但是,如果在你删除文件之后没有将相应的设备卸载或者只读挂载,同时进行反复的磁盘读写操作,这样以前被删除的文件数据块很有可能被覆盖,导致删除文件无法恢复。

在电子取证当中首先做的就是尽可能少的对取证对象进行操作,一般以只读的方式对内存数据和磁盘数据进行镜像克隆,然后在镜像上进行取证分析。

对取证镜像进行数据恢复时要以只读的方式或者卸载设备的方式进行数据的恢复,以免因操纵不当覆盖了原始数据块,导致原始数据无法恢复的损失。

常用工具

常见的数据恢复软件有:

debugfs
extundelete
PhotoRec
EasyRecovery
PC3000
FinalData
FixRAR
、、、、

这里主要介绍一下这几个工具:debugfsextundeletePhotoRec

环境准备

操作系统:Kali Linux

image-20200310162315917

操作设备:1G sdbsdb1->ext2sdb2->ext3sdb3->ext4

image-20200310162410587

操作软件:debugfsextundeletePhotoRec

使用debugfs恢复文件

Linux下自带debugfs,支持处理ext2的文件系统格式,对于现在的ext3/4文件系统格式不能恢复成功,但仍然可以查看inode等信息。

  • 操作分区sdb1

image-20200310162945491

  • 在分区sdb1中制造删除文件的动作

image-20200310163635709

  • 查看被删除的文件

删除数据之后,首先卸载这块磁盘分区或者挂载为只读,以防止磁盘重新读写。

cd ~
umount /dev/sdb1
或者
mount -r -n -o remount /media/root/fe20b1ad-3acb-4ceb-80c3-32a1e6c93c15/

使用debugfs 打开设备

image-20200310163824063

用ls 加-d参数显示刚刚删除文件所在的目录

image-20200310163901198

尝试进入HidHack1目录查看:

debugfs: ls -d HidHack1

image-20200310163942048

显示有<>尖括号(被删除的文件)的就是我们要找的文件Inode 号,使用logdump -i <inode>,查看inode详细信息

image-20200310164118101

记下block=74、offset=256等关键信息,然后退出debugfs(按q退出)

  • 使用dd进行文件恢复
dd if=/dev/sdb1 of=/tmp/ReQftm1.txt bs=384 count=1 skip=122883

bs值为offset、skip值为block

image-20200310164357998

使用extundelete恢复文件

extundelete 是一个开源的数据恢复工具,支持 ext3、ext4 文件系统。

  • 安装extundelete
apt-get install extundelete

image-20200310164729608

  • extundelete用法

用法

extundelete [options] [action] device-file

参数

其中参数(options)有:
--version, -[vV],显示软件版本号。
--help,显示软件帮助信息。
--superblock,显示超级块信息。
--journal,显示日志信息。
--after dtime,时间参数,表示在某段时间之后被删的文件或目录。
--before dtime,时间参数,表示在某段时间之前被删的文件或目录。

动作(action)有:
--inode ino,显示节点“ino”的信息。
--block blk,显示数据块“blk”的信息。
--restore-inode ino[,ino,...],恢复命令参数,表示恢复节点“ino”的文件,恢复的文件会自动放在当前目录下的RESTORED_FILES文件夹中,使用节点编号作为扩展名。
--restore-file 'path',恢复命令参数,表示将恢复指定路径的文件,并把恢复的文件放在当前目录下的RECOVERED_FILES目录中。
--restore-files 'path' ,恢复命令参数,表示将恢复在路径中已列出的所有文件。
--restore-directory 'path' 恢复指定目录下所有删除的数据
--restore-all,恢复命令参数,表示将尝试恢复所有目录和文件。
-j journal,表示从已经命名的文件中读取扩展日志。
-b blocknumber,表示使用之前备份的超级块来打开文件系统,一般用于查看现有超级块是不是当前所要的文件。
-B blocksize,表示使用数据块大小来打开文件系统,一般用于查看已经知道大小的文件。
  • 操作分区sdb2

image-20200310165133630

  • 在分区sdb2中制造删除文件的动作

image-20200310165305951

  • 恢复被删除文件

删除数据之后,首先卸载这块磁盘分区或者挂载为只读,以防止磁盘重新读写。

cd ~
umount /dev/sdb2
或者
mount -r -n -o remount /media/root/8d949467-112b-4e35-ac7c-f4f04f6a2beb/

image-20200310165539651

查看哪些文件被删除

虽说debugfs不能作用与ext3/4等文件系统格式,但是它还是能帮助我们查看文件的inode信息,然后结合extundelete进行恢复数据。

如果是删除的单个文件,也可以查看该文件所在目录的inode,然后通过该inode号,查看删除的文件。

查看inode=2的情况

extundelete /dev/sdb2 --inode 2  //inode 2 根目录的inode号
 → Qftm ← :~# extundelete /dev/sdb2 --inode 2
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 19 groups loaded.
Group: 0
Contents of inode 2:
0000 | ed 41 00 00 00 04 00 00 6b 3a 67 5e 79 3a 67 5e | .A......k:g^y:g^
0010 | 79 3a 67 5e 00 00 00 00 00 00 02 00 02 00 00 00 | y:g^............
0020 | 00 00 00 00 11 00 00 00 02 02 00 00 00 00 00 00 | ................
0030 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
0040 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
0050 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
0060 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
0070 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................

Inode is Allocated
File mode: 16877
Low 16 bits of Owner Uid: 0
Size in bytes: 1024
Access time: 1583823467
Creation time: 1583823481
Modification time: 1583823481
Deletion Time: 0
Low 16 bits of Group Id: 0
Links count: 2
Blocks count: 2
File flags: 0
File version (for NFS): 0
File ACL: 0
Directory ACL: 0
Fragment address: 0
Direct blocks: 514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Indirect block: 0
Double indirect block: 0
Triple indirect block: 0

File name                                       | Inode number | Deleted status
.                                                 2
..                                                2
lost+found                                        11             Deleted
HidHack2                                          20241          Deleted
see.txt                                           14             Deleted
.see.txt.swp                                      13             Deleted
see.txt~                                          12             Deleted
 → Qftm ← :~# 

根据上面的输出,标记为Deleted状态的是已经删除的文件或目录。同时还可以看到每个已删除文件的inode值,接下来就可以恢复文件了。

  • 恢复单个文件

恢复文件see.txt

extundelete /dev/sdb2 --restore-inode 14
extundelete /dev/sdb2 --restore-file see.txt

image-20200310170123866

查看恢复后的see.txt

在文件恢复成功后,extundelete命令默认会在执行命令的当前目录下创建一个RECOVERED_FILES目录,此目录用于存放恢复出来的文件,所以执行extundelete命令的当前目录必须是可写的。

image-20200310170707131

从上面可以看到通过Inode号恢复的文件命名后缀是该文件的inode号

  • 恢复目录
extundelete /dev/sdb2 --restore-inode 20241
extundelete /dev/sdb2 --restore-directory HidHack2

image-20200310172042573

查看恢复的目录HidHack2

image-20200310172306790

从上面可以看到通过--restore-directory恢复的目录文件和原来的一样

PS:使用extundelete恢复后的文件MD5值和原来的一样,这里不在测试

使用PhotoRec恢复文件

PhotoRec是一款用于恢复硬盘、光盘中丢失的视频、文档、压缩包等文件,或从数码相机存储卡中恢复丢失图片的数据恢复软件(因此,该软件命名为Photo Recovery这个名字)。 PhotoRec忽略文件系统,能直接从介质底层恢复数据,因此,在介质的文件系统严重破坏或被重新格式化后,它也能进行数据恢复。

PhotoRec是一款免费的开源、跨多平台的数据恢复软件,受GNU General Public License (GPLV v2+) 的保护. PhotoRec 是TestDisk的伴侣程序, Testdisk是一款支持多种文件系统的丢失分区恢复,并能修复不可启动的磁盘的数据恢复软件。

PhotoRec和TestDisk支持NTFS,HFS +,exFAT,ext2/ext3/ext4等多种文件系统。

出于安全考虑, PhotoRec以只读方式来访问您要恢复数据所在的磁盘或存储卡介质。

  • 安装PhotoRec
------- On Debian/Ubuntu/Linux Mint ------- 
$ sudo apt-get install testdisk
------- On CentOS/RHEL/Fedora ------- 
$ sudo yum install testdisk
------- On Fedora 22+ ------- 
$ sudo dnf install testdisk   
------- On Arch Linux ------- 
$ pacman -S testdisk             
------- On Gentoo ------- 
$ emerge testdisk

image-20200310180751711

  • 操作分区sdb3

image-20200310180703660

  • 在分区sdb3中制造删除文件的动作

image-20200310185807751

  • 恢复被删除文件

删除数据之后,首先卸载这块磁盘分区或者挂载为只读,以防止磁盘重新读写。

cd ~
umount /dev/sdb3
或者
mount -r -n -o remount /media/root/7dbab1c1-21b7-4cae-bb6c-3b42c6b23e55/

image-20200310181453152

运行PhotoRec,进入相应分区/dev/sdb

image-20200310184507622

选择分区/dev/sdb3进行恢复

image-20200310184536022

可以在FIle opt 中设置恢复规则(恢复的文件类型),根据相应需求进行设置,默认是全选。

image-20200310184619784

规则设置之后,退出,在search中进入/dev/sdb3,选择ext文件系统格式

image-20200310184650967

选择whole进行恢复

image-20200310184714947

确定之后,选择文件恢复到/root目录中

image-20200310184758303

选择好目录之后,按C开始恢复

image-20200310184356665

查看恢复的文件

image-20200310185336012

report.xml存放的是恢复信息。其他文件是恢复的数据文件,恢复的文件不是原来的文件名,但是文件内容不变,MD5值也是一样的。

Linux 内存取证艺术

内存简介

内存取证主要通过对内存数据及其缓存硬盘数据进行分析,提取那些对案件侦破可能有重要意义的易失性数据,这些易失性数据的特点是存在于正在运行的计算机或网络设备的内存中,关机或重启后这些数据将不再存在。

成功获取物理内存以后,接下来的工作就是要对镜像文件进行分析,从中提取有用的入侵证据。一般来说,我们可以从镜像文件中提取以下信息 ( 这些信息是指在生成镜像文件那个时刻的信息) :

所有正在内存中运行的进程;
所有的载入模块和DLL(动态链接库),包括被植入的各种恶意程序;
所有正在运行的设备驱动程序,包括隐藏的rootkits;
每个进程打开的所有文件;
每个进程打开的所有注册表的键值;
每个进程打开的所有网络套接字(sockets),包括IP地址和端口信息;
用户名和口令;
正在使用的电子邮件 和网页链接;
正在编辑的文件内容。

内存提取

这里提取Linux内存镜像的时候使用LiME工具。

LiME

  • 简介

LiME(以前称为DMD)是可加载内核模块(LKM),它允许从Linux和基于Linux的设备(例如由Android驱动的设备)中获取易失性内存。该工具支持获取设备文件系统或网络上的内存。LiME的独特之处在于它是第一个允许全内存捕获的工具。

可加载内核模块(LKM),允许从Linux和基于Linux的设备(例如Android)获取易失性内存。这使LiME独树一帜,因为它是第一个允许在Android设备上捕获全部内存的工具。它还最大程度地减少了在获取过程中用户空间与内核空间过程之间的交互,这使其能够比在其他方面为Linux内存获取而设计的工具生成更合理的内存捕获。

  • 项目地址
https://github.com/504ensicsLabs/LiME
  • 用法

有关LiME用法和内部结构的详细文档,可以在项目的“ doc”目录中找到。

LiME利用insmod命令加载模块,并传递执行所需的参数。

insmod ./lime.ko "path=<outfile | tcp:<port>> format=<raw|padded|lime> [digest=<digest>] [dio=<0|1>]"

path (required):     outfile ~ name of file to write to on local system (SD Card)
                     tcp:port ~ network port to communicate over

format (required):   padded ~ pads all non-System RAM ranges with 0s
                     lime ~ each range prepended with fixed-size header containing address space info
                     raw ~ concatenates all System RAM ranges (warning : original position of dumped memory is likely to be lost)

digest (optional):   Hash the RAM and provide a .digest file with the sum.
                     Supports kernel version 2.6.11 and up. See below for
                     available digest options.

compress (optional): 1 ~ compress output with zlib
                     0 ~ do not compress (default)

dio (optional):      1 ~ attempt to enable Direct IO
                     0 ~ do not attempt Direct IO (default)

localhostonly (optional):  1 ~ restricts the tcp to only listen on localhost,
                           0 ~ binds on all interfaces (default)

timeout (optional): 1000 ~ max amount of milliseconds tolerated to read a page (default).
                           If a page exceeds the timeout all the memory region are skipped.
                       0 ~ disable the timeout so the slow region will be acquired.

                           This feature is only available on kernel versions >= 2.6.35. 

提取镜像

cd LiME/src
make
insmod ./lime-5.2.0-kali2-amd64.ko "path=/root/Mem/kali.lime format=lime"

其中./lime-5.2.0-kali2-amd64.ko是make命令之后生成的,不同linux系统名称不同,path=后面接的是提取内存镜像后的保存位置,保存在/root/Mem下,命名为kali.lime,这个lime文件会与内存大小相同。

内存分析

Volatility

  • 简介

Volatility 是一款基于 GNU 协议的开源框架,使用 Python 语言编写而成的内存取证工具集,可以分析内存中的各种数据。Volatility 支持对 32 位或 64 位 Wnidows、Linux、Mac、Android 操作系统的内存数据进行提取与分析。

  • 项目地址
https://github.com/volatilityfoundation/volatility
  • Linux Profile

volatility集成了windows版本的profile文件,linux需要自己制作profile文件。

Linux Profile制作过程参考官方手册:Linux WiKi

  • 基本使用

使用命令:

./vol.py ‐f [image] --profile=[profile] [plugin]

查看扫描检查、插件、地址空间等信息:

./vol.py --info

查看帮助信息:

./vol.py -h/--help

查看指定插件的说明:

./vol.py [plugin] –help

查找插件:

不带前缀的是windows的插件,带linux前缀的是linux的插件

./vol.py --info | grep -i linux (列出所有linux插件)

从扩展目录加载插件:

./vol.py --plugins=[path][plugin]

检查结果输出:

./vol.py --output-file=[file]

查看profile文件:

./vol.py --info | grep -i profile

内存镜像分析

使用Volatility对LiME抓取Centos7的一个内存镜像进行分析:Centos7.lime
image-20200414135309931

查看制作好的profile

image-20200414140143484

查看Linux插件

image-20200414140232651

  • 通过Volatility利用内存镜像和profile还有Linux插件进行内存取证分析

查看系统ARP表

vol.py -f /root/centos7.lime --profile=Linuxcentos7x64 linux_arp

image-20200414140826554

查看系统信息

vol.py -f /root/centos7.lime --profile=Linuxcentos7x64 linux_banner

image-20200414140950274

检查系统进程信息

vol.py -f /root/centos7.lime --profile=Linuxcentos7x64 linux_psaux

image-20200414141041992

查看系统隐藏进程

vol.py -f /root/centos7.lime --profile=Linuxcentos7x64 linux_pidhashtable

image-20200414141205401

查看某具体进程的情况

检查某具体进程的情况可以使用 linux_proc_maps 子命令

vol.py -f /root/centos7.lime --profile=Linuxcentos7x64 linux_proc_maps | grep httpd

image-20200414141432807

查看网络链接情况

vol.py -f /root/centos7.lime --profile=Linuxcentos7x64 linux_netstat

image-20200414141524368

还有很多用法,就不一 一举例说明了,对于内存取证主要的步骤还是在于内存镜像的提取与profile文件。

获取系统进程信息相关命令:

   linux_pstree:进程树列表
   linux_pslist_cache:来自的 kmem_cache 活动进程
   linux_psxview:比较进程列表
   linux_lsof :打开文件描述符的每个活动进程
   linux_pslist :活动的进程列表
   linux_psaux:活动的进程列表(输出内容包括更多的细节)

获取系统内存信息的相关命令:

   linux_memmap:内存映射文件
   linux_pidhashtable:    Linux 内核中的 PID 散列表
   linux_proc_maps::转储由-s/--vma 参数到磁盘上指定的内存范围。
   linux_dump_map:进程内存的详细信息,包括堆和共享库。
   linux_bash :bash 历史文件

获取网络接口信息的相关命令:

   linux_arp:显示 arp 列表
   linux_ifconfig:显示网络接口详细情况
   linux_route_cache:显示网络路由表
   linux_netstat:查看网络链接情况

获取系统硬件信息的相关命令:

   linux_cpuinfo :显示 cpu 的相关命令信息。
   linux_dmesg :显示内核缓存信息。
   linux_iomem :显示 io 设备信息。
   linux_mount :显示/proc/mouns 的相关命令信息,主要是挂载的磁盘设备。
   linux_mount_cache :显示 kmem_cache 的相关命令信息。
   linux_slabinfo :显示/proc/slabinfo 的相关命令信息。

rootkit 检测的相关命令:

   linux_check_afinfo:检查篡改网络协议结构。
   linux_check_creds:检查进程共享结构。
   linux_check_fop:检查文件操作数据结构篡改情况。
   linux_check_idt:检查中断描述符表(IDT)的篡改情况。
   linux_check_syscall:在系统调用表检查功能情况。
   linux_check_modules:检查用于从内核模块列表中缺少在 sysfs 中的项目。

获取内核模块信息的相关命令:

   linux_lsmod:加载内核模块。
   linux_tmpfs:tmpfs 的内容。  

lsof

  • 简介

lsof(list open files ~ “ls + of”的组合)是一个列出当前系统打开文件的工具。在linux环境下,一切皆文件,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以需要root用户执行。

lsof 常见的用法是查找应用程序打开的文件的名称和数目。可用于查找出某个特定应用程序将日志数据记录到何处,或者正在跟踪某个问题。例如,linux限制了进程能够打开文件的数目。通常这个数值很大,所以不会产生问题,并且在需要时,应用程序可以请求更大的值(直到某个上限)。如果你怀疑应用程序耗尽了文件描述符,那么可以使用 lsof 统计打开的文件数目,以进行验证。

  • 常用参数列表
   lsof filename 显示打开指定文件的所有进程
   lsof -a 表示两个参数都必须满足时才显示结果 #执行AND操作,默认是OR操作
   lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件
   lsof -u username 显示所属user进程打开的文件
   lsof -g gid 显示归属gid的进程情况
   lsof +d /DIR/ 显示目录下被进程打开的文件
   lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长
   lsof -d FD 显示指定文件描述符的进程
   lsof -n 不将IP转换为hostname,缺省是不加上-n参数
   lsof -i 用以显示符合条件的进程情况
  • 实例

列出某个用户打开的文件

   lsof -u user_name
   例如:lsof -u root

   lsof -u ^root查看非root用户的文件使用情况

image-20200414145115666

列出在某个端口运行的进程

   lsof -i :port_number

   例如lsof -i:22, lsof -i:100-1000, lsof -i:22,23,80

image-20200414145239835

查看所有网络情况

   lsof -i

   lsof -i [46][protocol][@hostname|hostaddr][:service|port]
   46 --> IPv4 or IPv6,例如 -i 4 或者 -i 6
   protocol --> TCP or UDP
   hostname --> Internet host name
   hostaddr --> IPv4地址
   service --> service name (可以不只一个)
   port --> 端口号 (可以不只一个),例如lsof -i 4 10.1.1.1@server

image-20200414145502509

查找进程id来列出打开的文件

  lsof -p PID

  例如 lsof -p 717

  lsof -i -a -p 717
  lsof `which sshd` (哪个进程在使用openssh的可执行文件)

image-20200414145735590

根据某个目录列出被打开的文件

   lsof +D directory

   如:lsof +D /var/log/

image-20200414145856494

杀死某个用户所有活动进程

   killall -9 `lsof -t -u user_name`

   这里是用lsof找出user_name的所有活动进程,然后使用killall命令杀死。

   如:kill -9 `lsof -t -u root` 

Linux 日志取证艺术

日志概念

日志的主要用途是系统审计、监测追踪和分析统计。为了保证Linux系统正常运行、准确解决遇到的各种各样的系统问题,认真地读取日志文件是管理员的一项非常重要的任务。

Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息。大部分Linux发行版默认的日志守护进程为syslog,位于/etc/syslog/etc/syslogd/etc/rsyslog.d/usr/sbin/rsyslogd 默认配置文件为/etc/syslog.confrsyslog.conf,任何希望生成日志的程序都可以向 syslog 发送信息。

Linux系统内核和许多程序会产生各种错误信息、警告信息和其他的提示信息,这些信息对管理员了解系统的运行状态是非常有用的,所以应该把它们写到日志文件中去。完成这个过程的程序就是syslog。syslog可以根据日志的类别和优先级将日志保存到不同的文件中。例如,为了方便查阅,可以把内核信息与其他信息分开,单独保存到一个独立的日志文件中。默认配置下,日志文件通常都保存在/var/log目录下。

日志分类

Linux系统中的日志子系统对于系统安全来说非常重要,它记录了系统每天发生的各种各样的事情,包括那些用户曾经或者正在使用系统,可以通过日志来检查错误发生的原因,更重要的是在系统受到黑客攻击后,日志可以记录下攻击者留下的痕迹,通过查看这些痕迹,系统管理员可以发现黑客攻击的某些手段以及特点,从而能够进行处理工作,为抵御下一次攻击做好准备。

在Linux系统中,有三类主要的日志子系统

  • 连接时间日志(用户登录日志)

连接时间日志由多个程序记录,把记录写入到/var/log/wtmp/var/log/lastlog/var/run/utmp 。login 等程序更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统。

  • 进程统计日志(用户行为日志)

进程统计日志由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct或acct)中写一个记录。该日志供系统管理员分析系统使用者对系统进行的配置以及对文件进行的操作。同时为系统中的基本服务提供命令使用统计。

  • 错误日志

syslog日志系统已经被许多设备兼容,Linux的syslog可以记录系统事件主要由syslogd程序或其它程序执行Linux系统下各种进程、用户程序和内核都可以通过syslog文件记录重要信息错误日志记录在/var/log/messages中。有许多Linux/Unix程序创建日志。像HTTP和FTP这样提供网络服务的服务器也保持详细的日志。

日志介绍

日志环境

[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# ls /etc/rsyslog.conf
/etc/rsyslog.conf
[root@localhost ~]# 

配置文件

  • rsyslog.conf

可以通过编辑/etc/rsyslog.conf来配置日志。配置文件/etc/rsyslog.conf规定了系统中需要监视的事件和相应的日志的保存位置。配置文件内容及浅析如下:

# rsyslog configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### MODULES ####

# The imjournal module bellow is now used as a message source instead of imuxsock.
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
#$ModLoad imklog # reads kernel messages (the same are read from journald)
#$ModLoad immark  # provides --MARK-- message capability

# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514


#### GLOBAL DIRECTIVES ####

# Where to place auxiliary files
$WorkDirectory /var/lib/rsyslog

# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on

# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf

# Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
$OmitLocalLogging on

# File to store the position in the journal
$IMJournalStateFile imjournal.state


#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
## 将info或更高级别的消息送到/var/log/messages,其中*是通配符,代表任何设备,none表示不对任何级别的信息进行记录。

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure
## 将authpirv设备的任何级别的信息记录到/var/log/secure文件中,这主要是一些和认证、权限使用相关的信息。

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog
## 将mail设备中的任何级别的信息记录到/var/log/maillog文件中,这主要是和电子邮件相关的信息。

# Log cron stuff
cron.*                                                  /var/log/cron
## 将cron设备中的任何级别的信息记录到/var/log/cron文件中,这主要是和系统中定期执行的任务相关的信息。

# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*
## 将任何设备的emerg级别或更高级别的消息发送给所有正在系统上的用户。

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler
## 将uucp和news设备的crit(    较严重)级别或更高级别的消息记录到/var/log/spooler文件中。

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
## 将和本地系统启动相关的信息记录到 /var/log/boot.log 文件中。

# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#$ActionQueueFileName fwdRule1 # unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
#$ActionQueueType LinkedList   # run asynchronously
#$ActionResumeRetryCount -1    # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
#*.* @@remote-host:514
# ### end of the forwarding rule ###

syslog能设置成根据输出信息的程序或重要程度将信息排序到不同的文件。例如由于核心信息更重要且需要有规律地阅读以确定问题出在哪里所以要把核心信息与其他信息分开来单独定向到一个分离的文件中。

  • 日志类型

下面是常见的日志类型,但并不是所有的Linux发行版都包含这些类型。

类型 说明
auth 安全和认证相关的消息(不推荐使用authpriv代替)
authpriv 安全和认证相关的消息(私有的)
cron 系统定时任务crond和at产生的日志
ftp ftp守护进程产生的日志
kern 内核产生的日志(不是用户进程产生的)
Local1 为本地使用预留的服务
lpr 打印产生的日志
mail 邮件收发信息
news 与新闻服务器相关的日志
syslog 有syslogd服务产生的日志,虽然服务名称已经改为rsyslogd,但是很多配置还是沿用了syslogd,这里并没有修改服务名
user 用户程序产生的日志信息
uucp uucp子系统的日志信息,uucp是早期linux系统进行数据传递的协议,后来也常用在新闻组服务中
  • 日志优先级

常见的日志优先级如下:数字等级越小,优先级越高,消息越重要。

级别 英文单词 中文释义 说明
0 EMERG 紧急 会导致主机系统不可用的情况
1 ALERT 警告 必须马上采取措施解决的问题
2 CRIT 严重 比较严重的情况
3 ERR 错误 运行出现错误
4 WARNING 提醒 可能影响系统功能,需要提醒用户的重要事件
5 NOTICE 注意 不会影响正常功能,但是需要注意的事件
6 INFO 信息 一般信息
7 DEBUG 调试 程序或系统调试信息等

日志文件

常用日志文件:系统日志是由一个名为syslog的服务管理的,例如以下日志文件都是由syslog日志服务驱动的。

  • /var/log/boot.log

记录了系统在引导过程中发生的事件,其实就是Linux系统开机自检过程显示的信息。

[root@localhost log]# more boot.log | head -10
         Mounting Configuration File System...
[  OK  ] Mounted Configuration File System.
[  OK  ] Started Show Plymouth Boot Screen.
[  OK  ] Started Forward Password Requests to Plymouth Directory Watch.
[  OK  ] Reached target Paths.
[  OK  ] Reached target Basic System.
[  OK  ] Found device /dev/mapper/centos-root.
         Starting File System Check on /dev/mapper/centos-root...
[  OK  ] Started File System Check on /dev/mapper/centos-root.
[  OK  ] Started dracut initqueue hook.
[root@localhost log]#
  • /var/log/cron

该日志文件记录crontab守护进程crond所派生的子进程的动作,前面加上用户、登录时间和PID以及派生出的进程的动作。CMD的一个动作是cron派生出一个调度进程的常见情况。REPLACE替换动作记录用户对它的cron文件的更新该文件列出了要周期性执行的任务调度。 RELOAD动作在REPLACE动作后不久发生这意味着cron注意到一个用户的cron文件被更新而cron需要把它重新装入内存。该文件可能会查到一些反常的情况。

[root@localhost log]# more cron | head -10
Mar 26 15:27:01 localhost run-parts(/etc/cron.daily)[8190]: finished logrotate
Mar 26 15:27:01 localhost run-parts(/etc/cron.daily)[8178]: starting man-db.cron
Mar 26 15:27:02 localhost run-parts(/etc/cron.daily)[8201]: finished man-db.cron
Mar 26 15:27:02 localhost anacron[8065]: Job `cron.daily' terminated
Mar 26 15:47:01 localhost anacron[8065]: Job `cron.weekly' started
Mar 26 15:47:01 localhost anacron[8065]: Job `cron.weekly' terminated
Mar 26 23:34:25 localhost crond[6267]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 55% if used.)
Mar 26 23:34:25 localhost crond[6267]: (CRON) INFO (running with inotify support)
Apr 13 21:59:10 localhost crond[6309]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 6% if used.)
Apr 13 21:59:10 localhost crond[6309]: (CRON) INFO (running with inotify support)
[root@localhost log]#
  • /var/log/maillog

该日志文件记录了每一个发送到系统或从系统发出的电子邮件的活动。它可以用来查看用户使用哪个系统发送工具或把数据发送到哪个系统。

[root@localhost log]# more maillog
Mar 26 23:34:31 localhost postfix/postfix-script[7886]: starting the Postfix mail system
Mar 26 23:34:31 localhost postfix/master[7891]: daemon started -- version 2.10.1, configuration /etc/postfix
Apr 13 21:59:17 localhost postfix/postfix-script[7927]: starting the Postfix mail system
Apr 13 21:59:17 localhost postfix/master[7936]: daemon started -- version 2.10.1, configuration /etc/postfix
[root@localhost log]#
  • /var/log/lastlog

该日志文件记录最近成功登录的事件和最后一次不成功的登录事件,由login生成。在每次用户登录时被查询,该文件是二进制文件,需要使用lastlog命令查看。根据UID排序显示登录名、端口号和上次登录时间。如果某用户从来没有登录过就显示为”Never logged in“。该命令只能以root权限执行。简单地输入lastlog命令后就会看到类似如下的信息。

[root@localhost log]# lastlog
用户名           端口     来自             最后登陆时间
root             pts/0    192.33.6.1       一 4月 13 21:59:19 +0800 2020
bin                                        **从未登录过**
daemon                                     **从未登录过**
adm                                        **从未登录过**
lp                                         **从未登录过**
sync                                       **从未登录过**
shutdown                                   **从未登录过**
halt                                       **从未登录过**
mail                                       **从未登录过**
operator                                   **从未登录过**
games                                      **从未登录过**
ftp                                        **从未登录过**
nobody                                     **从未登录过**
systemd-network                            **从未登录过**
dbus                                       **从未登录过**
polkitd                                    **从未登录过**
tss                                        **从未登录过**
abrt                                       **从未登录过**
sshd                                       **从未登录过**
postfix                                    **从未登录过**
chrony                                     **从未登录过**
apache                                     **从未登录过**
mysql                                      **从未登录过**
[root@localhost log]#

注:系统账户诸如bin、daemon、adm、uucp、mail等决不应该登录的,如果发现这些账户已经登录就说明系统可能已经被入侵了。若发现记录的时间不是用户上次登录的时间则说明该用户的账户已经泄密了。

  • /var/log/messages

记录Linux操作系统常见的系统和服务错误信息。该日志文件是许多进程日志文件的汇总,从该文件可以看出任何入侵企图或成功的入侵。

[root@localhost log]# more messages | head -10
Mar 26 15:27:01 localhost rsyslogd: [origin software="rsyslogd" swVersion="8.24.0-34.el7" x-pid="7551" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
Mar 26 15:31:05 localhost dhclient[7354]: DHCPREQUEST on ens33 to 192.33.6.254 port 67 (xid=0x6f4fda31)
Mar 26 15:31:05 localhost dhclient[7354]: DHCPACK from 192.33.6.254 (xid=0x6f4fda31)
Mar 26 15:31:05 localhost NetworkManager[6615]: <info>  [1585207865.4818] dhcp4 (ens33):   address 192.33.6.144
Mar 26 15:31:05 localhost NetworkManager[6615]: <info>  [1585207865.4821] dhcp4 (ens33):   plen 24 (255.255.255.0)
Mar 26 15:31:05 localhost NetworkManager[6615]: <info>  [1585207865.4821] dhcp4 (ens33):   gateway 192.33.6.2
Mar 26 15:31:05 localhost NetworkManager[6615]: <info>  [1585207865.4821] dhcp4 (ens33):   lease time 1800
Mar 26 15:31:05 localhost NetworkManager[6615]: <info>  [1585207865.4822] dhcp4 (ens33):   nameserver '192.33.6.2'
Mar 26 15:31:05 localhost NetworkManager[6615]: <info>  [1585207865.4822] dhcp4 (ens33):   domain name 'localdomain'
Mar 26 15:31:05 localhost NetworkManager[6615]: <info>  [1585207865.4822] dhcp4 (ens33): state changed bound -> bound
[root@localhost log]#
  • /var/log/secure

Linux系统安全日志,该日志文件记录与安全相关的信息。

[root@localhost log]# more secure | head -10
Mar 26 23:34:24 localhost polkitd[6044]: Loading rules from directory /etc/polkit-1/rules.d
Mar 26 23:34:24 localhost polkitd[6044]: Loading rules from directory /usr/share/polkit-1/rules.d
Mar 26 23:34:24 localhost polkitd[6044]: Finished loading, compiling and executing 2 rules
Mar 26 23:34:24 localhost polkitd[6044]: Acquired the name org.freedesktop.PolicyKit1 on the system bus
Mar 26 23:34:29 localhost sshd[7520]: Server listening on 0.0.0.0 port 22.
Mar 26 23:34:29 localhost sshd[7520]: Server listening on :: port 22.
Mar 26 23:34:46 localhost login: pam_unix(login:session): session opened for user root by LOGIN(uid=0)
Mar 26 23:34:46 localhost login: ROOT LOGIN ON tty1
Apr 13 21:59:10 localhost polkitd[6044]: Loading rules from directory /etc/polkit-1/rules.d
Apr 13 21:59:10 localhost polkitd[6044]: Loading rules from directory /usr/share/polkit-1/rules.d
[root@localhost log]#
  • /var/log/btmp

记录Linux登陆失败的用户、时间以及远程IP地址。使用last或lastb命令查看btmp文件。

[root@localhost log]# lastb
root     ssh:notty    192.33.6.144     Mon Apr 13 22:52 - 22:52  (00:00)
root     ssh:notty    localhost        Mon Apr 13 22:52 - 22:52  (00:00)
root     ssh:notty    localhost        Mon Apr 13 22:52 - 22:52  (00:00)
root     ssh:notty    localhost        Mon Apr 13 22:52 - 22:52  (00:00)
root     tty1                          Mon Apr 13 22:51 - 22:51  (00:00)
(unknown tty1                          Mon Apr 13 22:51 - 22:51  (00:00)
root     tty1                          Mon Apr 13 22:51 - 22:51  (00:00)

btmp begins Mon Apr 13 22:51:29 2020
[root@localhost log]#
[root@localhost log]#
[root@localhost log]# last -f /var/log/btmp | more
root     ssh:notty    192.33.6.144     Mon Apr 13 22:52    gone - no logout
root     ssh:notty    localhost        Mon Apr 13 22:52 - 22:52  (00:00)
root     ssh:notty    localhost        Mon Apr 13 22:52 - 22:52  (00:00)
root     ssh:notty    localhost        Mon Apr 13 22:52 - 22:52  (00:00)
root     tty1                          Mon Apr 13 22:51    gone - no logout
(unknown tty1                          Mon Apr 13 22:51 - 22:51  (00:00)
root     tty1                          Mon Apr 13 22:51 - 22:51  (00:00)

btmp begins Mon Apr 13 22:51:29 2020
[root@localhost log]#
  • /var/log/syslog

只记录警告信息,常常是系统出问题的信息,使用lastlog查看。它和/etc/log/messages日志文件不同,它只记录警告信息,常常是系统出问题的信息,所以更应该关注该文件。

默认CentOS、Fedora不生成该日志文件,但可以配置/etc/syslog.conf或者rsyslog.conf,让系统生成该日志文件,在配置文件中加上*.warning /var/log/syslog,该日志文件能记录当用户登录时login记录下的错误口令、Send mail的问题、su命令执行失败等信息。

  • /var/log/wtmp

该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件,使用last命令查看。

该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件。因此随着系统正常运行时间的增加,该文件的大小也会越来越大,增加的速度取决于系统用户登录的次数。该日志文件可以用来查看用户的登录记录,last命令就通过访问这个文件获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户、终端tty或时间显示相应的记录。

[root@localhost log]# last
root     pts/1        192.33.6.144     Mon Apr 13 22:52 - 22:52  (00:00)
root     tty1                          Mon Apr 13 22:51   still logged in
root     pts/0        192.33.6.1       Mon Apr 13 21:59   still logged in
reboot   system boot  3.10.0-957.el7.x Mon Apr 13 21:59 - 22:58  (00:59)
root     tty1                          Thu Mar 26 23:34 - crash (17+22:24)
reboot   system boot  3.10.0-957.el7.x Thu Mar 26 23:34 - 22:58 (17+23:24)
root     pts/0        192.33.6.1       Thu Mar 26 15:16 - crash  (08:17)
root     tty1                          Thu Mar 26 15:15 - crash  (08:19)
reboot   system boot  3.10.0-957.el7.x Thu Mar 26 14:53 - 22:58 (18+08:05)
root     pts/1        192.33.6.1       Fri Dec 20 14:35 - crash (97+00:18)
root     pts/0        192.33.6.1       Fri Dec 20 10:37 - crash (97+04:16)
root     tty1                          Fri Dec 20 10:26 - crash (97+04:26)
reboot   system boot  3.10.0-957.el7.x Fri Dec 20 10:26 - 22:58 (115+12:32)
root     pts/1        192.33.6.1       Thu Dec  5 15:08 - crash (14+19:17)
root     pts/0        192.33.6.1       Thu Dec  5 14:51 - crash (14+19:34)
root     pts/0        192.33.6.1       Thu Dec  5 14:48 - 14:49  (00:01)
root     pts/0        192.33.6.1       Thu Dec  5 14:43 - 14:44  (00:00)
root     pts/0        192.33.6.1       Thu Dec  5 14:41 - 14:43  (00:02)
root     pts/0        192.33.6.1       Thu Dec  5 14:40 - 14:40  (00:00)
root     tty1                          Thu Dec  5 22:32 - crash (14+11:54)
reboot   system boot  3.10.0-957.el7.x Thu Dec  5 22:24 - 22:58 (130+00:34)
root     tty1                          Thu Dec  5 01:24 - crash  (20:59)
reboot   system boot  3.10.0-957.el7.x Thu Dec  5 01:23 - 22:58 (130+21:35)

wtmp begins Thu Dec  5 01:23:12 2019
[root@localhost log]#
  • /var/run/utmp

该日志文件记录有关当前登录的每个用户的信息。如 who、w、users、finger等就需要访问这个文件

该日志文件记录有关当前登录的每个用户的信息。因此这个文件会随着用户登录和注销系统而不断变化,它只保留当时联机的用户记录,不会为用户保留永久的记录。系统中需要查询当前用户状态的程序,如 who、w、users、finger等就需要访问这个文件。该日志文件并不能包括所有精确的信息,因为某些突发错误会终止用户登录会话,而系统没有及时更新 utmp记录,因此该日志文件的记录不是百分之百值得信赖的。

[root@localhost log]# who
root     tty1         2020-04-13 22:51
root     pts/0        2020-04-13 21:59 (192.33.6.1)
[root@localhost log]# w
 22:59:44 up  1:00,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      22:51    6:56   0.16s  0.16s -bash
root     pts/0    192.33.6.1       21:59    0.00s  0.11s  0.00s w
[root@localhost log]# users
root root
[root@localhost log]# 
  • /var/log/auth.log

存储来自可插拔认证模块(PAM)的日志,包括成功的登录、失败的登录尝试和认证方式。Ubuntu和Debian在/var/log/auth.log中存储认证信息,而RedHat和CentOS则在/var/log/secure中存储该信息。

[root@localhost log]# vim secure
[root@localhost log]#

Apr 13 21:59:19 localhost sshd[8068]: Accepted password for root from 192.33.6.1 port 64921 ssh2
Apr 13 21:59:19 localhost sshd[8068]: pam_unix(sshd:session): session opened for user root by (uid=0)
Apr 13 21:59:19 localhost sshd[8077]: Accepted password for root from 192.33.6.1 port 64922 ssh2
Apr 13 21:59:19 localhost sshd[8077]: pam_unix(sshd:session): session opened for user root by (uid=0)
Apr 13 22:51:27 localhost login: pam_unix(login:auth): authentication failure; logname=LOGIN uid=0 euid=0 tty=tty1 ruser= rhost=  user=root
Apr 13 22:51:27 localhost login: pam_succeed_if(login:auth): requirement "uid >= 1000" not met by user "root"
Apr 13 22:51:29 localhost login: FAILED LOGIN 1 FROM tty1 FOR root, Authentication failure
Apr 13 22:51:32 localhost login: pam_unix(login:auth): check pass; user unknown
Apr 13 22:51:32 localhost login: pam_unix(login:auth): authentication failure; logname=LOGIN uid=0 euid=0 tty=tty1 ruser= rhost=
Apr 13 22:51:34 localhost login: FAILED LOGIN 2 FROM tty1 FOR (unknown), User not known to the underlying authentication module
Apr 13 22:51:38 localhost login: pam_succeed_if(login:auth): requirement "uid >= 1000" not met by user "root"
Apr 13 22:51:40 localhost login: FAILED LOGIN SESSION FROM tty1 FOR root, Authentication failure
Apr 13 22:51:40 localhost login: PAM 1 more authentication failure; logname=LOGIN uid=0 euid=0 tty=tty1 ruser= rhost=  user=root
Apr 13 22:51:48 localhost login: pam_unix(login:session): session opened for user root by LOGIN(uid=0)
Apr 13 22:51:48 localhost login: ROOT LOGIN ON tty1
Apr 13 22:52:11 localhost sshd[8269]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=localhost  user=root
Apr 13 22:52:11 localhost sshd[8269]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Apr 13 22:52:13 localhost sshd[8269]: Failed password for root from 127.0.0.1 port 55448 ssh2
Apr 13 22:52:15 localhost sshd[8269]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"

以上提及的3个文件(/var/log/wtmp、/var/run/utmp、/var/log/lastlog)是日志子系统的关键文件,都记录了用户登录的情况。这些文件的所有记录都包含了时间戳。这些文件是按二进制保存的,故不能用less、cat之类的命令直接查看这些文件,而是需要使用相关命令通过这些文件而查看。其中,utmp和wtmp文件的数据结构是一样的,而lastlog文件则使用另外的数据结构,关于它们的具体的数据结构可以使用man命令查询。

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

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

日志分析

简单而常见的模拟攻击者对受害者进行SSH爆破并在受害者机器上分析其攻击行为

  • 环境
Attacker:192.33.6.146
Victim:192.33.6.144
  • Attacker

攻击者收集目标信息得到受害者开放的有22端口服务,尝试进行爆破以获得系统权限

image-20200413234608171

  • Victim

受害者查看系统登录用户情况并分析安全日志文件发现自己的ssh服务被攻击者爆破攻击,并成功入侵系统

查看日志文件secure、btmp发现来自非自己IP主机一直在访问ssh并尝试爆破登录

image-20200413234845637

image-20200413235103656

查看系统登录用户,发现192.33.6.146恶意主机已入侵系统

[root@localhost log]# who
root     tty1         2020-04-13 22:51
root     pts/0        2020-04-13 21:59 (192.33.6.1)
root     pts/1        2020-04-13 23:44 (192.33.6.146)
[root@localhost log]#

Author: Qftm
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Qftm !
 Previous
LFI Bypass Session Restriction Getshell LFI Bypass Session Restriction Getshell
之前打CTF和挖洞的时候遇到过不少服务器本地文件包含Session的漏洞,不过几乎这种Session包含漏洞都会有一些限制的,需要结合一些特殊的技巧去Bypass,于是打算整理一下关于PHP LFI绕过Session包含限制Getshell的一些奇思妙想。
2020-03-12
Next 
RFI巧用WebDAV绕过URL包含限制Getshell RFI巧用WebDAV绕过URL包含限制Getshell
前言关于远程文件包含(Remote File Inclusion)漏洞,自从 php version 5.2 之后一直是一个比较鸡肋的问题!!!直到2019年5月份,国外的一篇文章(RFI-SMB)和推文(Twitter)吸引了大家的注意,
2020-03-06
  TOC