最近遇到的安全事件很多,但排查出原因的很少,在这个过程也学到了很多东西,记录一下,以便下次在遇到安全事件的时候,能够快速的分析。
溯源思路
最近遇到的安全事件,被入侵原因主要两种
- ssh登录入侵:ssh密码爆破入侵,ssh密钥登录入侵,查secure日志
- web漏洞入侵:如 showdoc漏洞,gitlab 漏洞,查web access.log
排查思路
查进程
在排查过程中有时会忽略进程,因为觉得入侵者会隐藏进程,但经过多次事件后,发现进程是隐藏不了的,是自己看的不够仔细。
以下两个命令,都可以查看所有进程,区别在于:
如果想查看进程的CPU占用率和内存占用率,可以使用aux
如果想查看进程的父进程ID和完整的COMMAND命令,可以使用ef
ps -ef
ps -aux
为了更好的判断是否有异常进程,还可以查看所有进程的可执行文件,加入有tmp文件什么的就很可疑。
ls -al /proc/*/exe
或者查某个可疑进程的可执行文件
ls -al /proc/pid/exe
查到可以文件,可计算一下md5值,去威胁情报平台进行查询
md5sum /tmp/.tmp
遇到无文件攻击的情况,
可使用 lsof :列出当前系统打开文件的工具。
常见用法
通过某个进程号显示该进行打开的文件
lsof -p 1
列出多个进程号对应的文件信息
lsof -p 123,456,789
列出除了某个进程号,其他进程号所打开的文件信息
lsof -p ^1
列出所有的网络连接
lsof -i
列出所有tcp 网络连接信息
lsof -i tcp/udp
列出谁在使用某个端口
lsof -i :3306
列出谁在使用某个特定的udp端口
lsof -i udp:55
特定的tcp端口
lsof -i tcp:80
列出某个用户的所有活跃的网络端口
lsof -a -u test -i
查看谁正在使用某个文件
lsof /filepath/file
递归查看某个目录的文件信息
lsof +D /filepath/filepath2/
备注: 使用了+D,对应目录下的所有子目录和文件都会被列出
比使用+D选项,遍历查看某个目录的所有文件信息 的方法
lsof | grep ‘/filepath/filepath2/’
列出某个用户打开的文件信息
lsof -u username
列出某个程序所打开的文件信息
lsof -c mysql
备注: -c 选项将会列出所有以mysql开头的程序的文件,其实你也可以写成lsof | grep mysql,但是第一种方法明显比第二种方法要少打几个字符了
列出多个程序多打开的文件信息
lsof -c mysql -c apache
列出某个用户以及某个程序所打开的文件信息
lsof -u test -c mysql
列出除了某个用户外的被打开的文件信息
lsof -u ^root
备注:^这个符号在用户名之前,将会把是root用户打开的进程不让显示
列出所有网络文件系统
lsof -N
域名socket文件
lsof -u
某个用户组所打开的文件信息
lsof -g 5555
根据文件描述列出对应的文件信息
lsof -d description(like 2)
根据文件描述范围列出文件信息
lsof -d 2-3
当通过查看进程或 lsof发现可疑文件时,假如磁盘中能找到该文件,应使用stat命令,查看文件创建相关信息,为溯源提供线索。
stat aa.tmp
如果不是无文件攻击,可用find 去找通过进程定位出的恶意文件,并计算md5值
xargs:捕获前一个命令的输出,作为后一个名令的输入。
find /tmp -name ".*" | grep ".tmp_" | xargs -i md5sum {}
假如磁盘中使用ls -a
找不到进程对应的文件,则可先使用df 查看文件系统
df
假如查文件系统为 /dev/vda1 然后利用debugfs 查看对应文件的信息
debugfs /dev/vda1 -R "stat /tmp/.tmp_hIyaG4WFgIX8uP4cVjjbu"
查加载到内核的进程:
**lsmod 显示已经加载到内核中的模块的状态信息。**
遍历/proc目录中所有正在运行的进程,
ls -alR /proc/*/exe 2> /dev/null | grep memfd:.*(deleted)
/dev/null是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃。
2>/dev/null的意思就是将标准错误stderr删掉。
查登录日志
查secure 日志
less /var/log/secure | grep Accept | grep "Jul 16"
查看secure日志中的ip并
sort -n 纯数字排序输出
sort -u去重输出
uniq -c 计算每行连续出现的次数
cat /var/log/secure | grep 'Failed password' | grep -oE "\d+\.\d+\.\d+\.\d+" | sort -n | uniq -c
less /var/log/secure | grep Accept | less
如果发现异常登录,还要查.ssh文件看攻击者是否写入公钥
cd .ssh
cat authorized_keys
除了查日志,还可使用命令查最近登录记录。
last:用于显示用户最近登录信息。
单独执行 last 指令,它会读取位于 /var/log/目录下,名称为 wtmp 的文件,并把该文件记录登录的用户名,全部显示出来。
显示前5行,最后一列显示主机ip地址。
last -n 5 -a -i
lastb列出登入系统失败的用户相关信息。
单独执行 lastb 指令,它会读取位于 /var/log 目录下,名称为 btmp 的文件,并把该文件记录登入失败的用户名,全部显示出来。
查历史命令
history
cat /root/.bash_history
cat /home/kxl/.bash_history
还可以查 messages日志。
查计划任务
sudo crontab -l
ls /etc/crontab
ls /var/spool/cron
查网络连接
netstat -atlp
-a或--all 显示所有连线中的Socket。
-A<网络类型>或--<网络类型> 列出该网络类型连线中的相关地址。
-c或--continuous 持续列出网络状态。
-C或--cache 显示路由器配置的快取信息。
-e或--extend 显示网络其他相关信息。
-F或--fib 显示路由缓存。
-g或--groups 显示多重广播功能群组组员名单。
-h或--help 在线帮助。
-i或--interfaces 显示网络界面信息表单。
-l或--listening 显示监控中的服务器的Socket。
-M或--masquerade 显示伪装的网络连线。
-n或--numeric 直接使用IP地址,而不通过域名服务器。
-N或--netlink或--symbolic 显示网络硬件外围设备的符号连接名称。
-o或--timers 显示计时器。
-p或--programs 显示正在使用Socket的程序识别码和程序名称。
-r或--route 显示Routing Table。
-s或--statistics 显示网络工作信息统计表。
-t或--tcp 显示TCP传输协议的连线状况。
-u或--udp 显示UDP传输协议的连线状况。
-v或--verbose 显示指令执行过程。
-V或--version 显示版本信息。
-w或--raw 显示RAW传输协议的连线状况。
-x或--unix 此参数的效果和指定"-A unix"参数相同。
--ip或--inet 此参数的效果和指定"-A inet"参数相同。
关闭可疑网络连接对应的进程:
lsof -i:port
找到对应进程
kill -9 pid
常见工具
busybox
wget https://busybox.net/downloads/binaries/1.30.0-i686/busybox
chmod 755 busybox
hm
https://www.shellpub.com/doc/hm_linux_usage.html
wget -O /opt/hm-linux.tgz http://dl.shellpub.com/hm/latest/hm-linux-amd64.tgz?version=1.7.0
深信服 webshell查杀
https://edr.sangfor.com.cn/#/introduction/wehshell
chmod u+x wscan
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
./wscan -hrf /www/wwwroot/app_805ds_com