草庐IT

网络安全应急响应 - 03 - 日志分析与内存分析

Zerimon 2023-03-28 原文

日志分析

Windows

日志概述

在Windows系统中,日志文件包括:系统日志、安全性日志及应用程序日志。

在Windows 2000 专业版/Windows XP/Windows Server 2003(注意日志文件的后缀名是evt)系统中(只有这三种日志):
系统日志的位置为 C:\WINDOWS\System32\config\SysEvent.evt
安全性日志的位置为 C:\WINDOWS\System32\config\SecEvent.evt
应用程序日志的位置为 C:\WINNT\System32\config\AppEvent.evt

在Windows Vista/Windows 7/Windows 8/Windows 10/Windows Server2008及以上版本系统中:
系统日志的位置为 %SystemRoot%\System32\Winevt\Logs\System.evtx
安全性日志的位置为 %SystemRoot%\System32\Winevt\Logs\Security.evtx
应用程序日志的位置为 %SystemRoot%\System32\Winevt\Logs\Application.evtx
其它日志:如Dhcp、Bits-Client等,这些日志存储在 %SystemRoot%\System32\Winevt\Logs 目录下

可以在【运行】对话框中输入【eventvwr】命令,打开【事件查看器】窗口,查看相关的日志。

(1)系统日志
系统日志主要是指Windows系统中的各个组件在运行中产生的各种事件。
这些事件一般可以分为:系统中各种驱动程序在运行中出现的重大问题、操作系统的多种组件在运行中出现的重大问题及应用软件在运行中出现的重大问题等。
这些重大问题主要包括重要数据的丢失、错误,以及系统产生的崩溃行为等。

(2)安全性日志(安全日志)
安全性日志主要记录了各种与安全相关的事件。
构成该日志的内容主要包括:各种登录与退出系统的成功或不成功的信息;对系统中各种重要资源进行的各种操作,如对系统文件进行的创建、删除、更改等操作。

(3)应用程序日志
应用程序日志主要记录各种应用程序所产生的各类事件。
例如,系统中SQL Server数据库程序在受到暴力破解攻击时,日志中会有相关记录,该记录中包含与对应事件相关的详细信息。

在应急响应中还经常使用PowerShell日志。

日志常用事件ID

Windows系统中的每个事件都有其相应的事件ID。

常用的事件ID:

旧版本指 Windows 2000专业版/Windows XP/Windows Server2003
新版本指 Windows Vista/Windows 7/Windows 8/Windows10/Windows Server 2008等

成功/失败登录事件提供的有用信息之一是用户/进程尝试登录(登录类型),Windows系统将此信息显示为数字。
数字及其对应说明:

登录相关日志事件ID对应说明:

常用启动事件相关日志事件ID对应说明:

日志被清除相关日志事件ID对应说明:

日志分析

日志分析就是在众多的日志中找出自己需要的日志。
(1)通过内置的日志筛选器进行分析
使用日志筛选器可以对记录时间、事件级别、任务类别、关键字等信息进行筛选。

(2)通过PowerShell对日志进行分析(需要有管理员权限)
命令【Get-EventLog】只获取传统的事件日志。
命令【Get-WinEvent】是从传统的事件日志(如系统日志和应用程序日志)和新Windows事件日志技术生成的事件日志中获取事件,其还会获取Windows事件跟踪(ETW)生成的日志文件中的事件。(需要Windows Vista、Windows Server 2008或更高版本的Windows系统,还需要Microsoft .NETFramework 3.5及以上的版本)

获取安全性日志下事件ID为4625(失败登录)的所有日志信息:
【Get-EventLog Security-InstanceId 4625】命令
【Get-WinEvent-FilterHashtable @{LogName='Security';ID='4625'}】命令

通过设置起始时间和终止时间变量,可查询指定时间内的事件。先设置起始时间变量StartTime和终止时间变量EndTime,再使用【Get-WinEvent】命令,可查询这段时间内的系统日志情况:

> $StartTime=Get-Date -Year 2022 -Month 6 -Day 1 -Hour 10 -Minute 30
> $EndTime=Get-Date -Year 2022 -Month 7 -Day 1 -Hour 10 -Minute 30
> Get-Wine vent -FilterHashtable @{LogName='System';StartTime=$StartTime;EndTime=$EndTime}

通过逻辑连接符可对多种指定日志ID进行联合查询。例如,对Windows启动和关闭日志进行查询:

> Get-WinEvent-LogName system | Where-Object {$_.ID-eq "12" -or $_.ID -eq "13"}

