下周一 一年一度的护网即将开始,不同以往,据传今年开始常态化护网,时长2个月之久。作为蓝队如何快速排查入侵?
本文总结了一些Linux常用的命令,可帮助新手快速排查入侵痕迹
隐藏进程排查
ps -ef | awk '{print}' | sort | uniq > 1 && ps -ef | awk '{print}' | sort | uniq > 2 && diff 1 2
进程资源排查
使用top命令查看所有进程消耗资源的情况,并未发现异常进程,没有预期的CPU或MEM占用过高的进程。
top
查看进程路径
lsof -p PID
进程模块查看
pmap 【PID】
查看进程的子进程
pstree -asp 【PID】
查看进程启动目录和启动程序(内存程序路径查看)
ls -l /proc/【PID】/cwd /proc/【PID】/exe
进程跟踪
strace -p 【PID】 跟踪一个已经存在的进程
strace 【cmd】 跟踪命令执行过程
额外参数
-t 打印时间
-T 打印时间消耗
抓包
tcpdump -i eth0 (host 93.240.52.232 and port 3389) or (host 139.99.125.38 and port 443) -w dhpcd.pcap
计划任务排查
排查计划任务
find /etc/*cron* ! -type d -exec ls -lctr --full-time {} + 2>/dev/null
find /var/spool/cron -type f -exec ls -lctr --full-time {} + 2>/dev/null
启动项
find /etc/rc.d/ -type f -exec ls -lctr --full-time {} + 2>/dev/null
自启动服务
chkconfig --list
或
service --status-all
命令别名
alias
排查别名命令
find / -name *bashrc* -type f -exec ls -lctr --full-time {} + 2>/dev/null
二、文件及敏感目录排查
文件查看
-a:查看所有文件 -l:按照时间顺序列出 -t:倒序
ls -alt
排查临时目录
find /tmp ! -type d -exec ls -lctr --full-time {} + 2>/dev/null
排查Home目录
find $HOME ! -type d -exec ls -lctr --full-time {} + 2>/dev/null
特权文件排查
find / -perm 2000 2>/dev/null
按照时间文件排查
find / -newerct '2024-01-24 08:10:00' ! -newerct '2024-01-24 09:10:00' ! -path '/proc/*' ! -path /'sys/*' ! -path '/run/*' -type f -exec ls -lctr --full-time {} + 2>/dev/null
文件创建及修改时间查询
stat 【文件名路径/文件名】
查看文件被哪个进程使用
lsof 【文件路径/文件名】
找到的文件可放入在线沙箱中分析,如微步、
三、后门账户排查
SSH登录账户
排查可以登录SSH的账户
cat /etc/passwd | grep -v nologin$
排查UID是0的超级权限账户
cat /etc/passwd | awk -F: '$3==0 {print $1}'
排查有口令的SSH账户
cat /etc/shadow | awk -F: 'length($2)>2 {print $1}'
排查空口令账户
cat /etc/shadow | awk -F: 'length($2)==0 {print $1}'
SSH登录密钥
cat /root/.ssh/authorized_keys
四、后门程序排查
Linux后门启动方式
开机启动脚本文件
/etc/rc.local
服务启动脚本文件
/ect/init.d/
crond 计划任务
查看计划任务列表
cat /etc/crontab
crontab -l
环境变量设置
包括 :
/etc/profile .bash_profile .bash_login .bash_logout
/etc/profile
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从/etc/profile.d目录的配置文件中搜
集shell的设置。影响所有用户。
~/.bash_profile
每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置
一些环境变量,执行用户的.bashrc文件。
~/.bashrc
该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
~/.bash_logout
当每次退出系统(退出bash shell)时,执行该文件。
文件修改
文件替换
一般使用恶意程序替换常用程序,例如:ls、ps、lsof、netstat等
文件别名
临时设置:alias 自定义命令=‘命令或脚本语句‘,例如:alias show= 'ls -al’
永久设置:修改配置文件~/.bashrc,命令与上面相同
SSHD软连接后门
建立sshd的软连接方法,开启其它的端口例如
Linux后门关键技术
预加载技术
我们以劫持系统execve和open函数为例讲解:
假设有个正常程序(使用execve和open函数),openfile.c:
劫持程序源码(重写了系统标准库内的execve和open函数)hack.c
编译:
gcc -o openfile openfile.c
gcc -fpic -c -ldl hack.c
gcc -shared -lc -o hack.so hack.o
测试执行(未预加载时):
测试执行(预加载后):
SUID权限位
SUID 是 Set User ID 。SUID的作用:当运行被设置了SUID属性的程序时,无论是谁,只要拥有程序的执
行权,即可以该程序所有者身份访问系统资源。例如passwd、ping等:
进程注入
使用ptrace向已运行进程中注入.so并执行相关函数,其中的“注入”二字的真正含义为:此.so被link
到已运行进程空间中,从而.so中的函数在目标进程空间中有对应的地址,然后通过此地址便可在目
标进程中进行调用
方法
Ø 1、在目标进程中找到存放“加载.so的实现代码“的空间(通过mmap实现)
Ø 2、把“加载.so的实现代码“写入目标进程指定的空间
Ø 3、启动执行
Linux 后门排查方法
RPM包可信校验
rpm -Vf
校验所有安装包
rpm -V -a
系统升过级,使用该命令也会提示被修改
别名查询
alias
网站后门排查
排查上传文件目录PHP文件
find ./ -name "*.php"
排查web目录下新创建文件
find / -ctime -l
批量过滤关键字如:eval等
grep eval /var/www/html/*
find ./ | xargs grep eval
条件允许情况下使用D盾等工具查杀
五、日志分析
Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息。本文简介一下Linux系统日志及日志分析技巧。
日志默认存放位置:/var/log/
查看日志配置情况:more /etc/rsyslog.conf
日志文件 |
说明 |
/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授权,甚至添加用户和修改用户密码都会记录在这个日志文件中 |
比较重要的几个日志:
登录失败记录:/var/log/btmp //lastb
最后一次登录:/var/log/lastlog //lastlog
登录成功记录: /var/log/wtmp //last
登录日志记录:/var/log/secure
历史命令记录:history
仅清理当前用户:history -c
系统日志
安全日志secure
查看最近登录IP
cat /var/log/secure* | grep Accepted | awk '{print $11}' | sort | uniq -c | sort -nr
查询IP登录失败次数
cat /var/log/secure* | grep 8.219.176.16 | grep Failed | wc -l
查询IP登录成功次数
cat /var/log/secure* | grep 222.186.16.186 | grep Accepted | wc -l
查询IP登录时间
cat /var/log/secure* | grep 8.219.176.16
查询IP登录时间
cat /var/log/secure* | grep 222.186.16.18
定位有多少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 "$1n";}'|uniq -c|sort -nr
登录成功的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}'
软件升级卸载日志
/var/log/yum.log
more /var/log/yum.log
用户日志分析
wtmp日志记录了用户的登录、退出、重启等情况,可以查看系统是否存在异常
用户登录,判断攻击者是否已经登录服务器,由于wtmp日志为二进制文件,所
以利用last命令查看,last -t 20210111120950 ,可查看这个时间之前的日志
last -t 20210111120950
查看用户最后登录系统的信息
它根据UID排序显示登录名、端口号(tty )和上次登录时间
如果一个用户从未登录过,lastlog 显示Never logged。
lastlog
查看用户正在登录系统的信息
utmp日志记录当前用户的一些信息,由于utmp日志文件同样为二进制文件,可通过w、who命令查看
w
Cron日志分析
tail -f /var/log/cron
记录是否执行了定时任务的脚本
具体执行是否正确以及脚本执行过程中的信息,
linux会发邮件到此用户/var/spool/mail/路径下。使用less、more等命令均可查看
命令日志history
history(/root/.bash_history)
中间件日志
Apache 日志分析
路径配置文件在http.conf中
Linux日志文件默认位置
/usr/local/apache/logs/access_log
或者位于
/var/log/http
列出当天访问次数最多的IP
cut -d- -f 1 access_log|uniq -c | sort -rn | head -20
查看每一个IP访问了多少个页面
awk '{++S[$1]} END {for (a in S) print a,S[a]}' access_log
将每个IP访问的页面数进行从小到大排序:
awk '{++S[$1]} END {for (a in S) print S[a],a}' log_file | sort -n
查看2018年6月21日14时这一个小时内有多少IP访问
awk '{print $4,$1}' log_file | grep 21/Jun/2018:14 | awk '{print $2}'| sort | uniq | wc -l
HTTP Status:
cat /www/logs/access.log |awk '{print $9}'|sort|uniq -c|sort -rn|more
URL 统计:
cat access.log |awk '{print $7}'|sort|uniq -c|sort -rn|more
文件流量统计
cat access.log |awk '{sum[$7]+=$10}END{for(i in sum){print sum[i],i}}'|sort -rn|more
URL访问量统计
cat /www/logs/access.log | awk '{print $7}' | egrep '?|&' | sort | uniq -c | sort -rn | more
查看某一个IP访问了哪些页面
grep ^172.17.0.1 log_file| awk '{print $1,$7}'
查看某一个页面被访问的次数
grep "/index.php" log_file | wc -l
在对日志进行安全分析时,可以按照三种思路展开,逐步深入,还原整个攻击过程。
第一种:登录事件。重点关注登录事件,特别是异常时间节点对远程登录(深更半夜)
第二种:时间定位法。确定入侵的时间范围,以此为线索,查找这个时间范围内可疑的日
志,进一步排查,最终确定攻击者,还原攻击过程。
第三种:后门文件、后门账号反查。攻击者在入侵网站后,通常会留下后门维持权限,以
方便再次访问,我们可以找到该文件,并以此为线索来展开分析。
数据库日志
常见的数据库攻击包括弱口令、SQL注入、提升权限、窃取备份等。对数据库日志进行分析,可以发现攻击行为,进一步还原攻击场景及追溯攻击源。
MySQL日志分析
general query log能记录成功连接和每次执行的查询,我们可以将它用作安全布防的一部分,为故障分析或黑客事件后的调查提供依据。
查看log配置信息
开启日志
SET GLOBAL general_log = 'On';
指定日志文件路径
SET GLOBAL general_log_file = '/var/lib/mysql/mysql.log';
日志分析
比如,当我访问 /test.php?id=1,此时我们得到这样的日志:
190604 14:46:14 14 Connect root@localhost on
14 Init DB test
14 Query SELECT * FROM admin WHERE id = 1
14 Quit `
我们按列来解析一下:
第一列:Time,时间列,前面一个是日期,后面一个是小时和分钟,
有一些不显示的原因是因为这些sql语句几乎是同时执行的,所以就不另外记录时间了。
第二列:Id,就是show processlist出来的第一列的线程ID,
对于长连接和一些比较耗时的sql语句,你可以精确找出究竟是那一条那一个线程在运行。
第三列:Command,操作类型,比如Connect就是连接数据库,
Query就是查询数据库(增删查改都显示为查询),可以特定过虑一些操作。
第四列:Argument,详细信息,例如 Connect root@localhost on
意思就是连接数据库,如此类推,接下面的连上数据库之后,做了什么查询的操作。
登录成功/失败
使用我以前自己开发的弱口令工具来扫一下,字典设置比较小,2个用户,4个密码,共8组
MySQL中的log记录是
Time Id Command Argument
190601 22:03:20 98 Connect root@192.168.204.1 on
98 Connect Access denied for user 'root'@'192.168.204.1' (using password: YES)
103 Connect mysql@192.168.204.1 on
103 Connect Access denied for user 'mysql'@'192.168.204.1' (using password: YES)
104 Connect mysql@192.168.204.1 on
104 Connect Access denied for user 'mysql'@'192.168.204.1' (using password: YES)
100 Connect root@192.168.204.1 on
101 Connect root@192.168.204.1 on
101 Connect Access denied for user 'root'@'192.168.204.1' (using password: YES)
99 Connect root@192.168.204.1 on
99 Connect Access denied for user 'root'@'192.168.204.1' (using password: YES)
105 Connect mysql@192.168.204.1 on
105 Connect Access denied for user 'mysql'@'192.168.204.1' (using password: YES)
100 Query set autocommit=0
102 Connect mysql@192.168.204.1 on
102 Connect Access denied for user 'mysql'@'192.168.204.1' (using password: YES)
100 Quit `
但是,如果你是用其他方式,可能会有一点点不一样
Navicat for MySQL登录:
190601 22:14:07 106 Connect [email protected] on
106 Query SET NAMES utf8
106 Query SHOW VARIABLES LIKE 'lower_case_%'
106 Query SHOW VARIABLES LIKE 'profiling'
106 Query SHOW DATABASES
命令行登录:
190601 22:17:25 111 Connect root@localhost on
111 Query select @@version_comment limit 1
190601 22:17:56 111 Quit
这个差别在于,不同的数据库连接工具,它在连接数据库初始化的过程中是不同的。通过这样的差别,我们可以简单判断出用户是通过连接数据库的方式。
另外,不管你是爆破工具、Navicat for MySQL、还是命令行,登录失败都是一样的记录。
登录失败的记录:
102 Connect mysql@192.168.204.1 on
102 Connect Access denied for user 'mysql'@'192.168.204.1' (using password: YES)
利用shell命令进行简单的分析:2
有哪些IP在爆破
grep "Access denied" mysql.log |cut -d "'" -f4|uniq -c|sort -nr
爆破用户名字典都有哪些
grep "Access denied" mysql.log |cut -d "'" -f2|uniq -c|sort -nr
日志分析中,特别需要注意一些敏感的操作行为,比如删表、备库,读写文件等。关键词:drop table、drop function、lock tables、unlock tables、load_file() 、into outfile、into dumpfile。
敏感数据库表:SELECT * from mysql.user、SELECT * from mysql.func
原文始发于微信公众号(网络安全透视镜):【Linux应急响应】护网防守方自救指南
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论