热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux环境入侵应急与排查

一、账号安全1、用户信息文件etcpasswd#格式:account:password:UID:GID:GECOS:directory:shell#用户名&#x

一、账号安全

1、用户信息文件 /etc/passwd

# 格式:account:password:UID:GID:GECOS:directory:shell
# 用户名:密码:用户ID:组ID:用户说明:家目录:登陆之后的 shell
root:x:0:0:root:/root:/bin/bash

# 查看可登录用户:
cat /etc/passwd | grep /bin/bash
# 查看UID=0的用户
awk -F: '$3==0{print $1}' /etc/passwd
# 查看sudo权限的用户
more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"

注意:无密码只允许本机登陆,远程不允许登陆
2、影子文件:/etc/shadow

# 用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:
# 保留root:$6$oGs1PqhL2p3ZetrE$X7o7bzoouHQVSEmSgsYN5UD4.kMHx6qgbTqwNVC5oOAouXvcjQSt.Ft7ql1WpkopY0UV9ajBwUt1DpYxTCVvI/:16809:0:99999:7:::

3、查看当前登录用户及登录时长

who # 查看当前登录系统的所有用户(tty 本地登陆 pts 远程登录)
w # 显示已经登录系统的所用用户,以及正在执行的指令
uptime # 查看登陆多久、多少用户,负载状态

4、排查用户登录信息
查看最近登录成功的用户及信息

# 显示logged in表示用户还在登录
# pts表示从SSH远程登录
# tty表示从控制台登录,就是在服务器旁边登录
# last

查看最近登录失败的用户及信息:

# ssh表示从SSH远程登录
# tty表示从控制台登录sudo lastb

显示所有用户最近一次登录信息:

lastlog

在排查服务器的时候,黑客没有在线,可以使用last命令排查黑客什么时间登录的有的黑客登录时,会将/var/log/wtmp文件删除或者清空,这样我们就无法使用last命令获得有用的信息了。
在黑客入侵之前,必须使用chattr +a对/var/log/wtmp文件进行锁定,避免被黑客删除
5、sudo用户列表

/etc/sudoers

二、入侵排查:

# 查询特权用户特权用户(uid 为0):
awk -F: '$3==0{print $1}' /etc/passwd
# 查询可以远程登录的帐号信息:
awk '/\$1|\$6/{print $1}' /etc/shadow
# 除root帐号外,其他帐号是否存在sudo权限。如非管理需要,普通帐号应删除sudo权限:
more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
# 禁用或删除多余及可疑的帐号
usermod -L user # 禁用帐号,帐号无法登录,/etc/shadow 第二栏为 ! 开头
userdel user # 删除 user 用户
userdel -r user # 将删除 user 用户,并且将 /home 目录下的 user 目录一并删除

通过.bash_history文件查看帐号执行过的系统命令:
打开 /home 各帐号目录下的 .bash_history,查看普通帐号执行的历史命令。
为历史的命令增加登录的 IP 地址、执行命令时间等信息:

# 1、保存1万条命令:
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile
# 2、在/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` "
shopt -s histappend
export PROMPT_COMMAND="history -a"
# 3、让配置生效
source /etc/profile

注意:历史操作命令的清除:history -c
该操作并不会清除保存在文件中的记录,因此需要手动删除.bash_profile文件中的记录


三、检查端口连接情况:

netstat -antlp | more

在这里插入图片描述

使用 ps 命令,分析进程,得到相应pid号:

ps aux | grep 6666

在这里插入图片描述

查看 pid 所对应的进程文件路径:

# $PID 为对应的 pid 号ls -l /proc/$PID/exe 或 file /proc/$PID/exe
分析进程:
# 根据pid号查看进程lsof -p 6071
# 通过服务名查看该进程打开的文件lsof -c sshd
# 通过端口号查看进程:lsof -i :22

查看进程的启动时间点:

ps -p 6071 -o lstart

根据pid强行停止进程:

kill -9 6071

注意: 如果找不到任何可疑文件,文件可能被删除,这个可疑的进程已经保存到内存中,是个内存进程。这时需要查找PID 然后kill掉


四、检查开机启动项:

系统运行级别示意图:


运行级别含义
0关机
1单用户模式,可以想象为windows的安全模式,主要用于系统修复
2不完全的命令行模式,不含NFS服务
3完全的命令行模式,就是标准字符界面
4系统保留
5图形模式
6重启动

查看运行级别命令:

runlevel

开机启动配置文件:

/etc/rc.local/etc/rc.d/rc[0~6].d