(3)通过相关的日志工具进行分析查询
FullEventLogView:FullEventLogView是一个轻量级的日志检索工具。
Event Log Explorer:Event Log Explorer是一个检测系统安全的软件,可查看、监视和分析事件记录,包括安全性、系统、应用程序和其Windows系统事件记录。
Log Parser:Log Parser是微软公司推出的日志分析工具,可以分析基于文本的日志文件、XML文件、CSV(逗号分隔符)文件,以及操作系统的事件日志、注册表、文件系统、Active Directory等。其可以像使用 SQL语句一样查询分析数据,甚至可以把分析结果以各种图表的形式展现出来。

查看事件ID为4624,即登录成功的所有事件:
> LogParser.exe -i:EVT -o:DATAGRID "SELECT*FROM C:\Security.evtx where EventID=4624"

查看从2018年1月1日23时59分59秒到2019年6月1日23时59分59秒,事件ID为4625,即登录失败的所有事件:
> LogParser.exe -i:EVT -o:DATAGRID "SELECT*FROM C:\Security.evtx where TimeGenerated>'2018-01-01 23:59:59' and TimeGenerated<'2019-06-01 23:59:59' and EventID=4625"

查看事件ID为4624(即登录成功的用户)的用户名和IP信息:
> LogParser.exe -i:EVT -o:DATAGRID "SELECT EXTRACT_TOKEN(Message, 13, ' ') as EventType, TimeGenerated as LoginTime, EXTRACT_TOKEN(Strings,5, '|') as Username, EXTRACT_TOKEN(Message, 38, ' ') as Loginip FROM c:\Security.evtx where EventID=4624"

查看系统历史开关机记录:
> LogParser.exe -i:EVT -o:DATAGRID "SELECT TimeGenerated, EventID, Message FROM C:\System.evtx whereEventID=12 or EventID=13"

Linux

日志概述

Linux系统中的日志一般存放在目录/var/log/下,具体的日志功能如下:

/var/log/wtmp:记录登录进入、退出、数据交换、关机和重启,即last。
/var/log/cron:记录与定时任务相关的日志信息。可查看任务计划相关的操作日志。
/var/log/messages:记录系统启动后的信息和错误日志。可查看整体系统信息,其中也记录了某个用户切换到root权限的日志。
/var/log/apache2/access.log:记录Apache的访问日志。
/var/log/auth.log:记录系统授权信息,包括用户登录和使用的权限机制等。
/var/log/userlog:记录所有等级用户信息的日志。
/var/log/xferlog(vsftpd.log):记录Linux FTP日志。
/var/log/lastlog:记录登录的用户,可以使用命令lastlog查看。
/var/log/secure:记录大多数应用输入的账号与密码,以及登录成功与否。可查看验证和授权方面的信息。
/var/log/faillog:记录登录系统不成功的账号信息。

使用【ls -alt /var/spool/mail】命令,可查看邮件相关日志记录文件。
使用【cat /var/spool/mail/root】命令,可发现针对80端口的攻击行为(当Web访问异常时,及时向当前系统配置的邮箱地址发送报警邮件):

日志分析

对于Linux系统日志的分析主要使用【grep】、【sed】、【sort】和【awk】等命令。

常用查询日志命令及功能如下:
【tail -n 10 test.log】命令:查询最后10行的日志。
【tail -n +10 test.log】命令:查询10行之后的所有日志。
【head -n 10 test.log】命令:查询头10行的日志。
【head -n -10 test.log】命令:查询除了最后10行的其他所有日志。

在*.log日志文件中统计独立IP地址个数的命令如下:
【awk '{print $1}' test.log | sort | uniq | wc -l】
【awk '{print $1}'/access.log | sort | uniq -c | sort -nr | head -10】

查找指定时间段日志的命令如下:
【sed -n '/2014-12-17 16:17:20/,/2014-12-17 16:17:36/p' test.log】
【grep '2014-12-17 16:17:20' test.log】

定位有多少IP地址在暴力破解主机root账号的命令如下:
【cat /var/log/secure | awk '/Accepted/{print $(NF-3)}'|sort|uniq -c|awk '{print$2"="$1;}'(CentOS)】

查看登录成功的IP地址的命令如下。
【cat /var/log/auth.log |awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print$2"="$1;}')(ubuntu)】

查看登录成功日期、用户名、IP地址的命令如下。
【grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'】

其它日志

还可对Web日志、中间件日志、数据库日志、FTP日志等进行分析。
日志分析的方法一般是结合系统命令及正则表达式,或者利用相关成熟的工具进行分析,分析的目的是提取相关特征规则,对攻击者的行为进行分析。

1)IIS日志的位置

%SystemDrive%\inetpub\logs\LogFiles
%SystemRoot%\System32\LogFiles\W3SVC1
%SystemDrive%\inetpub\logs\LogFiles\W3SVC1
%SystemDrive%\Windows\System32\LogFiles\HTTPERR

2)Apache日志的位置

/var/log/httpd/access.log
/var/log/apache/access.log
/var/log/apache2/access.log
/var/log/httpd-access.log

