a. 收集信息:收集告警信息、客户反馈信息、设备主机信息等
b. 判断类型:安全事件类型判断。(钓鱼邮件、Webshll、爆破、中毒等)
c. 控制范围:隔离失陷设备
d. 分析研判:根据收集回来的信息进行分析e. 处置:根据事件类型进行处置(进程、文件、邮件、启动项、注册表排查等)
f. 输出报告
/etc/passwd 查看用户信息文件
/etc/shadow 查看影子文件
awk -F: '$3==0{print $1}' /etc/passwd (查看系统是否还存在其他的特权账户,uid为0,默认系统只存在root一个特权账户)
who 查看当前登录用户(tty 本地登陆 pts 远程登录)
w 查看系统信息,想知道某一时刻用户的行为
uptime 查看登陆多久、多少用户,负载
passwd -d username 删除用户密码
stat /etc/passwd #查看密码文件上一次修改的时间,如果最近被修改过,那就可能存在问题。
cat /etc/passwd | grep -v nologin #查看除了不可登录以外的用户都有哪些,有没有新增的
cat /etc/passwd | grep x:0 #查看哪些用户为root权限,有没有新增的
cat /etc/passwd | grep /bin/bash #查看哪些用户使用shell
查询可以远程登录的账号:awk ‘/\$1|\$6/{print $1}’ /etc/shadow
查询具有sudo权限的账号:more /etc/sudoers | grep -v “^#\|^$” grep “ALL=(ALL)”
很多的服务器会有存在多用户登陆情况,登陆root用户可查看其他用户的相关账户登录信息,.bash_history保存了用户的登陆所操作的命令信息
home/root/.bash_history
history查看历史命令
cat .bash_history >>history.txt 保存历史命令
`netstat –antp` #查看对应链接的文件路径
ls -l /proc/pid/exe ls -l /proc/*/exe | grep xxx #如果我们知道恶意程序的启动文件大致位置,可以使用这个发现无文件的恶意进程
netstat -antlp | grep 172.16.222.198 | awk '{print $7}' | cut -f1 -d"/" 通过可疑的ip地址获取程序pid
ps -aux #查看相关pid对应程序
ps –aux | grep pid #监控某一应用线程数(如ssh)
ps -eLf | grep ssh| wc –l #监控网络客户连接数
netstat -n | grep tcp | grep 侦听端口 | wc -l
ps aux --sort=pcpu | head -10 #查看cpu占用率前十的进程,有时候可以发现
启动项文件:
more /etc/rc.local
/etc/rc.d/rc[0~6].d
ls -l /etc/rc.d/rc3.d/
crontab -l #编辑定时任务
crontab –e/crontab -u root –l #查看root用户任务计划
ls /var/spool/cron/ #查看每个用户自己的执行计划
#删除计划任务且控制计划任务不能写东西
sed '/gcc.sh/d' /etc/crontab && chmod 0000 /etc/crontab && chattr +i /etc/crontab
常见的定时任务文件:
/var/spool/cron/* #centos的
/var/spool/cron/crontabs/* #ubuntu的
/var/spool/anacron/*
/etc/crontab
/etc/anacrontab
/etc/cron.hourly/*
/etc/cron.daily/*
/etc/cron.weekly/
/etc/cron.monthly/*
chkconfig #查看开机启动项目
chkconfig --list (systemctl list-unit-files |grep enabled
)#查看服务自启状态
find /home1 -name *.php ! -name index.php #find查找指定的文件
find查看最近一天修改的文件: find / -mtime -1 > /etc/aa.txt#(查看修改的文件并保存到aa的txt文档)
find . -name .svn | xargs rm –rf #查找并删除
find / -size +10000k -print:#查找大于10000k的文件
md5sum -b filename:#查看文件的md5值
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。
默认top是根据cpu的占用情况进行排序的
可通过按“b”键进行切换,可切换到按照内存使用情况进行排序
top -p pid #监控指定进程
free #查看当前系统内存使用情况
top -b -n1 | head
有一些挖矿程序会修改 /etc/hosts文件
默认日志位置:var/log
1、定位有多少IP在爆破主机的root帐号:
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
定位有哪些IP在爆破:
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c
爆破用户名字典是什么?
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr
2、登录成功的IP有哪些:
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
登录成功的日期、用户名、IP:
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
Linux中的命令,Diff,可以查看两个文本文件的差异。
很多情况下,存在ps、netstat等一些常见命令被替换,可利用stat查看该状态,查看其修改时间
stat /bin/netstat
很多时候会遇到无法查看文件权限或是病毒在一直向某个文件写入程序,可尝试如下命令:
lsattr [恶意文件绝对路径]命令查看权限,
使用chattr -i [恶意文件绝对路径]解除文件锁定后删除。
chmod 0000 /lib/libudev.so && rm -rf /lib/libudev.so && chattr +i /lib/(chattr +i不让lib文件被写入删除)
结束某一进程:
Kill -9 pid
query user 查看当前登录账户
logoff ID 注销用户id
net user 查看用户
net user username 查看用户登录情况
lusrmgr.msc 打开本地用户组
regedit注册表查看账户,确认系统是否存在隐藏账户
利用LogParser.exe查看event日志,查询用户登录情况
LogParser.exe -i:EVT "SELECT TimeGenerated,EXTRACT_TOKEN(Strings,5,'|') AS USERNAME,EXTRACT_TOKEN(Strings,5,'|') AS SERVICE_NAME,EXTRACT_TOKEN(Strings,5,'|') AS Client_IP FROM 'C:\Users\haha\Desktop\Security.evtx' WHERE EventID=4624"
LogParser.exe日志分析工具更多用法可参考:
https://wooyun.js.org/drops/windows安全日志分析之logparser篇.html
查看目前连接:
netstat -ano
一般是查看已经成功建立的连接:
netstat -ano | findstr "ESTABLISHED"
根据pid定位程序名称
tasklist | findstr "pid"
运行中输入msinfo32,可打开系统信息,在“正在运行任务”中可获取进程详细信息,包括进程的开始时间、版本、大小等信息。
根据端口查看pid
netstat -ano | findstr "8080"
利用wmic查看进程执行时的命令
Wmic process where name='irefox.exe' get name,Caption,executablepath,CommandLine ,processid,ParentProcessId /value
Wmic process where processid='2040' get name,Caption,executablepath,CommandLine ,processid,ParentProcessId /value
msconfig查看系统启动项
查看注册表是否有异常启动项
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Runonce
Cmd下运行schtasks(win7系统利用at),查看定时任务
C:\Windows\System32\Tasks 查看任务清单
删除任务计划
建议删除任务计划时以管理员登录
SchTasks /Delete /TN 任务计划名称
Services.msc
删除服务可从任务管理器中手动删除,也可使用命令:
sc stop [服务名称]停止服务后,
sc delete [服务名称]删除服务
查看最近打开的文件,运行窗口中输入“%UserProfile%\Recent”
基于PDCERF模型将应急响应分成6个阶段工作:准备(Preparation)、检测(Detection)、抑制(Containment)、根除(Eradication)、恢复(Recovery)、跟踪(Follow-up)。
1.Prepare(准备):分析资产的风险、组建管理 人员团队、风险加固、保障资源储备、技术支持资源库
2.Detection(检测):日常运维监控、事件判断、事件上报:包括防火墙、系统、web服务器、IDS/WAF/SIEM中的日志,不正常或者是执行了越权操作的用户,甚至还有管理员的报告
3.Containment(抑制):抑制阶段的主要任务是限制事件扩散和影响的范围。抑制举措往往会对合法业务流量造成影响,最有效的抑制方式是尽可能地靠近攻击的发起端实施抑制
4.Eradication(根除):根除阶段的主要任务是通过事件分析查明事件危害的方式,并且给出清除危害的解决方案。
对事件的确认仅是初步的事件分析过程。事件分析的目的是找出问题出现的根本原因。在事件分析的过程中主要有主动和被动2种方式。主动方式是采用攻击诱骗技术,通过让攻击方去侵入一个受监视存在漏洞的系统,直接观察到攻击方所采用的攻击方法。被动方式是根据系统的异常现象去追查问题的根本原因。
5.Recover(恢复):主要任务是把被破坏的信息彻底地还原到正常运作状态。确定使系统恢复正常的需求和时间表、从可信的备份介质中恢复用户数据、打开系统和应用服务、恢复系统网络连接、验证恢复系统、观察其他的扫描、探测等可能表示入侵者再次侵袭的信号。
6.Follow-Up(跟踪):主要任务是回顾并整合应急响应过程的相关信息,进行事后分析总结、修订安全计划、政策、程序并进行训练以防止再次入侵,基于入侵的严重性和影响,确定是否进行新的风险分析、给系统和网络资产制定一个新的目录清单、如果需要,参与调查和起诉。这一阶段的工作对于准备阶段工作的开展起到重要的支持作用。应急响应报告、应急事件调查、应急响应总结
# 禁用或删除多余及可疑的帐号
usermod -L user # 禁用帐号,帐号无法登录,/etc/shadow 第二栏为 ! 开头
userdel user # 删除 user 用户
userdel -r user # 将删除 user 用户,并且将 /home 目录下的 user 目录一并删除
# 历史命令
history
# 进入用户目录下,导出历史命令
cat .bash_history >> history.txt
# 使用 netstat 网络连接命令,分析可疑端口、IP、PID
netstat -antlp | more
# 查看下 pid 所对应的进程文件路径
ls -l /proc/$PID/exe 或 file /proc/$PID/exe($PID 为对应的 pid 号)
# 使用 ps 命令,分析进程
ps aux | grep pid
ps -ef | grep pname
# 查看运行级别命令
runlevel
# 系统默认允许级别
vi /etc/inittab
id=3:initdefault #系统开机后直接进入哪个运行级别
# 开机启动配置文件
/etc/rc.local
/etc/rc.d/rc[0~6].d
# 利用 crontab 创建计划任务
# 基本命令
crontab -l # 列出某个用户cron服务的详细内容
crontab -r # 删除每个用户cront任务(谨慎:删除所有的计划任务)
crontab -e # 使用编辑器编辑当前的crontab文件
# 服务自启动
# 第一种修改方法:
chkconfig [--level 运行级别] [独立服务名] [on|off]
chkconfig –level 2345 httpd on # 开启自启动
chkconfig httpd on # (默认 level 是2345)
# 第二种修改方法:
# 修改 /etc/re.d/rc.local 文件
# 加入 /etc/init.d/httpd start
# 第三种修改方法:
# 使用 ntsysv 命令管理自启动,可以管理独立服务和 xinetd 服务。
# 查看敏感目录,如 /tmp 目录下的文件,同时注意隐藏文件夹,以“..”为名的文件夹具有隐藏属性
# 得到发现 WEBSHELL、远控木马的创建时间,如何找出同一时间范围内创建的文件?
# 可以使用 find 命令来查找,如 find /opt -iname "*" -atime 1 -type f 找出 /opt 下一天前访问过的文件
# 针对可疑文件可以使用 stat 进行创建修改时间。
# 日志默认存放
日志默认存放位置:/var/log/
查看日志配置情况:more /etc/rsyslog.conf
比较重要的几个日志:
/var/log/btmp
(lastb
)/var/log/lastlog
(lastlog
)/var/log/wtmp
(last
)/var/log/secure
/var/run/utmp
(w
, who
, users
)历史命令记录:history
仅清理当前用户:history -c
日志文件 |
说明 |
/var/log/cron |
记录了系统定时任务相关的日志 |
/var/log/cups |
记录打印信息的日志 |
/var/log/dmesg |
记录了系统在开机时内核自检的信息,也可以使用 dmesg 命令直接查看内核自检信息 |
/var/log/mailog |
记录邮件信息 |
/var/log/message |
记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件 |
/var/log/btmp |
记录错误登录日志,这个文件是二进制文件,不能直接 vi 查看,而要使用 lastb 命令查看 |
/var/log/lastlog |
记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接 vi,而要使用 lastlog 命令查看 |
/var/log/wtmp |
永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接 vi,而需要使用 last 命令来查看 |
/var/log/utmp |
记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接 vi,而要使用 w, who, users 等命令来查询 |
/var/log/secure |
记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如 SSH 登录,su 切换用户,sudo 授权,甚至添加用户和修改用户密码都会记录在这个日志文件中 |
root
帐号:grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?\\[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.[0-9]+"|uniq -c
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\\n";}'|uniq -c|sort -nr
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
kali
日志:Jul 10 00:12:15 localhost useradd[2382]: new group: name=kali, GID=1001
Jul 10 00:12:15 localhost useradd[2382]: new user: name=kali, UID=1001, GID=1001, home=/home/kali, shell=/bin/bash
Jul 10 00:12:58 localhost passwd: pam_unix(passwd:chauthtok): password changed for kali
grep "useradd" /var/log/secure
kali
日志:Jul 10 00:14:17 localhost userdel[2393]: delete user 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed group 'kali' owned by 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed shadow group 'kali' owned by 'kali'
grep "userdel" /var/log/secure
su
切换用户:Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid=0)
sudo
授权执行:sudo -l
Jul 10 00:43:09 localhost sudo: good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now
软件安装升级卸载日志:
yum install gcc
[root@bogon ~]# more /var/log/yum.log
Jul 10 00:18:23 Updated: cpp-4.8.5-28.el7_5.1.x86_64
Jul 10 00:18:24 Updated: libgcc-4.8.5-28.el7_5.1.x86_64
Jul 10 00:18:24 Updated: libgomp-4.8.5-28.el7_5.1.x86_64
Jul 10 00:18:28 Updated: gcc-4.8.5-28.el7_5.1.x86_64
Jul 10 00:18:28 Updated: libgcc-4.8.5-28.el7_5.1.i686
%SystemRoot%\\System32\\Winevt\\Logs\\System.evtx
%SystemRoot%\\System32\\Winevt\\Logs\\Application.evtx
%SystemRoot%\\System32\\Winevt\\Logs\\Security.evtx
Logparser.exe –i:EVT –o:DATAGRID "SELECT * FROM c:\\xx.evtx"
LogParser.exe -i:EVT –o:DATAGRID "SELECT * FROM c:\\Security.evtx where EventID=4624"
指定登录时间范围的事件:
LogParser.exe -i:EVT –o:DATAGRID "SELECT * FROM c:\\Security.evtx where TimeGenerated>'2018-06-19 23:32:11' and TimeGenerated<'2018-06-20 23:34:00' and EventID=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 * FROM c:\\Security.evtx where EventID=4625"
提取登录失败用户名进行聚合统计:
LogParser.exe -i:EVT "SELECT EXTRACT_TOKEN(Message,13,' ') as EventType,EXTRACT_TOKEN(Message,19,' ') as user,count(EXTRACT_TOKEN(Message,19,' ')) as Times,EXTRACT_TOKEN(Message,39,' ') as Loginip FROM c:\\Security.evtx where EventID=4625 GROUP BY Message"
系统历史开关机记录:
LogParser.exe -i:EVT –o:DATAGRID "SELECT TimeGenerated,EventID,Message FROM c:\\System.evtx where EventID=6005 or EventID=6006"
其他日志分析工具介绍
ls -l
看不到隐藏文件。ls -al
/tmp
下,默认存在多个隐藏目录,这些目录是恶意文件常用来藏身的地方。如/temp/.ICE-unix/
、/temp/.Test-unix/
、/temp/.X11-unix/
、/temp/.XIM-unix/
touch -r index.php webshell.php #将index.php的时间戳赋给webshell.php
touch -t 1401021042.30 webshell.php #修改时间戳为2014 年 01 月 02日
stat webshell.php #查看
ls -al --time=ctime webshell.php
说明 :chmod
、chown
等修改文件权限、所有者,所属组的操作,会更新atime
和ctime
的值。
chattr
命令来防止root
和其他管理用户误删除和修改重要文件及目录,此权限用ls -l
是查看不出来的,从而达到隐藏权限的目的。chattr +i evil.php #锁定文件
lsattr evil.php #属性查看
chattr -i evil.php #解除锁定
rm -rf 1.evil.php #删除文件
[space]set +o history
[space]
表示空格。并且由于空格的缘故,该命令本身也不会被记录。history | grep “keyword“
,上述命令执行后,会输出历史记录中匹配的命令,每一条前面会有个数字。从历史记录中删除那个指定的项:history -d [num]
sed -i '150,$d' .bash_history
.bash_history
文件[Space]set -o history
w
、who
、last
等指令检测到。ssh -T [email protected] /bin/bash –i
.ssh
目录中ssh -o UserKnownHostsFile=/dev/null -T user@host /bin/bash –i
IPTables
进行端口复用# 端口复用链
iptables -t nat -N LETMEIN
# 端口复用规则
iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22
# 开启开关
iptables -A INPUT -p tcp -m string --string 'threathuntercoming' --algo bm -m recent --set -name letmein --rsource -j ACCEPT
# 关闭开关
iptables -A INPUT -p tcp -m string --string 'threathunterleaving' --algo bm -m recent --name letmein --remove -j ACCEPT
# let's do it
iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 -name letmein --rsource -j LETMEIN
Netstat
查看监听端口linux-inject
github
项目地址: https://github.com/gaffe23/linux-inject.git# 下载程序编译
git clone
cd linux-inject && make
# 测试进程
./sample-target
# 进程注入
./inject -n sample-target sample-library.so
unhide
是一个小巧的网络取证工具,能够发现那些借助rootkit
、LKM
及其它技术隐藏的进程和TCP / UDP
端口。这个工具在Linux
,UNIX
类,MS-Windows
等操作系统下都可以工作。# 安装
sudo yum install unhide
# 使用
unhide [options] test_list
使用unhide proc
发现隐藏进程evil_script.py
攻击者在获取服务器权限后,通常会用一些后门来维持权限。如果想让后门保持得更久些,就需要隐藏好它,使之不易被管理员发现。
常见的后门维持方式包括:
最简单的一种隐藏文件的方式是,右键点击文件,选择属性,勾选“隐藏”选项,然后点击确定。这样文件就被隐藏了。
点击查看,勾选显示隐藏的文件,文件就会显示出来。
使用Attrib +s +a +h +r命令是把原本的文件夹增加了系统文件属性、存档文件属性、只读文件属性和隐藏文件属性。
attrib +s +a +h +r D:\\test\\project\\test.txt
打开电脑文件夹选项卡,取消”隐藏受保护的操作系统文件“勾选,把”隐藏文件和文件夹“下面的单选选择“显示隐藏的文件、文件夹和驱动器”。
在服务器上echo一个数据流文件进去,比如index.php是网页正常文件,我们可以这样搞:
echo ^ > index.php:hidden.jpg
这样子就生成了一个不可见的shell hidden.jpg,常规的文件管理器、type命令,dir命令、del命令发现都找不出那个hidden.jpg。
dir /r
删除index.php:hidden.jpg即可。
驱动隐藏可以用一些软件来实现,软件名字叫:Easy File Locker。
确认是否隐藏。如果网站目录未查找到相关文件,且系统目录存在以下文件:
那么应该是遭遇了驱动级文件隐藏。
1.查询服务状态:
sc qc xlkfs
1.停止服务:
net stop xlkfs
服务停止后,经驱动级隐藏的文件即可显现。
1.删除服务:
sc delete xlkfs
1.删除系统目录下面的文件,重启系统,确认服务已经被清理了。
可以使用CMD命令行下建立一个用户名为“test$”,密码为“abc123!”的简单隐藏账户,并且把该隐藏账户提升为管理员权限。
使用D盾_web查杀工具,使用克隆账号检测功能进行查看,可检测出隐藏、克隆账号。
可以使用WinRM服务或者其他的工具实现端口复用。
复用时会在安全日志中留下痕迹。
进程注入是病毒木马的惯用手段,同时,它也是一种隐藏技术。
如果需要在Windows命令行窗口中执行以下命令,可以把命令放在三个反引号之间的代码块中,或者使用“```cmd”标记。比如:
echo hello
隐藏文件的方式还有很多,比如伪装成一个系统文件夹图标,利用畸形文件名、保留文件名无法删除,甚至取一个与系统文件很像的文件名并放在正常目录里面,很难辨别出来。这些隐藏文件的方式早已不再是秘密,而更多的恶意程序开始实现“无文件”攻击,这种方式极难被发现。