启动Linux系统时,会运行一些脚本来配置环境——rc脚本。在内核初始化并加载了所有模块之后,内核将启动一个守护进程叫做init或init.d。这个守护进程开始运行/etc/init.d/rc中的一些脚本。这些脚本包括一些命令,用于启动运行Linux系统所需的服务
开机执行脚本的两种方法:


在/etc/rc.local的exit 0语句之间添加启动脚本。脚本必须具有可执行权限
用update-rc.d命令添加开机执行脚本


1、编辑修改/etc/rc.local
在这里插入图片描述

2、update-rc.d:此命令用于安装或移除System-V风格的初始化脚本连接。脚本是存放在/etc/init.d/目录下的,当然可以在此目录创建连接文件连接到存放在其他地方的脚本文件。
此命令可以指定脚本的执行序号,序号的取值范围是 0-99,序号越大,越迟执行。
当我们需要开机启动自己的脚本时,只需要将可执行脚本丢在/etc/init.d目录下,然后在/etc/rc.d/rc_.d文件中建立软链接即可
语法:

update-rc.d 脚本名或服务 <remove|defaults|disable|enable>
#1、在/etc/init.d目录下创建链接文件到后门脚本&#xff1a;
ln -s /home/b4yi/kali-6666.elf /etc/init.d/backdoor
#2、用 update-rc.d 命令将连接文件 backdoor 添加到启动脚本中去
sudo update-rc.d backdoor defaults 99

开机即执行。
在这里插入图片描述

入侵排查&#xff1a;

more /etc/rc.local/etc/rc.d/rc[0~6].dls -l /etc/rc.d/rc3.d/

计划任务排查&#xff1a;
需要注意的几处利用cron的路径&#xff1a;

crontab -l # 列出当前用户的计时器设置
crontab -r # 删除当前用户的cron任务

上面的命令实际上是列出了/var/spool/cron/crontabs/root该文件的内容&#xff1a;

/etc/crontab只允许root用户修改
/var/spool/cron/存放着每个用户的crontab任务&#xff0c;每个任务以创建者的名字命名
/etc/cron.d/将文件写到该目录下&#xff0c;格式和/etc/crontab相同
把脚本放在/etc/cron.hourly//etc/cron.daily//etc/cron.weekly//etc/cron.monthly/目录中&#xff0c;让它每小时//星期/月执行一次

小技巧&#xff1a;