3)Nginx日志的位置

默认在/usr/local/nginx/logs目录下,access.log代表访问日志,error.log代表错误日志。
若没有在默认路径下,则可以到nginx.conf配置文件中查找。

4)Tomcat日志的位置

默认在TOMCAT_HOME/logs/目录下,
有catalina.out、
catalina.YYYY-MM-DD.log、
localhost.YYYY-MM-DD.log、
localhost_access_log.YYYY-MM-DD.txt、
host-manager.YYYY-MM-DD.log、
manager.YYYY-MM-DD.log等几类日志。

5)Vsftp日志的位置

在默认情况下,Vsftp 不单独记录日志,而是统一存放到/var/log/messages中。
但是可以通过编辑/etc/vsftp/vsftp.conf配置文件来启用单独的日志。
在日志启用后,可以访问vsftpd.log和xferlog。

6)WebLogic日志的位置

在默认情况下,WebLogic有三种日志,分别是access log、server log和domainlog
access log的位置是:$MW_HOME\user_projects\domains\<domain_name>\servers\<server_name>\logs\access.log
server log的位置是:$MW_HOME\user_projects\domains\<domain_name>\servers\<server_name>\logs\<server_name>.log
domain log的位置是:$MW_HOME\user_projects\domains\<domain_name>\servers\<adminserver_name>\logs\<domain_name>.log

7)数据库日志

(1)Oracle数据库查看方法如下。  
使用【select * from v$logfile】命令,可查询日志路径。在默认情况下,日志文件记录在$ORACLE/rdbms/log目录下。
使用【select * from v$sql】命令,可查询之前使用过的SQL。  

(2)MySQL数据库查看方法如下。
使用【show variables like 'log_%'】命令,可查看是否启用日志,如果日志已开启,则默认路径为/var/log/mysql/。
使用【show variables like 'general'】命令,可查看日志位置。  

(3)MsSQL数据库查看方法如下。
一般无法直接查看,需要登录到SQL Server Management Studio,在 "管理—SQL Server日志" 中进行查看。

内存分析

内存的获取

在应急响应中,有时要分析出一些隐藏进程,就要对应急响应服务器进行内存的提取。
内存的获取方法有如下几种:

  1. 基于用户模式程序的内存获取;
  2. 基于内核模式程序的内存获取;
  3. 基于系统崩溃转储的内存获取;
  4. 基于操作系统注入的内存获取;
  5. 基于系统休眠文件的内存获取;
  6. 基于虚拟化快照的内存获取;
  7. 基于系统冷启动的内存获取;
  8. 基于硬件的内存获取。

最常用的内存获取方法介绍:
1)基于内核模式程序的内存获取
一般需要借助相关的工具来完成。常用的提取工具有Dumpit、Redline、RAM Capturer、FTK Imager等。

2)基于系统崩溃转储的内存获取
打开【系统属性】对话框,选择【高级】选项卡,单击【启动和故障恢复】中的【设置】按钮,打开【启动和故障恢复】对话框,选择【核心内存转储】并找到转储文件进行获取。

3)基于虚拟化快照的内存获取
这种获取方法是通过VMware Workstation、ESXI等虚拟化软件实现的。比如VMware Workstation在生成快照时会自动生成虚拟内存文件。

内存的分析

对于内存的分析,一般需要借助相应的工具来进行。

1)Redline
在获取内存文件后,可以使用Redline进行导入分析,其主要收集在主机上运行的有关进程信息、内存中的驱动程序,以及其他数据,如元数据、注册表数据、任务、服务、网络信息和Internet历史记录等,最终生成报告。

2)Volatility
Volatility是一个开源的内存取证工具,可以分析入侵攻击痕迹,包括网络连接、进程、服务、驱动模块、DLL、handles、进程注入、cmd历史命令、IE浏览器历史记录、启动项、用户、shimcache、userassist、部分rootkit隐藏文件、cmdliner等。

常用命令参数:
netscan:可以列出内存镜像中的网络连接的情况,对内存镜像中的网络连接情况进行排查。
psxview:可查看内存镜像中带有隐藏进程的所有进程列表,排查隐藏进程。
malfind:可查找隐藏或注入的代码、DLL。
cmdscan:可提取执行的相关命令记录。
procdump:可提取进程文件。可通过制定进程的PID的值来对特定的进程文件进行提取,如使用【procdump -p 2476 -D】命令提取进程文件。
          可以分析内存中提取出的文件,从而判别文件是否有恶意行为。最简单的方法是把提取出的文件上传到virustotal平台并进行扫描。

有关网络安全应急响应 - 03 - 日志分析与内存分析的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  3. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  4. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  5. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  6. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  7. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  8. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  9. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  10. 键删除后 ruby​​ 哈希内存泄漏 - 2

    你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p

随机推荐