浅谈应急响应
蓝队简介
前期工作
资产梳理:
1.询问调查熟悉对外开放的资产(ip,域名,端口等具体的情况)
2.自己使用工具,如nmap等扫描,发现完善资产掌握状况
风险评估:
根据条件提前进行简单或复杂的渗透测试,了解漏洞情况(哪些要马上修复,哪些可以缓一缓),评估其危害以及修复漏洞的兼容性,未雨绸缪
应急响应方案制定:
面对 勒索 APT 等不同场景,制定不同的应对方案,要落实具体由谁去处理,资产由谁负责,对应的联系人是谁
其他:
如针对钓鱼邮件防范的员工安全意识培训,等等
值守工作
蓝初
监测组:
不断刷新,有告警就上报,需要具有一定简单的研判能力
1.网页刷新脚本
2.警告叫醒睡觉脚本
蓝中
研判组:
确认攻击行为,并上报处置组封禁
溯源组:
对攻击行为,利用微步,在线木马监测,蜜罐,威胁情报,社工手段等去溯源
处置组(一般是甲方人员):
专门对上报的ip等进行处置和对漏洞进行修复(封ip,拔网线)
报告组:
几乎所有组别都要写报告,内容包括但不限于:日报,周报,月报,技战法,0day报告,防守报告等
HW蓝队注意事项
一切以最最最谨慎的态度进行
1.分析研判,比如木马文件,一定要用断网虚拟机,不要宿主机给人黑了
2.用纸记密码,别用浏览器保存
3.不要玩手机
4.水群的时候不要乱点链接
5.不许用客户的网络进行攻击行为,比如你无聊用客户网挖edusrc
6.下班后关电脑
应急响应基本流程
原则
1.及时止损:
对内拔网线,对外封ip,对失陷主机进行处理,对于不适合进行断网的主机,可以通过防火墙封锁ip或者进行域名劫持(让其无法解析恶意地址 host文件配置127.0.0.1)
2.防止扩散:
根据传播手法进行灵活处理,比如利用域渗透(Psexec,WMI,smbexec等),漏洞利用(永恒之蓝漏洞),账号爆破(rdp,ssh)等进行传播
3.现场环境保留
分类
1.APT
2.勒索
3.挖矿
4.其他:后门,ddos等
准备阶段
发生应急响应事件了,需要先了解事件背景,确定响应人员,事件响应策略,相关负责人联系方式,应急响应相关授权,应急响应工具包,应急响应手册等
快速沟通问题列表:
1.发生了什么事情?现场现象是什么?如何发现的?依据是什么?
2.什么时候发现的?
3.目前是否有做物理隔离(断网)?
4.受害机器是哪台?
5.网络拓扑是怎么样的?
6.应急响应要做到怎么程度(什么需求)?
7.有多少主机出现了相同的情况?
8.出现问题的是普通主机还是服务器?
9.是哪台主机最先开始出现问题的?
10.出问题的服务器上运行了什么业务?
11.操作系统类型?是否有公网映射业务?远程管理方式?网络边界有无流量监控设备?主机侧是否有EDR等安全设备?
12.目前情况对业务造成了什么影响?
注意事项:千万不可以直接重装系统,重启电脑,以避免现场被破坏,应先取证,虚拟机应先新建快照并取证,然后才能进行下一步
检测阶段
在这个阶段我们需要确认入侵事件是否真实发生,一切都要自己确认,负责人的话只能做参考,并且要确认是什么类型的入侵
样本定位
使用工具对恶意样本进行定位,常用:ProcessHacker,PCHunter,Everything,Autoruns,ProcMon,火绒剑等
内部溯源
目标:
1.如何进入
2.入侵事件
3.做了什么
手段:
日志分析,流量分析等
抑制阶段
该阶段采用针对性措施降低事件算是,避免安全事件的扩散和持续影响等,常见手法为:断网,降权限,封ip,封端口,拔网线等
根除阶段
从各种排查中排查出恶意文件或配置项等,清除其影响,如系统重装,补丁加固,网络恢复,密码重置,木马清除等
恢复阶段
该阶段将尽可能地将系统恢复至网络安全事件发生前的状态,以重新提供服务,把受影响的系统,设备,软件和应用服务还原到正常的工作状态,包括系统恢复,网络恢复,用户恢复,数据恢复以及重新部署等,涉及实时容灾技术,备份恢复技术等
跟踪阶段
样本留存,木马处置,安全加固
该阶段需要整理输出一份详细的事件总结报告,包括事件发生及各部门接入处理的时间线,事件可能造成的损失,为客户提供安全加固优化建议,主要暴扣:调查事件原因,输出应急响应报告,提供安全建议,加强安全教育,避免同类事件再次发生
常用威胁情报+样本分析
奇安信威胁情报中心
微步在线社区
Virus total
IBM XFORCE
http://www.virscan.org/
https://habo.qq.com/
https://virusscan.jotti.org/
http://www.scanvir.com/
Windows应急响应
脚本
1.https://github.com/book4yi/Winscan 一个bat搞定
2.https://github.com/0xbinibini/emergency_response_batch/ 集成了一些工具
3.https://github.com/Bert-JanP/Incident-Response-Powershell/ powershell脚本
常用命令
regedit 注册表
Taskmgr 任务管理器
Msconfig 系统配置(包含启动项)
eventvwr 事件查看器(日志)
compmgmt 计算机管理(本地用户和组)
gpedit 本地组策略
taskschd 计划任务
lusrmgr 本地用户和组
net系列:
net系列的返回结果大多可以被轻易隐藏,建议使用wmic
net user 获取本机用户列表
net localgroup administrators 本机管理员
net session 查看当前会话
net use 远程连接
net share 查看当前用户下的共享目录
%UserProfile%\Recent
%APPDATA%\Microsoft\Windows\Recent
最近打开的文件
findstr /m /i /s "hello" *.txt
查找文件中的字符串,这里为hello
netstat -ano
systeminfo
wmic process 获取系统进程信息
wmic process where name=”cmd.exe” get processid,executablepath,name 根据进程名查找PID
wmic process where processid=”4296” get executablepath,name 根据PID查找应用程序
tasklist /m dll 查找进程调用的dll
certutil -hashfile %样本exe% MD5 本地计算样本md5(有时样本不允许离开受害主机)
敏感目录:
%WINDIR%
%WINDIR%\system32
%TEMP%
%LOCALAPPDATA%
%APPDATA%
工具
ProcessHacker
下载:https://processhacker.sourceforge.io/downloads.php
进程监测工具:
1.在自定义设置中设置开启command line选项输出进程参数,方便识别恶意进程
2.使用排序功能关注CPU占用情况
3.右键结束进程
4.可以关注启动时间(start time)比较晚的进程(新启动)
5.还可以关注公司名称和签名状况
6.关注网络连接情况
7.双击打开可疑进程,检查模块和内存(内存字符串搜索),分析内存是否存在rwx区域来判断shellcode
8.关注可疑服务项
PCHunter
下载:吾爱破解
1.右键校验所有进程模块签名,也可以指定
2.可疑文件扔微步沙箱
3.可以查看驱动模块,系统回调和内核进程消息钩子
Autoruns
下载:https://learn.microsoft.com/zh-cn/sysinternals/downloads/autoruns
1.枚举几乎所有启动项和持久化配置
2.枚举出来的结果可以导出保存
3.login,scheduled tasks,services,drivers,WMI这些需要单独看
PorcessMonitor
下载:https://learn.microsoft.com/zh-cn/sysinternals/downloads/procmon
监控软件行为,如创建文件,外联情况等
everything
下载:https://www.voidtools.com/zh-cn/downloads/
快速通过各种条件(如修改时间)来检索windows上的文件
火绒剑
下载:吾爱破解
各种工具的集大成者,遇到问题可以先用这个工具粗略查看
Openark
下载:github
类似火绒剑,也可以看看
D盾
下载:https://www.d99net.net/
查杀webshell
BeaconEye
下载:https://github.com/CCob/BeaconEye
扫描CS中的内存特征,并进行Beacon Config扫描解析出对应Beacon信息
Dumplt
内存取证,可以将系统完整内存镜像下来
替代工具:
FTK Imager
WinPMem
一般用不上,仅作记录
Volatility
内存分析工具
passrecenc
下载:https://www.nirsoft.net/password_recovery_tools.html
是一个工具集合,主要用于查看浏览器、路由、wifi、邮件等记住的密码,应集中可用于快速查看未知的密码是否存在泄露的可能,不仅如此,在内网渗透中也可作为重要的信息收集。
手法技巧
大道至简:所有相关信息,比如恶意木马名字等,只要放到注册表搜,一般都能出东西
系统信息搜集:
主要的目的在于简单了解操作系统的一些情况,比如假设在加载的模块、系统驱动程序、正在运行的任务中看到了一些奇怪的名字,那这个东西可能就有问题。
低版本windows:win+r -> winmsd
server 2008 以后:systeminfo win+r -> resmon win+r -> msinfo32
wmic cpu list brief CPU信息
set 系统环境变量
fsutil volume diskfree c: 磁盘剩余空间
进程分析:
cmd命令行输入tasklist,先确认当前操作系统的进程信息,查看是否存在可疑进程。同样也可以直接打开任务管理器来查看进程,或者是之前resmon资源监视器的方式来查看进程。
tasklit | findstr <pid> 根据PID定位进程
tasklist /V /FO CSV | findstr <进程名> 输出进程的详细信息
tasklist /svc 查看运行服务的信息
taskkill /f /pid <pid> /t 通过PID强行kill进程以及其子进程
taskkill /f /im cmd.exe /t 通过进程名强行kill进程
wmic process get * /value 查看所有进程的所有参数
wmic process get caption,commandline /value 查看所有进程的部分参数
wmic process where caption="iexplore.exe" get caption,commandline /value 查看指定进程的部分内容
系统服务及端口分析:
ipconfig
ipconfig /displaydns 显示dns客户端解析程序缓存的内容(本地dns解析)
route print -4
netstat -rn
查看ipv4路由信息
wmic nic list brief 查看网卡
netstat -ano 查看开放端口
netstat -ano | findstr ESTA 查看ESTABLISHED端口
注意关注状态为 LISTEN ESTABLISHED 的端口
计划任务:
这里介绍windows运行过程中在未来某个时间点,来执行payload的两种计划任务的方式:at命令、schtasks命令
at命令介绍
- 配置计划任务案例:C:\Windows\system32>at 22:00 /every:M,T,W,Th,F,S,Su c:<name>.exe
- 查看at命令配置的计划任务:C:\Windows\system32>at
- 删除计划任务:C:\Windows\system32>at 1 /delete
schtasks命令介绍 - 配置计划任务案例:C:\Windows\system32>schtasks /create /tn “<计划名>” /tr c:<name>.exe /sc minute /mo 1
- 查看schtasks命令配置的计划任务:C:\Windows\system32>schtasks /query |findstr “<计划名>”
- 删除计划任务:C:\Windows\system32>schtasks /Delete /tn “joke payload”
系统用户排查:
攻击者一般都会在目标失陷服务器上创建后门用户,以便于后续的远程控制或者响应服务登录的操作,所以用户信息的排查也是至关重要的一环。
用户信息获取:
- 查看当前用户的用户名和SID:C:\Windows\system32>whoami /user
- 查看当前用户所属的用户组:C:\Windows\system32>whoami /groups
- 查看当前用户的权限:C:\Windows\system32>whoami /priv
- 查看本机用户:C:\Windows\system32>net user
- 查看admin用户的详细信息:C:\Windows\system32>net user “admin”
- 查看用户组:C:\Windows\system32>net localgroup “administrators”
- 查看已登录的账户:C:\Windows\system32>query user
通过”win+r -> compmgmt.msc”或”win+r -> lusrmgr.msc”方式来查看本地用户和组的信息
注册表用户分析:
在很多情况下,使用net user命令在一些情况下是无法查看到所有用户的,就比如说被隐藏的用户$。那么通过查看注册表的方式就能够解决net user显示用户不全的问题。
HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names
在正常情况下注册表的子键最多可以展示到\SAM\SAM,并且该子键下面并没有任何的值。为什么?因为windows觉得这些注册表信息实在是太重要了,必须隐藏保护它,不能进行随意的删除修改。如果需要查看它的全部内容,就需要右键修改\SAM\SAM子键的Administrator的权限,将它设置为完全控制,然后刷新注册表子键便可以看到新增了很多的目录。
恶意用户信息获取:
若用用户账号仅是通过net命令或用户管理程序删除的,那么系统中任仍然会留有用户的目录,目录中的一些文件会记录用户某些特定的行为,便于追查。
以系统安装在C盘、恶意用户名为cracker为例 - 用户的桌面,可能放有一些临时文件或下载的文件:C:\Documents and Settings\cracker\桌面
- 用户的网络访问情况,cookie文件中可能会记录一些敏感信息:C:\Documents and Settings\cracker\Cookies
- 用户最近访问过哪些文件或文件夹:C:\Documents and Settings\cracker\Recent
- 用户上网的历史记录:C:\Documents and Settings\cracker\Local Settings\History
- 一些程序安装、解压缩等操作可能会在该目录产生临时文件:C:\Documents and Settings\cracker\Local Settings\Temp
- 上网时产生的临时文件,不但会存储网页页面内容以及一些下载的文件:
C:\Documents and Settings\cracker\Local Settings\Temporary Internet Files
克隆账户排查:
直接wmic useraccount 或者 注册表HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users
注册表分析:
可以通过win+r -> regedit来打开注册表。
蜂巢:在注册表中,有根文件夹,这些根文件夹被称为蜂巢。
- HKEY_USERS:包含所有加载的用户配置文件
- HKEYCURRENT_USER:当前登录用户的配置文件
- HKEY_CLASSES_ROOT:包含所有已注册的文件类型、OLE等信息
- HKEYCURRENT_CONFIG:启动时系统硬件配置文件
- HKEYLOCAL_MACHINE:配置信息,包括硬件和软件设置
注册表由由键、子键和值项构成。键指蜂巢文件夹,子键指这个键中的子文件夹,子键也是一个键。值项是键的当前定义,由名称、数据类型以及分配的值组成。
一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值。通常,值是0或1,意味着开或关,也可以包含通常以十六进制显示的更复杂的信息。
注册表无线取证:
通过注册表给出的信息,可以得到系统曾经接入过的无线接入点,也就是SSID从而定位无线AP的位置。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles
注意最后一次连接时间:SSID TP-LINK_4080
e407 0300 0500 1400 0c00 3300 05000c03 //小端序
07E4 = 2020 0003 = 3 0005 =星期五 0014 =20 000c =12 0033 = 51
得到最后一次连接时间:2020年3月20日12点51分 星期三
文档取证:
RecentDocs键可以通过文件扩展来跟踪系统上使用或打开的文档
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs
URL取证:
当用户在Internet Explorer中输入URL时,该值将被存储在:
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TypedURLs
IP地址取证:
跟踪用户接口的IP地址,我们可以找到分配给接口的IP地址,子网掩码以及DHCP服务器租用IP的时间。这样,我们就可以判断嫌疑人在入侵或犯罪时是否使用了某个特定的IP。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
USB存储设备取证:
想象一下在某些场景中,攻击者可能在你的电脑插入了一个USB设备,并拷贝走了你大量重要的数据文件。这时我们就可以通过以下键值,来查找USB存储设备插入和使用的证据。
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USBSTOR
内部溯源:
确认时间:创建时间,修改时间,编译时间(studype)需要注意的是,所有的时间都可以被伪造
除了上面说到的这些时间,比较靠谱的还有启动时间和查杀时间(文件落地时杀软日志的记录)
重启之前可以先开启一些监控设备来监控重启后的可疑行为,否则这个重启没有意义
确认进入手法:
win+r 输入 eventvwr 进入日志 关注安全,系统,应用程序日志 以及 microsoft-windows-powershell
日志
常用事件id:
确认黑客做了什么:
1.LastActivityView进行主机软件运行痕迹分析
2.流量分析
3.对木马进行分析(逆向)
日志分析:
Windows 2000 / Server2003 / Windows XP 的日志目录:C:\Windows\System32\Config\*.evt
Windows Vista / 7 / 10 / Server2008 的日志目录:C:\Windows\System32\winevt\Logs\*.evtx
黑客可通过命令:wevtutil cl “logname” 清除所有日志
windows日志主要分三大类:系统日志,安全日志,应用程序日志
系统日志:
主要记录了系统组件产生的事件,包括驱动程序产生的信息,系统组件产生的信息和应用程序崩溃的信息以及一些数据丢失情况的信息
默认位置:%SystemRoot%System32WinevtLogsSystem.evtx
系统启动 ID 12
事件日志服务启动 ID 6005
事件日志服务停止 ID 6006
系统关闭 ID 13
安全日志:
主要记录了系统安全相关的一些事件,如用户登入登出,系统资源使用情况以及系统策略更改事件,需要有管理员权限才能查看
默认位置:%SystemRoot%System32WinevtLogsSecurity.evtx
ID 4634 注销(退出登录)
ID 4656 SAM登录事件(无论成功失败)
ID 5156 出站事件
ID 5158 入站事件
这两个事件有规律平凡出现,多是中了轮询回连木马
ID 4698 计划任务已创建
ID 4699 计划任务已删除
ID 4700 计划任务已启用
ID 4701 计划任务已停用
ID 4702 计划任务已更
ID 4688 进程创建
ID 4689 进程终止
应用程序日志:%SystemRoot%System32WinevtLogsApplication.evtx
一般不看
Powershell日志审计:
查询所有系统事件 Get-WinEvent -LogName system
查询所有安全事件 Get-WinEvent -LogName security
查询所有应用事件 Get-WinEvent -LogName application
查询所有USB插入事件 Get-WinEvent -FilterHashtable @{Path="C:\Windows\System32\winevt\Logs\System.evtx"} | Where {$_.Message -like "USB"}
查询所有Windows Defender事件 Get-WinEvent -FilterHashtable @{logname="Microsoft-Windows-Windows Defender/Operational"}
查询所有Windows Defender相关具体事件,以1117为例(1117为阻止恶意软件) Get-WinEvent -FilterHashtable @{logname="Microsoft-Windows-Windows Defender/Operational";id=1117}
列出powershell可以查看的所有日志名 Get-WinEvent -ListLog *
Log Parser日志审计工具:可以分析操作系统的事件日志、注册表、文件系统、Active Directory、IIS。它可以像使用 SQL 语句一样查询分析这些数据,甚至可以把分析结果以各种图表的形式展现出来。(感觉挺鸡肋,仅作介绍)
常见日志事件ID
审计目录服务访问
4768 Kerberos身份验证服务
4934 ActiveDirectory对象的属性被复制
4935 复制失败开始
4936 复制失败结束
5136 目录服务对象已修改
5137 目录服务对象已创建
5138 目录服务对象已删除
5139 目录服务对象已经移动
5141 目录服务对象已删除
4932 命名上下文的AD的副本同步已经开始
4933 命名上下文的AD的副本同步已经结束
审计用户事件
4624 账号登陆成功
4625 账号登陆失败
4634 帐户被注销
4647 用户发起注销
4624 帐户已成功登录
4625 帐户登录失败
4648 试图使用明确的凭证登录
4672 授予特殊权限
4675 SID被过滤
4649 发现重放攻击
4719 系统审计策略修改
4720 创建用户
4726 删除用户
4728 将成员添加到启用安全的全局组中
4729 将成员从安全组移除
4732 将成员添加到启用安全的本地组中
4733 将成员从启用安全的本地组移除
4756 将成员添加到启用安全的通用组中
4757 将成员从启用安全的通用组中移除
4778 会话被重新连接到WindowStation
4779 会话断开连接到WindowStation
4800 工作站被锁定
4801 工作站被解锁
4802 屏幕保护程序启用
4803 屏幕保护程序被禁用
5378 所要求的凭证代表是政策所不允许的
5632 要求对无线网络进行验证
5633 要求对有线网络进行验证
审计对象访问
5140 网络共享对象被访问
4664 试图创建一个硬链接
4985 交易状态已经改变
5051 文件已被虚拟化
5031 Windows防火墙服务阻止一个应用程序接收网络中的入站连接
4698 计划任务已创建
4699 计划任务已删除
4700 计划任务已启用
4701 计划任务已停用
4702 计划任务已更新
4657 注册表值被修改
5039 注册表项被虚拟化
4660 对象已删除
4663 试图访问一个对象
审计政策变化
4715 对象上的审计政策(SACL)已经更改
4719 系统审计政策已经更改
4902 Per user审核政策表已经创建
4906 CrashOnAuditFail值已经变化
4907 对象的审计设置已经更改
4706 创建到域的新信任
4707 到域的信任已经删除
4713 Kerberos政策已更改
4716 信任域信息已经修改
4717 系统安全访问授予帐户
4718 系统安全访问从帐户移除
4864 名字空间碰撞被删除
4865 信任森林信息条目已添加
4866 信任森林信息条目已删除
4867 信任森林信息条目已取消
4704 用户权限已分配
4705 用户权限已移除
4714 加密数据复原政策已取消
4944 当开启WindowsFirewall时下列政策启用
4945 当开启WindowsFirewall时列入一个规则
4946 对Windows防火墙例外列表进行了修改,添加规则
4947 对Windows防火墙例外列表进行了修改,规则已修改
4948 对Windows防火墙例外列表进行了修改,规则已删除
4949 Windows防火墙设置已恢复到默认值
4950 Windows防火墙设置已更改
4951 因为主要版本号码不被Windows防火墙承认,规则已被忽视
4952 因为主要版本号码不被Windows防火墙承认,部分规则已被忽视,将执行规则的其余部分
4953 因为Windows防火墙不能解析规则,规则被忽略
4954 Windows防火墙组政策设置已经更改,将使用新设置
4956 Windows防火墙已经更改主动资料
4957 Windows防火墙不适用于以下规则
4958 因为该规则涉及的条目没有被配置,Windows防火墙将不适用以下规则:
6144 组策略对象中的安全政策已经成功运用
6145 当处理组策略对象中的安全政策时发生一个或者多个错误
4670 对象的权限已更改
审计特权使用
4672 给新登录分配特权
4673 要求特权服务
4674 试图对特权对象尝试操作
审计系统事件
5024 Windows防火墙服务已成功启动
5025 Windows防火墙服务已经被停止
5027 Windows防火墙服务无法从本地存储检索安全政策,该服务将继续执行目前的政策
5028 Windows防火墙服务无法解析的新的安全政策,这项服务将继续执行目前的政策
5029 Windows防火墙服务无法初始化的驱动程序,这项服务将继续执行目前的政策
5030 Windows防火墙服务无法启动
5032 Windows防火墙无法通知用户它阻止了接收入站连接的应用程序
5033 Windows防火墙驱动程序已成功启动
5034 Windows防火墙驱动程序已经停止
5035 Windows防火墙驱动程序未能启动
5037 Windows防火墙驱动程序检测到关键运行错误,终止。
4608 Windows正在启动
4609 Windows正在关机
4616 系统时间被改变
4621 管理员从CrashOnAuditFail回收系统,非管理员的用户现在可以登录,有些审计活动可能没有被记录
4697 系统中安装服务器
4618 监测安全事件样式已经发生
其它事件
1102 清理审计日志
1074 计算机的开机、关机、重启的时间以及原因和注释
SQL Server日志分析参考:https://zhuanlan.zhihu.com/p/79165140
Linux应急响应
工具脚本
busybox
下载:https://busybox.net/
避免ls等命令被替换
unhide
下载:https://www.unhide-forensics.info
查杀隐藏进程和端口,apt可直接安装
chkrootkit
下载:http://www.chkrootkit.org
rootkit检查脚本
chkrootkit -n
Rkhunter
又一个rootkit检查脚本
rkhunter --checkall --sk
ClamAV
下载:http://www.clamav.net
开源杀毒软件,需要自己配置防病毒引擎才能扫出来
Webshell查杀
河马WebShell查杀工具:http://www.shellpub.com/
内存马查杀:https://github.com/c0ny1/java-memshell-scanner
火麒麟
https://github.com/MountCloud/FireKylin/releases/tag/v1.4.0
LinuxCheck.sh
https://github.com/al0ne/LinuxCheck
whoamifuck
https://github.com/enomothem/Whoamifuck
whohk(狼组)
https://github.com/wgpsec/whohk
更多工具链接
https://www.freebuf.com/sectool/350630.html
https://www.cnblogs.com/linuxsec/articles/10704737.html
手法技巧
尽量使用自己准备的busybox中的命令以免替换
关键目录:
/etc/passwd
/etc/rc.d/rc.local - 开机启动项
/root/.ssh
/tmp
/etc/hosts - 将杀毒云端引擎的地址解析到127.0.0.1(断开云端杀毒)
/etc/init.d - 开机启动项
/etc/rc.local
常用命令:
ls -alt
free -h 内存使用情况
ps -auxef
top
netstat -pantul
ls -alh /proc/pid 查看对应pid的可执行程序
lsof -i:port 查询端口打开的文件
lsof -p pid 查询进程打开的文件
lsof -u root 查询用户打开的文件
lsattr file 查看文件属性(无法使用ls -l查看的属性)
chattr +i file 给文件添加不可删除属性
chattr -i file 给文件撤销不可删除属性
-alt排查启动项lastb 最近尝试登录错误 last 最近登录信息 lastlog 现时所有用户的最近登录信息 **计划任务:** cat /etc/passwd | cut -f 1 -d : | xargs -l {} crontab -l -u {} ```ls -altr /var /spool/cron/*``` more /etc/crontab ```shell more /etc/cron.d/* more /etc/cron.daily/* more /etc/cron.hourly/* more /etc/cron.monthly/* more /etc/cron.weekly/ more /etc/anacrontab more /var/spool/anacron/* /var/spool/cron/*
校验rpm软件包:
rpm -Va
dpkg -verify
SM5同时出现则需要警惕
查看文件(文件夹)详细信息:
stat
查找文件:
find / -mtime 0 -name *.jsp # 查找当前目录下,指定天数内修改的指定类型或名称的文件
find / -ctime 0 -name *.jsp # 查找当前目录下,指定天数内新增的指定类型或名称的文件
比较文件差异(文件被篡改):
diff -c file1 file2
查找隐藏进程:
ps -ef | awk ‘{print $2}’ | sort -n | uniq > ps.p
ls /proc | sort -n | uniq > proc.p
diff ps.p proc.p
检查日志:
日志主要分三大类:
内核和系统日志:主要由syslog管理,根据文件/etc/syslog.conf决定内核消息和各种系统程序信息记录到哪个位置
用户日志:主要记录系统用户登录或者退出的信息,包括用户名账号,登陆时间,源IP等
应用日志:记录应用程序运行过程中的各种事件信息
日志位置:
/var/log/messages 系统重要信息日志
/var/log/secure 记录验证和授权方面的信息,如ssh登录,su切换用户,添加用户等
/var/log/maillog 记录系统运行电子邮件服务器的日志信息
/var/log/cron 记录系统定时任务相关日志
/var/log/boot.log 记录系统启动时候的日志,包括自启动的任务
/var/log/dmesg 记录内核缓冲信息
/var/log/bmtp 记录所有登陆失败的日志
/var/log/wtmp 用户每次登录进入和退出时间的永久记录
/var/log/lastlog 记录所有用户的最近信息
sudo awk '/sshd.*Failed/ {print $(NF-3)}' /var/log/secure | sort | uniq -c | sort -nr
# 查找每个IP的失败登录次数
sudo grep "sshd.*Failed.*from <IP_ADDRESS>" /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
# 查找特定IP地址的失败记录
sudo grep "sshd.*Accepted.*from <IP_ADDRESS>" /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
# 查找特定IP地址的成功登录
实时检查连接情况:
while true; do netstat -antp | grep [ip]; done
有时安全网关检测到的不全是恶意IP,还有可能是个域名,这种情况下,域名对应的IP是变化的,我们不能直接用上述方法进行监控。我们可以先在host文件中添加一条规则,将恶意域名重定向到一个随机的IP地址,然后对其进行监控。这样就能得到与之通信的恶意进程了。
清除可疑进程:
ps -elf | grep [pid]
kill -9 [pid]
定位删除可疑进程:
ls -al /proc/[pid]/exe rm -f [exe_path]
定位可疑服务:
service –status-all
定位修改文件:
枚举系统文件夹的文件,按修改事件排序查看7天内被修改过的文件:
find /usr/bin/ /usr/sbin/ /bin/ /usr/local/bin/ -type f -mtime +7 | xargs ls -la
定位守护进程:
strace -tt -T -etrace=all -p $pid
查询特权用户:
awk -F: ‘$3==0{print $1}’ /etc/passwd
查询可以远程登录的账号:
awk ‘/$1|$6/{print $1}’ /etc/shadow
除 root 帐号外,其他帐号是否存在 sudo 权限:
more /etc/sudoers | grep -v “^#|^$” | grep “ALL=(ALL)”
禁用或删除多余及可疑的帐号:
usermod -L user 禁用帐号,帐号无法登录,/etc/shadow 第二栏为 ! 开头
userdel user 删除 user 用户
userdel -r user 将删除user用户,并且将/home目录下的user目录一并删除
Linux日志分析(详细)
执行命令日志
添加命令审计
为历史的命令增加登录的IP地址、执行命令时间等信息:
# 保存1万条命令
sed-i's/^HISTSIZE=1000/HISTSIZE=10000/g'/etc/profile
# 在/etc/profile的文件尾部添加如下行数配置信息
USER_IP=`who-uami2>/dev/null|awk'{print$NF}'|sed-e's/[()]//g'` if["$USER_IP"=""] then USER_IP=`hostname` fi exportHISTTIMEFORMAT="%F%T$USER_IP`whoami`" shopt-shistappend exportPROMPT_COMMAND="history-a"
# 让配置生效
source/etc/profile
# root用户的命令日志位置
/root/.bash_history
# 每个用户下面都有1个隐藏的.bash_history
/home/<account>/.bash_history
# root用户下使用cat以及history命令
[root@localhost ~]# cat .bash_history
[root@localhost ~]# history
[root@localhost ~]# history -c
# 该命令可以清空本次登入的所有输出命令,但不清空.bash_history文件,所以下次登陆后,旧命令还将出现。
# 如果说要删除某个旧命令就需要直接编辑.bash_history
fc命令:
fc [-e ename] [-lnr] [first] [last]
fc -s [pat=rep] [command]
fc -s 查找匹配的命令并执行
登录信息:
# 登录认证日志
# 在Ubuntu及Debian下可以查看auth.log日志文件
root@root:~# cat /var/log/auth.log | grep Accepted
Nov 2 11:30:39 kali sshd[1200]: Accepted password for root from 192.168.222.1 port 9184 ssh2
Nov 2 11:30:39 kali sshd[1202]: Accepted password for root from 192.168.222.1 port 9185 ssh2
# 在redhat及Centos下可以查看secure日志文件
[root@localhost ~]# cat /var/log/secure | grep Accepted
Oct 23 17:53:55 localhost sshd[2471]: Accepted password for root from 192.168.222.1 port 4725 ssh2
Oct 23 17:53:55 localhost sshd[2475]: Accepted password for root from 192.168.222.1 port 4726 ssh2
# 简单的格式化输出
[root@localhost ~]# grep "Accepted" /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
Oct 23 17:53:55 root 192.168.222.1
Nov 3 17:11:34 root 192.168.222.1
Nov 25 09:23:02 root 192.168.222.1
# 用户登录日志
# /var/log/lastlog记录每个用户最后的登录信息,需要使用lastlog命令查看
[root@localhost ~]# lastlog
用户名 端口 来自 最后登陆时间
root pts/0 192.168.222.1 一 11月 2 11:26:23 +0800 2020
# 该日志文件永久记录每个用户登录、注销及系统的启动、宕机事件,需要使用last命令查看
[root@localhost ~]# last -f /var/log/wtmp
root pts/0 192.168.222.1 Mon Nov 2 11:26 still logged in
root pts/0 192.168.222.1 Mon Nov 2 11:11 - 11:26 (00:15)
# 该日志文件记录有关当前登录的每个用户的信息,需要使用last命令查看。who、w、users就需要访问这个日志文。
[root@localhost ~]# last -f /var/run/utmp
root pts/0 192.168.222.1 Mon Nov 2 11:26 still logged in
reboot system boot 3.10.0-693.el7.x Mon Nov 2 11:09 - 13:18 (02:08)
# 记录所有失败登录信息,需要使用last命令查看,或者直接使用lastb。
[root@localhost ~]# last -f /var/log/btmp
attack ssh:notty 192.168.222.1 Mon Nov 2 13:21 still logged in
attack ssh:notty 192.168.222.1 Mon Nov 2 13:21 - 13:21 (00:00)
服务日志
# "/var"目录存放系统中常态性变化的文件,如缓存、登录文件、程序运行产生的文件等
# "/var/log"存放日志文件
# crontab日志:查看计划任务运行的相关情况,包括运行日期
[root@localhost ~]# cat /var/log/cron
Nov 2 13:46:01 localhost CROND[3299]: (root) CMD (root ls)
# 记录yum的安装日志
[root@localhost ~]# cat /var/log/yum.log | more
May 20 14:11:42 Installed: wget-1.14-18.el7_6.1.x86_64
May 20 14:18:44 Updated: glib2-2.56.1-5.el7.x86_64
# 每次主机引导启动时加载的内容
[root@localhost ~]# cat /var/log/boot.log
# 存放的是系统的日志信息,它记录了各种事件,基本上什么应用都能往里写日志。
[root@localhost ~]# cat /var/log/messages
## 在系统正常关机以及重启的时候系统会记录关机的跑马灯,并且之后会有近15S日志消失,以此判断系统关机情况。
[root@localhost ~]# cat /var/log/messages | grep "Nov 2 14:09:00"
Nov 2 14:09:00 localhost systemd: Stopped target Timers.
Nov 2 14:09:00 localhost systemd: Stopped target RPC Port Mapper.
Nov 2 14:09:00 localhost systemd: Stopped target Multi-User System.
Nov 2 14:09:00 localhost systemd: Stopping irqbalance daemon...
Nov 2 14:09:00 localhost systemd: Stopping Dynamic System Tuning Daemon...
Nov 2 14:09:00 localhost systemd: Stopping Session 2 of user root.
Nov 2 14:09:00 localhost systemd: Stopped Dump dmesg to /var/log/dmesg.
Nov 2 14:09:00 localhost systemd: Stopped target rpc_pipefs.target.
Nov 2 14:09:00 localhost systemd: Stopping Kernel Samepage Merging (KSM) Tuning Daemon...
Nov 2 14:09:00 localhost systemd: Unmounting RPC Pipe File System...
Nov 2 14:09:00 localhost systemd: Stopping Virtualization daemon...
Nov 2 14:09:00 localhost systemd: Stopping Command Scheduler...
Nov 2 14:09:00 localhost systemd: Stopped target Login Prompts.
Nov 2 14:09:00 localhost systemd: Stopped Daily Cleanup of Temporary Directories.
Nov 2 14:09:00 localhost systemd: Stopping OpenSSH server daemon...
Nov 2 14:09:00 localhost systemd: Stopping Session 3 of user root.
Nov 2 14:09:00 localhost systemd: Stopping Getty on tty1...
常用文本分析命令
grep
“ | “管道符:连接多条命令时,前一个命令执行成功后,将结果交给后一个命令继续执行
“ grep “命令:查找文件里符合条件的字符串
“ | “如果不使用grep命令的任何选项,可以通过使用 ‘|’ 来分割多个pattern,以此实现OR的操作.
[root@localhost ~]# cat /var/log/secure | grep "Accepted\|Failed"
Nov 2 11:26:22 localhost sshd[1718]: Accepted password for root from 192.168.222.1 port 9116 ssh2
Nov 2 13:21:47 localhost sshd[3046]: Failed password for invalid user deepmountains from 192.168.222.1 port 10326 ssh2
Nov 2 13:53:56 localhost sshd[1490]: Accepted password for root from 192.168.222.1 port 9613 ssh2
“ -E “通过指定参数大E的方式,以正则表达式的方式来检索内容
# 检索来自192.168.222.1:9952的连接信息
[root@localhost ~]# cat /var/log/secure | grep -E '192.168.222.1.*9952 ssh2'
Nov 2 14:10:02 localhost sshd[1506]: Accepted password for root from 192.168.222.1 port 9952 ssh2
# egrep命令可以不加-E参数,便直接是正则表达式。
[root@localhost ~]# cat /var/log/secure | egrep -E '192.168.222.1.*9952 ssh2'
“ -e “通过指定参数小e的方式,可以传入多个检索的条件,但是是” 或 “的关系。
[root@localhost ~]# cat /var/log/secure | grep -e "Accepted" -e "Failed"
Nov 2 11:26:22 localhost sshd[1718]: Accepted password for root from 192.168.222.1 port 9116 ssh2
Nov 2 13:21:47 localhost sshd[3046]: Failed password for invalid user deepmountains from 192.168.222.1 port 10326 ssh2
Nov 2 13:53:56 localhost sshd[1490]: Accepted password for root from 192.168.222.1 port 9613 ssh2
多个” grep “以及管道符的串联即可以实现” 与 “的操作。
“ -v “通过指定参数小v的方式,可以实现” not “的操作。
# 第一次grep筛选掉了Accepted关键字,后续egrep的筛选Accepted以及Failed关键字的内容中,就不会含有Accepted。
[root@localhost ~]# cat /var/log/secure | grep -v -E 'Accepted' | egrep "Accepted|Failed"
Nov 2 13:21:47 localhost sshd[3046]: Failed password for invalid user deepmountains from 192.168.222.1 port 10326 ssh2
uniq
uniq命令:检查以删除文本文件重复出现的行/列;当重复的两行不相邻时不起作用,需要结合排序命令sort。
sort命令:将内容以行为单位加以排序,默认规则以字符的ASCII次序进行排序。
# 参数 -n 依照数值的大小排序
# 参数 -r 以相反的顺序来排序
# 参数 -t 设置排序时所用的分隔字符
# 参数 -k 指定需要排序的列
$ sort -t : -nrk 3 /etc/passwd
test:x:1000:1000::/home/test:/bin/bash
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
# 对分割后第三列的数据进行倒叙排序
[root@localhost ~]# lastb | sort | uniq
root ssh:notty 192.168.222.1 Mon Nov 2 13:21 - 13:21 (00:00)
cut
cut命令:从文件中的每一行中截取一部分,并输出到标准输出中
# 参数 –d/自定义分隔符,默认为制表符
# 参数 –f/指定显示哪个区域,如果是“-f 2-”则表示第二个区域之后的所有字符串都输出
# 参数 –c/以字符为单位进行分割
# 检索ssh连接中的源IP地址
[root@localhost ~]# cut -d " " -f 11 /var/log/secure | egrep "^[1-9].*[1-9]$"
192.168.222.1
192.168.222.203
sed
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
# sed [选项参数] ‘command’ filename
# 参数 -e 多条件操作
# 参数 -a 对文件的内容新增,a后面接字符串,在下一行出现
# 参数 -d 删除
# 参数 -s 查找
$ sed '2a tou shang lv you you' sed.txt
chun nuan hua kai
beng ni er lai
tou shang lv you you
.....
$ cat sed.txt
chun nuan hua kai
beng ni er lai
.....
# 注意文件的内容并没有发生改变
$ sed '/ni/d' sed.txt
chun nuan hua kai
.....
# 删除所有包含ni的行
$ sed 's/a//' file
# 删除置顶的字符串,并非删除行
$ sed 's/ni/wo/g' sed.txt
chun nuan hua kai
beng wo er lai
.....
# 将所有的ni替换成wo,s为固定字符
$ sed -e '2d' -e 's/ni/wo/g' sed.txt
chun nuan hua kai
.....
# 使用-e进行多条件操作
awk
Awk是一种处理文本文件的语言,是一个强大的文本分析工具
# "-F"指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式
[root@localhost ~]# awk -F" " '$6=="Accepted"{print $11}' /var/log/secure
192.168.222.1
192.168.222.203
# 在分割数据之后,可以通过表达式来完成内容的筛选。在单引号的内容中传入表达式:
# $6 == "Accepted" :分割后的第6块内容的数据若等于"Accepted"
# {print $11} :则输出第11块的数据内容
## 知识拓展
# "-v"赋予一个用户定义的变量
$ awk -F: '/^root/{print $1","$7}' /etc/passwd
root,/bin/sh
# ":"为分割,以root开头的关键字行,输出$1和$7的组合。
$ awk -F: 'BEGIN{print "user,shell"} {print $1","$7} END{print "----------------------"}' /etc/passwd
user,shell
root,/bin/bash
bin,/sbin/nologin
ftp,/sbin/nologin
nobody,/sbin/nologin
systemd-network,/sbin
test,/bin/bash
----------------------
# 在输出的开头增加字段,在输出的结尾增加字段
$ awk -F: -v i=1 '{print $3+i}' /etc/passwd
1
2
999
1001
# 输出每个用户的uid值+1
## awk内置变量
# FILENAME 文件名
# NR 已读的记录数,说白了切到拿一行了
# NF 浏览记录的域的个数(切割后列的个数)
$ awk -F: '{print "filename:" FILENAME " linenumber:" NR " columns:" NF}' /etc/passwd
filename:/etc/passwd linenumber:1 columns:7
filename:/etc/passwd linenumber:2 columns:7
filename:/etc/passwd linenumber:3 columns:7
$ cat sed.txt
chun nuan hua kai
beng ni er lai
.....
$ awk '/^$/{print NR}' sed.txt
3
# 查询sed.txt文件中空行所在的行号
Linux中间件日志分析
Tomcat日志分析
Tomcat的日志功能默认是被关闭的,我们首先需要通过修改配置文件的方式来打开此功能。
# 配置文件:/<tomcat installation manual>/conf/server.xml
# 把以下的注释(<!-- -->)去掉即可。
root@ubuntu:/home/ctf/apache-tomcat-7.0.91/conf# vim server.xml
<!--
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
-->
root@ubuntu:~# systemctl restart tomcat
# 分析日志文件中源IP的列表
root@ubuntu:/home/ctf/apache-tomcat-7.0.91/logs# awk -F" " '{print $1}' localhost_access_log.2018-11-16.txt | sort | uniq
192.168.43.101
# 被访问次数最多的几个文件
root@ubuntu:/home/ctf/apache-tomcat-7.0.91/logs# awk -F" " '{print $7}' localhost_access_log.2018-11-15.txt | sort | uniq -c | sort -nr | head -n 5
31 /favicon.ico
14 /JspWar/index.jsp
8 /upload/image/cast01.png
4 /ofcms-admin/upload/image/banner04.png
4 /ofcms-admin/upload/image/banner03.png
Apache日志分析
如果apache的安装时采用默认的配置,那么在/logs目录下就会生成两个文件,分别是access_log和error_log。
Access_log:为访问日志,记录所有对apache服务器进行请求的访问。
Error_log:为错误日志,记录下任何错误的处理请求,通常服务器出现什么错误,首先对它进行查阅,是一个最重要的日志文件 。
root@ubuntu:/var/log/apache2# ls
access.log error.log
# 有关站点的配置被存放在了000-default.conf中
root@ubuntu:/etc/apache2/sites-available# pwd
/etc/apache2/sites-available
root@ubuntu:/etc/apache2/sites-available# vim 000-default.conf
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
访问日志的格式在apache2的根安装目录下,默认apache2提供了五种记录日志的格式,所有日志的结尾都有一个名字作为索引。查看站点下的配置,很显然我们使用到的是第二个”combined”的日志记录格式。
“"代表的是转义符;%{XXX}i则是从请求头提取信息。
root@ubuntu:/etc/apache2# vim apache2.conf
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
# 以下是access.log日志中的其中一条
192.168.112.236 - - [12/Sep/2018:17:36:49 +0800] "GET /admin/index.php?n=login&c=login&a=doindex HTTP/1.1" 200 1593 "http://192.168.37.77/admin/index.php?lang=cn&anyid=&n=login&c=login&a=dologin&langset=" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0"
# 定位日志中访问次数最多的IP
root@ubuntu:/var/log/apache2# awk -F" " '{print $1}' access.log|sort|uniq -c |sort -nr|head -n 5
3299 192.168.112.236
49 192.168.112.147
48 192.168.222.1
42 192.168.112.50
39 192.168.37.133
# 输出访问次数大于100次的IP,$0指的是输出所有项
root@ubuntu:/var/log/apache2# cat access.log |cut -d ' ' -f 1 |sort |uniq -c | awk '{if ($1 > 100) print $0}' | sort -nr
3299 192.168.112.236
图形化分析工具:ApacheLogsViewer
添加本地日志文件:本质上使用apache的日志语法都可以导入,包括Tomcat日志。
Nginx日志分析
Nginx的日志存放在/var/log/nginx目录下,同样也存在access_log和error_log之分。
root@ubuntu:~# vim /etc/nginx/nginx.conf
http {
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
}
root@ubuntu:/var/log/nginx# ls
access.log error.log
Nginx的access日志格式在默认情况下在nginx.conf文件中是没有体现的,官方的默认格式如下:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
# 默认格式得到以下日志:
192.168.222.1 - - [23/Nov/2020:11:18:42 +0800] "GET /resource/default/static/assets/image/app.png HTTP/1.1" 404 208 "http://192.168.222.238:81/small" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"
Nginx格式修改:在nginx.conf中通过以下格式书写日志格式
root@ubuntu:~# vim /etc/nginx/nginx.conf
http{
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'$http_host '
' $upstream_response_time $request_time $upstream_addr $geoip_country_code';
access_log /var/log/nginx/access.log main;
}
# 修改格式得到以下日志:
192.168.222.1 - - [23/Nov/2020:14:03:12 +0800] "GET /upload/image/cantact.jpg HTTP/1.1" 404 0 "http://192.168.222.238:82/contact.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36" "-" 192.168.222.238:82 0.002 0.002 192.168.222.240:8080 -
对于错误日志error_log,一共有6个等级,分别是info,notice,warn,error,crit,alert(emerg),默认的输出等级是error,在Nginx.conf文件中也不会有呈现,可以通过在error_log字段结尾处设置级别。
http {
error_log /var/log/nginx/error.log error;
}
# 查看访问最频繁的前10个IP
root@ubuntu:/var/log/nginx# awk '{print $1}' access.log | sort -n |uniq -c | sort -rn | head -n 10
6788 192.168.222.200
106 192.168.222.1
# 查看访问100次以上的IP
root@ubuntu:/var/log/nginx# awk '{print $1}' access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn
# 查询某个IP的详细访问情况,按访问频率排序
root@ubuntu:/var/log/nginx# grep '192.168.222.200' access.log |awk '{print $7}'|sort |uniq -c |sort -rn |head -n 100
301 /
190 /page.html
187 /manager/status
39 /manager/
33 /examples/
# 统计每秒的请求数,top100的时间点(精确到秒)
root@ubuntu:/var/log/nginx# awk '{print $4}' access.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 100
619 15:28:19
523 15:28:20
475 15:28:21
431 15:28:14
# 统计每分钟的请求数,top100的时间点(精确到分钟)
root@ubuntu:/var/log/nginx# awk '{print $4}' access.log |cut -c 14-18|sort|uniq -c|sort -nr|head -n 100
5507 15:28
765 15:31
# 统计每小时的请求数,top100的时间点(精确到小时)
root@ubuntu:/var/log/nginx# awk '{print $4}' access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 100
# 查看访问最频的页面(TOP100)
root@ubuntu:/var/log/nginx# awk '{print $7}' access.log | sort |uniq -c | sort -rn | head -n 100
Nginx日志分析工具——goaccess
在ubuntu中直接通过apt-get install goaccess即可安装,安装完毕后通过goaccess -f access.log -c命令执行
goaccess提供多种日志格式的分析,只要是遵循NCSA以及W3C等格式的日志都可以进行分析,包括IIS、Apache、Tomcat以及Nginx。选择完毕后通过回车进入分析页面。
Mysql日志分析
错误日志
错误日志是最重要的日志之一,它记录了MariaDB/MySQL服务启动和停止正确和错误的信息,还记录了mysqld实例运行过程中发生的错误事件信息。 在默认情况下已经被开启。
在Mysql配置文件my.cnf中可以修改错误日志的存放路径。
root@ubuntu:~# vim /etc/mysql/my.cnf
log_error = /var/log/mysql/error.log
在数据库中可以通过命令行验证error日志的位置。
mysql> show variables like 'log_error';
+---------------+--------------------------+
| Variable_name | Value |
+---------------+--------------------------+
| log_error | /var/log/mysql/error.log |
+---------------+--------------------------+
查询日志
查询日志分为一般查询日志和慢查询日志,它们是通过查询是否超出变量 long_query_time 指定时间的值来判定的。在超时时间内完成的查询是一般查询,可以将其记录到一般查询日志中,但是建议关闭这种日志(默认是关闭的),超出时间的查询是慢查询,可以将其记录到慢查询日志中。
# Mysql一般日志查询功能需要在配置文件中开启
# General为一般查询日志
# General_log_file用来指定一般查询日志存放路径,General_log表示指定是否查询日志功能。
root@ubuntu:~# vim /etc/mysql/my.cnf
general_log_file = /var/log/mysql/mysql.log
general_log = 1
# Mysql慢查询功能开启
# long_query_time用来指定慢查询超时时长,超出此时长的属于慢查询,会记录到慢查询日志中
# log_slow_queries用来指定日志文件存放的位置
root@ubuntu:~# vim /etc/mysql/my.cnf
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 2
# Mysql慢查询日志测试
mysql> select sleep(3);
root@ubuntu:~# cat /var/log/mysql/mysql-slow.log
# Time: 201124 15:24:21
# User@Host: root[root] @ localhost []
# Query_time: 3.000959 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
SET timestamp=1606202661;
select sleep(3);
Mysql慢查询工具使用
随着时间的推移,慢查询日志文件中的记录可能会变得非常多,这对于分析查询来说是非常困难的。好在提供了一个专门归类慢查询日志的工具mysqldumpslow。该工具归类的时候,默认会将同文本但变量值不同的查询语句视为同一类,并使用N代替其中的数值变量,使用S代替其中的字符串变量。可以使用-a来禁用这种替换。
root@ubuntu:~# mysqldumpslow /var/log/mysql/*-slow.log
Reading mysql slow query log from /var/log/mysql/mysql-slow.log
Count: 2 Time=6.50s (13s) Lock=0.00s (0s) Rows=1.0 (2), root[root]@localhost
select sleep(N)
root@ubuntu:~# mysqldumpslow -a /var/log/mysql/*-slow.log
Reading mysql slow query log from /var/log/mysql/mysql-slow.log
Count: 1 Time=10.00s (10s) Lock=0.00s (0s) Rows=1.0 (1), root[root]@localhost
select sleep(10)
Count: 1 Time=3.00s (3s) Lock=0.00s (0s) Rows=1.0 (1), root[root]@localhost
select sleep(3)
二进制日志
二进制日志主要用来记录操作MySQL数据库中的写入性操作(增删改,但不包括查询)。二进制日志的作用:1、用于复制,配置了主从复制的时候,主服务器会将其产生的二进制日志发送到slave端,slave端会利用这个二进制日志的信息在本地重做,实现主从同步。2、用户恢复,MySQL可以在全备和差异备份的基础上,利用二进制日志进行基于时间点或者事物Id的恢复操作。原理雷同于主从复制的日志重做。
root@ubuntu:~# vim /etc/mysql/my.cnf
log_bin = /var/log/mysql/mysql-bin.log # 二进制日志文件存放的位置
expire_logs_days = 10
# 二进制日志存放的最长时间,超过时间为过期。每次进行"LOG flush"的时会自动删除过期的日志。
max_binlog_size = 100M
# 二进制日志存放的最大大小
#binlog_do_db = include_database_name
# 记录某一个数据库增删改的二进制文件
#binlog_ignore_db = include_database_name
# 不记录某一个数据库增删改的二进制文件
# 二进制日志测试
mysql> create database db;
Query OK, 1 row affected (0.01 sec)
root@ubuntu:~# strings /var/log/mysql/mysql-bin.000001
5.5.61-0ubuntu0.14.04.1-log
create database db
# 很明显就可以看出来192.168.222.200在进行爆破,但是是否有爆破成功不得而知
root@ubuntu:~# awk -F "Connect" '{print $2}' /var/log/mysql/mysql.log | sort | uniq -c
3 Access denied for user 'root'@'192.168.222.200' (using password: NO)
1871 Access denied for user 'root'@'192.168.222.200' (using password: YES)
1 Access denied for user 'root'@'localhost' (using password: YES)
1878 root@192.168.222.200 on
2 root@localhost as on
3 root@localhost on
# 我们可以看到ID 3816对应的连接,并没有返回Access denied,表示攻击者登录成功。
root@ubuntu:~# cat /var/log/mysql/mysql.log
3814 Connect root@192.168.222.200 on
3814 Connect Access denied for user 'root'@'192.168.222.200' (using password: YES)
3815 Connect root@192.168.222.200 on
3815 Connect Access denied for user 'root'@'192.168.222.200' (using password: YES)
3816 Connect root@192.168.222.200 on
其他
还有蜜罐 溯源 反制(hunter back)等内容待有空补充