more /etc/cron.daily/* 查看目录下所有文件

入侵排查&#xff1a;
重点关注以下目录中是否存在恶意脚本;

/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/*

入侵排查&#xff1a;
查询已安装的服务&#xff1a;
RPM 包安装的服务&#xff1a;

chkconfig --list 查看服务自启动状态&#xff0c;可以看到所有的RPM包安装的服务
ps aux | grep crond 查看当前服务 系统在35级别下的启动项
中文环境
chkconfig --list | grep "3:启用\|5:启用"
英文环境
chkconfig --list | grep "3:on\|5:on"

源码包安装的服务:

查看服务安装位置 &#xff0c;一般是在/user/local/
service httpd start
搜索/etc/rc.d/init.d/ 查看是否存在

异常文件检查&#xff1a;
按照三种方式查找修改的文件&#xff1a;

按照名称
依据文件大小
按照时间查找

根据名称查找文件

find / -name a.Test
# 如果文件名记不全&#xff0c;可使用通配符*来补全
# 如果不区分大小写&#xff0c;可以将-name 替换为-iname

依据文件大小查找&#xff1a;

find / -size &#43;1000M
# &#43;1000M表示大于1000M的文件&#xff0c;-10M代表小于10M的文件

依据时间查找&#xff1a;

# -atime 文件的访问时间
# -mtime 文件内容修改时间
# -ctime 文件状态修改时间&#xff08;文件权限&#xff0c;所有者/组&#xff0c;文件大小等&#xff0c;当然文件内容发生改变&#xff0c;ctime也会随着改变&#xff09;
# 要注意&#xff1a;系统进程/脚本访问文件&#xff0c;atime/mtime/ctime也会跟着修改&#xff0c;不一定是人为的修改才会被记录
# 查找最近一天以内修改的文件&#xff1a;
find / -mtime -1 -ls | more
# 查找50天前修改的文件&#xff1a;
find ./ -mtime &#43;50 -ls

根据属主和属组查找&#xff1a;

-user 根据属主查找
-group 根据属组查找
-nouser 查找没有属主的文件
-nogroup 查找没有属组的文件
# 查看属主是root的文件find ./ -user root -type f
# -type f表示查找文件&#xff0c;-type d表示查找目录
# 注意&#xff1a;系统中没有属主或者没有属组的文件或目录&#xff0c;也容易造成安全隐患&#xff0c;建议删除。

按照CPU使用率从高到低排序&#xff1a;

ps -ef --sort -pcpu

按照内存使用率从高到低排序&#xff1a;

ps -ef --sort -pmem

补充&#xff1a;
1、查看敏感目录&#xff0c;如/tmp目录下的文件&#xff0c;同时注意隐藏文件夹&#xff0c;以“…”为名的文件夹具有隐藏属性。
2、得到发现WEBSHELL、远控木马的创建时间&#xff0c;如何找出同一时间范围内创建的文件&#xff1f;可以使用find命令来查找&#xff0c;如find /opt -iname “*” -atime 1 -type f 找出 /opt 下一天前访问过的文件。
3、针对可疑文件可以使用 stat 进行创建修改时间。


五、系统日志检查&#xff1a;

日志默认存放位置&#xff1a;/var/log/
必看日志&#xff1a;secure、history
查看日志配置情况&#xff1a;more /etc/rsyslog.conf
在这里插入图片描述

/var/log/wtmp 登录进入&#xff0c;退出&#xff0c;数据交换、关机和重启记录
/var/log/lastlog 文件记录用户最后登录的信息&#xff0c;可用 lastlog 命令来查看。
/var/log/secure 记录登入系统存取数据的文件&#xff0c;例如 pop3/ssh/telnet/ftp 等都会被记录。
/var/log/cron 与定时任务相关的日志信息
/var/log/message 系统启动后的信息和错误日志
/var/log/apache2/access.log apache access log

日志分析技巧&#xff1a;

1、定位有多少IP在爆破主机的root帐号&#xff1a;
grep "Failed password for root" /var/log/secure | awk &#39;{print $11}&#39; | sort | uniq -c | sort -nr | more
定位有哪些IP在爆破&#xff1a;
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
爆破用户名字典是什么&#xff1f;
grep "Failed password" /var/log/secure|perl -e &#39;while($_&#61;<>){ /for(.*?) from/; print "$1\n";}&#39;|uniq -c|sort -nr
2、登录成功的IP有哪些&#xff1a;
grep "Accepted " /var/log/secure | awk &#39;{print $11}&#39; | sort | uniq -c | sort -nr | more
登录成功的日期、用户名、IP&#xff1a;
grep "Accepted " /var/log/secure | awk &#39;{print $1,$2,$3,$9,$11}&#39;
3、增加一个用户kali日志&#xff1a;
Jul 10 00:12:15 localhost useradd[2382]: new group: name&#61;kali, GID&#61;1001
Jul 10 00:12:15 localhost useradd[2382]: new user: name&#61;kali, UID&#61;1001, GID&#61;1001, home&#61;/home/kali, shell&#61;/bin/bash
Jul 10 00:12:58 localhost passwd: pam_unix(passwd:chauthtok): password changed for kali
#grep "useradd" /var/log/secure
4、删除用户kali日志&#xff1a;
Jul 10 00:14:17 localhost userdel[2393]: delete user &#39;kali&#39;
Jul 10 00:14:17 localhost userdel[2393]: removed group &#39;kali&#39; owned by &#39;kali&#39;
Jul 10 00:14:17 localhost userdel[2393]: removed shadow group &#39;kali&#39; owned by &#39;kali&#39;# grep "userdel" /var/log/secure
5、su切换用户&#xff1a;Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid&#61;0)
sudo授权执行:
sudo -l
Jul 10 00:43:09 localhost sudo: good : TTY&#61;pts/4 ; PWD&#61;/home/good ; USER&#61;root ; COMMAND&#61;/sbin/shutdown -r now

更多分享微信搜索“安全info”公众号
添加群主进“安全交流”微信群
在这里插入图片描述


推荐阅读
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文总结了Linux下多线程执行shell脚本的4种方法,包括切换到工作目录执行、使用绝对路径执行、直接使用bash或sh执行。同时介绍了为什么需要加上"./"来执行脚本的原因。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文探讨了容器技术在安全方面面临的挑战,并提出了相应的解决方案。多租户保护、用户访问控制、中毒的镜像、验证和加密、容器守护以及容器监控都是容器技术中需要关注的安全问题。通过在虚拟机中运行容器、限制特权升级、使用受信任的镜像库、进行验证和加密、限制容器守护进程的访问以及监控容器栈,可以提高容器技术的安全性。未来,随着容器技术的发展,还需解决诸如硬件支持、软件定义基础设施集成等挑战。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 集成电路企业在进行跨隔离网数据交换时面临着安全性问题,传统的数据交换方式存在安全性堪忧、效率低下等问题。本文以《Ftrans跨网文件安全交换系统》为例,介绍了如何通过丰富的审批流程来满足企业的合规要求,保障数据交换的安全性。 ... [详细]
author-avatar
小兔纸77
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有