检测Linux系统是否被入侵
入侵者在入侵成功后,往往会留下后门以便再次访问被入侵的系统,而创建系统账号是一种比较常见的后门方式。在做入侵排查的时候,用户配置文件/etc/passwd和密码配置文件/etc/shadow是需要去重点关注的地方。
查询特权用户特权用户(uid 为0)
1 | > awk -F: '$3==0{print $1}' /etc/passwd |
查找远程可以登录的账户
1 | > awk '/\$1|\$5|\$6/{print $1}' /etc/shadow |
- $1:MD5(长度 22个字符)
- $5:SHA-256(长度 43 个字符)
- $6:SHA-512(长度86 个字符)
检查sudo权限
1 | > cat /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL" |
删除或锁定账号
通过上面的步骤可以找到可疑的账号
1 2 3 4 | > usermod -L rooot #禁用帐号,帐号无法登录,/etc/shadow第二栏为!开头 > userdel rooot #删除user用户 > userdel -r rooot #将删除root用户,并且将/home目录下的root目录一并删除 |
查看当前登录系统的信息
1 2 3 4 | > who #查看当前登录用户(tty本地登陆 pts远程登录) > w #查看系统信息,想知道某一时刻用户的行为 > uptime #查看登陆多久、多少用户,负载 |
检查异常端口
使用netstat 网络连接命令,分析可疑端口、IP、PID等信息。
1 | > netstat -tunlp | less |
抓包分析
1 | > tcpdump -c 10 -q //精简模式显示 10个包 |
使用ps命令检查可疑的进程
1 | > ps -ef |
查超系统中占用资源最高的资源
1 | > top |
发现异常进一步检查
1 2 3 4 5 | > ps eho command -p $PID #查看该进程启动的完整命令行 > readlink /proc/$PID/cwd #查看该进程启动时候所在的目录 > ls -l /proc/$PID/exe #查看下pid所对应的进程文件路径 > strings -f /proc/$PID/environ | cut -f2 -d '' #查看该进程启动时的完整环境变量: > lsof -p $PID #列出该进程所打开的所有文件 |
检查系统服务
Linux系统服务管理,CentOS7使用systemd控制 CentOS6之前使用chkconfig控制。
检查开机自启的服务
1 2 3 4 5 | //对于systemd服务管理器来说,可以通过下述方式查看开机自启的服务 > systemctl list-unit-files --type=service | grep "enabled" //chkconfig就是CentOS6以前用来控制系统服务的工具,查看服务自启动状态 > chkconfig --list | grep "3:on\|5:on" |
检查启动项脚本
命令查看下开机启动项中是否有异常的启动服务。
1 | > cat /etc/rc.local |
检查计划任务
利用计划任务进行权限维持,可作为一种持久性机制被入侵者利用。检查异常的计划任务,需要重点关注以下目录中是否存在恶意脚本。
1 2 3 4 5 6 7 8 9 | /var/spool/cron/* /etc/crontab /etc/cron.d/* /etc/cron.daily/* /etc/cron.hourly/* /etc/cron.monthly/* /etc/cron.weekly/ /etc/anacrontab /var/spool/anacron/* |
检查系统的异常文件
查看敏感目录,如/tmp目录下的文件,同时注意隐藏文件夹,以
.
为名的文件夹具有隐藏属性
1 | > ls -al |
查找1天以内被访问过的文件
1 | > find /opt -iname "*" -atime 1 -type f |
-iname
不区分大小写,-atime
最近一次被访问的时间,-type
文件类型
检查历史命令
查看被入侵后,在系统上执行过哪些命令,使用root用户登录系统,检查/home目录下的用户主目录的.bash_history文件
默认情况下,系统可以保存1000条的历史命令,并不记录命令执行的时间,根据需要进行安全加固。
设置保存1万条命令
1 | > sed -i 's/HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile |
history加固
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | > vim /etc/profile USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'` if [ "$USER_IP"=="" ] then USER_IP=`hostname` fi export HISTTIMEFORMAT="%F %T $USER_IP `whoami`" #为防止会话退出时覆盖其他会话写到HISTFILE的内容 shopt -s histappend export PROMPT_COMMAND="history -a" //配置生效 > source /etc/profile |
PROMPT_COMMAND是什么
PS1-PS4介绍了一些用于提示信息控制的环境变量,而在此之前可以进行回调的一个环境变量就是PROMPT_COMMAND,这个环境变量中设定的内容将在交互式脚本的提示(PS1)出现之前被执行。
检查系统日志
在Linux上一般跟系统相关的日志默认都会放到/var/log下面,若是一旦出现问题,用户就可以通过查看日志来迅速定位,及时解决问题。常用日志文件如下:
/var/log/btmp
记录错误登录日志,这个文件是二进制文件,不能用
vi
直接查看,可以用lastb
看
/var/log/lastlog
记录系统中所有用户最后一次成功登录系统的时间,这是一个二进制文件,不能用
vi
查看,可以用lastlog
查看
/var/log/wtmp
永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看。
/var/log/utmp
记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询。
本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!
/var/log/secure
记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中
查找登录系统失败的20个账号
1 | > lastb | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 20 |
定位有多少IP在爆破主机的root帐号
1 | > grep "Failed password for root" /var/log/secure | sort | uniq -c | sort -nr | more |
查看所有重启日志信息
1 | > last reboot |
查看系统正常的运行时间
1 | > uptime -s |
查看哪些IP在爆破
1 | > 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 |
查看哪些IP登录成功了
1 | > grep "Accepted" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more |
登录成功的日期,用户名,IP
1 | > gerp "Accepted" /var/log/secure | awk '{print $1,$2,$3,$9,$11}' |