分享分享在 Linux 应急中在查阅相关的模块时要用到的一些命令,一定要去实操实操,这样到了客户现场才能不慌,加油鹅!
主机信息收集
-
查看 CPU 信息 lscpu
-
操作系统版本 uname -a or 具体的 cat /proc/version
用户信息
- 查看系统所有用户的信息 cat /etc/passwd
Linux 操作系统上的用户如果需要登录主机,当其输入用户名和密码之后:
-
首先在/etc/passwd 文件中查找是否有你的账号,如果没有无法登录,如果有的话将该用户的 UID 和 GID 读出来,此外将此用户的 shell 设置也一并读出
-
然后根据 UID 到/etc/shadow 文件中去寻找相应用户的密码,如果匹配一致
-
进入 shell 控制的阶段
在 passwd 文件中,字段与字段之间用分号隔开,下面是各个字段的具体含义
用户名:密码:用户 ID:组 ID:用户说明:家目录:登陆之后 shell
注意:无密码只允许本机登陆,远程不允许登陆
- 分析超级特权用户 awk -F: ‘$3==0{print $1}’ /etc/passwd
-
**查看可以登录的账号 cat /etc/passwd grep “/bin/bash”**
-
**查询可以远程登录的帐号信息 awk ‘/\$1 \$6/{print $1}’ /etc/shadow** - 查看所有用户错误的登录信息 lastb
- 查看所有用户最后的登录信息 lastlog
- 查看系统最近的登录信息 last
tty1 本地登录;pts 远程登录,这个的话本地试的时候,去用 init 5 也就是图形化界面的时候,实际上就还是显示的是 pts,只有用 init 3 这种完全是个黑框框的菜是 tty,不过客户现场的服务器一般都是黑框框鹅,核心机器也不可能去 ssh
- 查看当前用户登录情况 who
- 查看是否存在空口令 awk -F “:” ‘($2==””){print $1}’ /etc/shadow
创建一个空口令账户:
useradd Oyst3r
passwd -d Oyst3r
- 查看加密后的密码文件 cat /etc/shadow
存的是加密的密码,每个字段含义如下
用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留字段
- 禁用或删除多余及可疑的帐号
usermod -L user 禁用帐号,帐号无法登录,/etc/shadow 第二栏为 ! 开头
userdel user 删除 user 用户
userdel -r user 将删除 user 用户,并且将 /home 目录下的 user 目录一并删除
计划任务
Linux 里面,计划任务也是维持权限和远程下载一些恶意脚本软件的手段,一般有以下两种方式去查看计划任务
- crontab -l 和 crontab -e
下面也给出了几个例子
还有指定查看用户的计划任务 crontab -u Oyst3r -l
- ls /etc/cron*
一般在 Linux 中的计划任务都是以 cron 开头的,可以利用正则表达式去去模糊匹配筛出来/etc/目录下所有的以 cron 开头的文件
服务排查
- chkconfig –list
下面是这 6 个数字的含义,排查的时候主要去着重看 3、4、5
- 查看所有服务的状态 service –status-all
- 查看所有开关机自启动服务状态 systemctl list-unit-files
其中几个状态的解释:
enabled:这个将在开机时被执行
disabled:这个在开机时候不会被执行
static:这个不会自启动,但会可能因为别的服务启动而被牵连着启动
mask:永远不会被启动
- 关闭和启动服务
sudo systemctl stop xxx.service 关停服务
sudo systemctl disable xxx.service 终止开机自启动
sudo systemctl start xxx.service 启动服务
sudo systemctl enable xxx.service 开启开机自启动
开机文件启动项
- ls -al /etc/rc.local
- ls -alh /etc/init.d/ or ls -alh /etc/rc.d/init.d
- ls /etc/rc*.d/
说明一下这个 rc0、rc1 等等的含义,其实和上面一样还是对应着不同的等级
敏感目录
- ssh 相关的
ls -alh ~/.ssh 和 ls -alh /etc/ssh,这种攻击者可能会留一些公钥,实现无密后门
- 看看/tmp、/usr/bin 等等
文件排查
通过列出攻击日期内变动的文件,即可发现相关的可疑文件
- find 命令
-type b/d/c/p/l/f 查找块设备/目录/字符设备/管道/符号链接/普通文件
-mtime -n +n 按文件更改时间来查找 -n 是指 n 天以内 +n 指的是 n 天前
-atime -n +n 按文件访问时间来查找 -n 是指 n 天以内 +n 指的是 n 天前
-ctime -n +n 按文件创建时间来查找 -n 是指 n 天以内 +n 指的是 n 天前
-
find / -ctime 0 -name “*.txt” 去查找一天内新创建的文件
-
find / -newermt ‘2024-3-18 00:00:00’ ! -newermt ‘2024-3-19 3:08:38’ 查看指定时间内修改过的文件
-
**查看指定目录,对文件排序查看前 10 行内容 ls -alt head -n 10** - stat 命令
对文件的创建时间、修改时间、访问时间去进行一个线性的排查
最近更改和最近改动的区别
特殊文件
linux 中文件有特殊的设置,比如权限什么的,对于这些东西咱们也可以去一步步的排查
-
find /temp -perm 777 查找权限为 777 的文件
-
ls -alt /bin/
在 linux 中系统命令也是文件,ls、ps、find 等命令也可能被攻击,用上面这条命令查看一下相关命令文件被修改的信息
- find / -type f -perm -04000 -ls -uid 0 2>/dev/null
排查 suid 程序,对于一些设置了 suid 权限的程序可通过这条命令去排查
- echo $PATH
看看环境变量有没有被修改过
隐藏文件
- 创建隐藏文件 用 ls -al 来查看
touch .Oyst3r.txt
-
隐藏创建时间 touch -r index.php webshell.php
-
或者直接改时间戳 touch -t 时间戳 webshell.php
Linux 藏后门最好要修改掉时间,不然一条指令就被发现了,比如先参考一下目录中别的文件(index.php)的创建时间,再去赋值给我们的后门文件(webshell.php)
- 便于阅读的查看时间格式的命令 ls -l –time-style ‘+%Y/%m/%d %H:%M:%S’
但改完之后,用 stat 查看这个文件的属性,它的最近改动时间还是没有变的
- chattr 命令
这个在比如发现攻击者创建了个后门,删除的时候提示不能去删除,就要看看文件是不是被上锁了
chattr +i webshell.php 锁定文件
chattr webshell.php 查看文件属性,如果上锁了会显示有一个 i
chattr -i webshell.php 解锁文件
rm -rf webshell.php 删除文件
后门检测
-
打包下来放 D 盾等去扫
-
手工搜索
//搜索目录下适配当前应用的网页文件,查看内容是否有Webshell特征
find ./ type f -name "*.jsp" | xargs grep "exec("
find ./ type f -name "*.php" | xargs grep "eval("
find ./ type f -name "*.asp" | xargs grep "execute("
find ./ type f -name "*.aspx" | xargs grep "eval("
//对于免杀Webshell,可以查看是否使用编码
find ./ type f -name "*.php" | xargs grep "base64_decode"
- 下载俩工具(chkrootkit、rkhunterr)
系统资源分析
-
uptime
-
free 查看内存分配
-
cat /proc/mounts 查看未知挂载
进程信息
- top
相当于 windows 的任务管理器
查看进程树
- pstree -p
网络与进程分析
- netstat -pantl 查看当前系统的 tcp 连接情况
kill -9 进程 pid
-
ps aux 查看所有的进程分析
-
**ps aux grep pid 号可分析具体进程 lsof -i:端口号也可以实现类似功能**
历史命令
1、root 用户的历史命令
histroy
2、打开 /home 各帐号目录下的 .bash_history,查看普通帐号执行的历史命令。
为历史的命令增加登录的 IP 地址、执行命令时间等信息:
1)保存1万条命令
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile
2)在/etc/profile的文件尾部添加如下行数配置信息:
######jiagu history xianshi#########
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"
######### jiagu history xianshi ##########
3)source /etc/profile 让配置生效
生成效果: 1 2018-07-10 19:45:39 192.168.204.1 root source /etc/profile
3、历史操作命令的清除:history -c
但此命令并不会清除保存在文件中的记录,因此需要手动删除 .bash_profile 文件中的记录
进入用户目录下,导出历史命令。
cat .bash_history >> history.txt
OK 终于结束了