应急响应指遇到重大或突发事件后所采取的措施和行动。应急响应所处置的突发事件不仅仅包括硬件、产品、网络、配置等方面的故障,也包括各类安全事件,如:黑客攻/击、木/马病/毒、勒索病/毒、Web攻/击等。
处置手段
发现问题要处置,遵循原则:百分百确认是非法文件,报备记录关停,摸棱两可找负责人确认,处置看沟通结果
环境信息:
- Ubuntu 20.04.4 LTS
- XShell
***注意:**linux版本之间有差异,具体以自己的系统版本为准
开机启动项
伴随开机启动,一般生产服务器很少重启,但是为防止被控机器失联部分木/马会添加开机启动项作为复活手段。
/etc/rc.local
# # rc.local # # This script is executed at the end of each multiuser runlevel. # Ensure that the script will "exit 0" on success or any other # value on error. # # To enable or disable this script, just change the execution # bits. # # By default, this script does nothing.
touch /root/1.txt
|
/etc/rc.d/rc.local
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES # # It is highly advisable to create own systemd services or udev rules # to run scripts during boot instead of using this file. # # In contrast to previous versions due to parallel execution during boot # this script will NOT be run after all other services. # # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure # that this script will be executed during boot.
touch /var/lock/subsys/local touch /tmp/1.txt
|
/etc/rc.d/init.d/
这个目录下面放了可执行脚本或文件
/etc/rc*.d/
rc0.d/ rc1.d/ rc2.d/ rc3.d/ rc4.d/ rc5.d/ rc6.d/ rcS.d/ rc0.d/ rc1.d/ rc2.d/ rc3.d/ rc4.d/ rc5.d/ rc6.d/ rcS.d/
|
systemctl list-unit-files
... ssh.service enabled enabled ssh@.service static enabled sshd.service enabled enabled sudo.service masked enabled syslog.service enabled enabled system-update-cleanup.service static enabled systemd-ask-password-console.service static enabled systemd-ask-password-plymouth.service static enabled systemd-ask-password-wall.service static enabled systemd-backlight@.service static enabled ...
|
发现恶意服务,使用下面命令关停(以关闭ufw.service
服务作为实例):
sudo systemctl stop ufw.service # 停止服务 sudo systemctl disable ufw.service # 删除开启启动
|
关错了,避免尴尬偷偷启动服务
sudo systemctl start ufw.service # 启动服务 sudo systemctl enable ufw.service # 添加开启启动
|
环境变量配置文件
/etc/profile /etc/bashrc /etc/bash.bashrc ~/.bashrc ~/.profile ~/.bash_profile
|
这些文件用于设置系环境变量或启动程序,每次Linux登入或切换用户都会触发这些文件。
图1 Linux登入环境环境变量触发顺序
切换用户时也会触发环境变量文件
vulab@sechelper:~$ sudo su vulab@sechelper:~$ sudo su
|
~/.bash_logout
登出账户时触发。
vulab@sechelper:~$ exit logout ~/.bash_logout
|
各项资源异常
进程是Linux当前正在处理的任务,当运行某个软件时将为其创建一个进程。
vulab@sechelper:~$ sudo ps -efcaux # 查看所有进程 ... www-data 97735 0.0 1.8 309560 65456 ? S Aug20 0:13 \_ php-fpm7.4 syslog 785 0.0 0.1 224492 5528 ? Ssl Aug17 0:03 rsyslogd ntp 796 0.0 0.1 74632 4240 ? Ssl Aug17 0:13 ntpd root 802 0.0 0.2 17176 8044 ? Ss Aug17 0:03 systemd-logind root 816 0.0 0.2 12172 7436 ? Ss Aug17 0:04 sshd root 126262 0.0 0.2 13920 8852 ? Ss 15:47 0:00 \_ sshd ubuntu 126363 0.0 0.1 14052 6260 ? S 15:47 0:00 \_ sshd ubuntu 126364 0.0 0.1 8276 5216 pts/0 Ss 15:47 0:00 \_ bash root 130670 0.0 0.1 9404 4752 pts/0 S 18:59 0:00 \_ sudo root 130671 0.0 0.1 8260 4252 pts/0 S 18:59 0:00 \_ su root 130672 0.0 0.1 7236 4056 pts/0 S 18:59 0:00 \_ bash ...
|
查找进程文件位置
vulab@sechelper:~$ sudo lsof -p 948 # 查看pid为948的进程详细信息 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME dockerd 948 root cwd DIR 8,2 4096 2 / dockerd 948 root rtd DIR 8,2 4096 2 / dockerd 948 root txt REG 8,2 95757512 2883867 /usr/bin/dockerd dockerd 948 root mem-W REG 8,2 32768 2231986 /var/lib/docker/buildkit/cache.db
|
vulab@sechelper:~$ sudo ls -al /proc/948/exe # 查看pid为948的进程文件绝对路径 lrwxrwxrwx 1 root root 0 Aug 21 03:24 /proc/948/exe -> /usr/bin/dockerd
|
文件
|
作用
|
cwd
|
符号链接(类似快捷方式)的是进程运行目录
|
exe
|
符号链接(类似快捷方式)的是执行程序的绝对路径
|
cmdline
|
符号链接(类似快捷方式)的是进程运行目录
|
environ
|
记录进程运行时系统的环境变量
|
表1 进程符号链接参考
CPU
CPU也称为*处理器、主处理器或单处理器,是执行计算机指令得关键部件,某服务器突然有一个进程占用的CPU远超平时,那么可能被植入了挖/矿病/毒。
排查话术:CPU是否远超平时居高不下,如果是的话那么可能被植入了挖/矿病/毒。
vulab@sechelper:~$ top # 排名越靠前占用的CPU越多 vulab@sechelper:~$ top # 排名越靠前占用的CPU越多
|
图2 top命令结果
vulab@sechelper:~$ ps -aux| sort -k3nr | head -10 root 12039 122 3.4 3554048 139720 ? Sl 08:18 0:02 /usr/local/jdk-17.0.3.1/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-10.0.22/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/apache-tomcat-10.0.22/bin/bootstrap.jar:/usr/local/apache-tomcat-10.0.22/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-10.0.22 -Dcatalina.home=/usr/local/apache-tomcat-10.0.22 -Djava.io.tmpdir=/usr/local/apache-tomcat-10.0.22/temp org.apache.catalina.startup.Bootstrap start ...
|
内存
程序启动时会被系统读入内存,在执行的过程也不断的在内存中申请新的空间。
排查话术:最近内存是否突然升高持续不下,如果是的话那么可能被植入了挖/矿病/毒。
vulab@sechelper:~$ ps -aux | sort -k4nr | head -10 # 内存占用最高的是个进程 root 948 0.0 1.9 1308116 78424 ? Ssl 03:24 0:02 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock root 859 0.0 1.2 1355640 51364 ? Ssl 03:24 0:14 /usr/bin/containerd root 851 0.0 1.0 874552 42960 ? Ssl 03:24 0:01 /usr/lib/snapd/snapd root 890 0.0 0.5 107916 20864 ? Ssl 03:24 0:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal ...
|
网络带宽
带宽也就是网速的最高上限,比如家里的100/M带宽,就是每秒100M的传输速度,带宽分为上行和下行对应着上传下载,某服务器上行流量比往常高出几倍时,说明在外发大量的数据重点检查是否为正常业务。
排查话术:网络流量上下行有异常吗?有异常的话是哪个IP?
网络占用需要安装软件辅助,应急时大部分情况都不允许随意安装软件,这时候就需要和运维的网络沟通,从设备上看下流量情况。
vulab@sechelper:~$ sudo apt-get install iftop # centos使用 yum install iftop Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: iftop 0 upgraded, 1 newly installed, 0 to remove and 54 not upgraded. Need to get 36.3 kB of archives. After this operation, 95.2 kB of additional disk space will be used. Get:1 http://cn.archive.ubuntu.com/ubuntu focal/universe amd64 iftop amd64 1.0~pre4-6build1 [36.3 kB] Fetched 36.3 kB in 1s (24.6 kB/s) Selecting previously unselected package iftop. (Reading database ... 108839 files and directories currently installed.) Preparing to unpack .../iftop_1.0~pre4-6build1_amd64.deb ... Unpacking iftop (1.0~pre4-6build1) ... Setting up iftop (1.0~pre4-6build1) ... Processing triggers for man-db (2.9.1-1) ...
|
使用iftop
命令分析网络时,需要指定网卡,一个生产机器服务器会有很多块网卡,有管理用的、业务用的或其它的,这时候要与运维沟通区分各个网卡的用途。
vulab@sechelper:~$ ip addr # ifconfig 查看所有网卡 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:23:3d:42 brd ff:ff:ff:ff:ff:ff inet 192.168.111.133/24 brd 192.168.111.255 scope global dynamic ens33 valid_lft 941sec preferred_lft 941sec inet6 fe80::20c:29ff:fe23:3d42/64 scope link valid_lft forever preferred_lft forever 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:76:f7:a7:4b brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever 4: br-d9f18b6d603d: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:8b:93:c0:83 brd ff:ff:ff:ff:ff:ff inet 172.18.0.1/16 brd 172.18.255.255 scope global br-d9f18b6d603d valid_lft forever preferred_lft forever inet6 fe80::42:8bff:fe93:c083/64 scope link valid_lft forever preferred_lft forever 10: veth6a9efeb@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-d9f18b6d603d state UP group default link/ether 76:0d:b7:6b:56:10 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::740d:b7ff:fe6b:5610/64 scope link valid_lft forever preferred_lft forever
|
vulab@sechelper:~$ sudo iftop -i ens33 -P # 指定ens33网卡,分析其流量
|
图3 iftop流量分析
网络连接
服务器每发出和接收一个TCP/UDP请求都能看到连接(短时间内)。
netstat 命令:
- -a 显示所有
- -n 数字形式展示连接端口
- -t 仅查看TCP连接情况
- -u 仅查看UDP连接情况
- -p 显示相关程序名
vulab@sechelper:~$ sudo netstat -antup # 我经常使用的一条命令,查看所有连接 roto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:60801 0.0.0.0:* LISTEN 1212/apache2 tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1066/mysqld tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/init tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1502/nginx: master tcp 0 0 10.0.4.16:53 0.0.0.0:* LISTEN 771/named tcp 0 0 10.0.4.16:80 93.157.63.28:10959 SYN_RECV - tcp 0 0 10.0.4.16:35322 169.254.0.55:5574 ESTABLISHED 1316/YDService tcp 0 0 10.0.4.16:41805 192.112.36.4:53 TIME_WAIT - tcp 0 0 10.0.4.16:35978 169.254.0.138:8186 ESTABLISHED 58593/tat_agent tcp6 0 0 127.0.0.1:60800 :::* LISTEN 1580/java tcp6 0 0 :::111 :::* LISTEN 1/init ...
|
状态
|
作用
|
LISTEN
|
监听TCP端口,等待远程连接
|
TIME-WAIT
|
等待一段时间确保远程TCP中断请求
|
ESTABLISHED
|
打开着的连接
|
SYN_RECV
|
接收和发送连接请求后等待确认连接请求确认的情况。
|
CLOSING
|
等待远程TCP对连接中断的确认
|
CLOSE
|
连接完全关闭
|
表2 端口状态对照表
关闭进程
这里注意一下,关停服务后进程是否会”复活“,如果恶意进程被kill
后重新启动,那么肯定有其它地方有自启动方法,继续排查守护进程、定时任务、系统配置、服务和系统文件。
vulab@sechelper:~$ sudo kill -9 1434 vulab@sechelper:~$ sudo kill -9 1434
|
威胁情报
威胁情报是识别和分析网络威胁的过程。威胁情报平台可以查出一些域名和IP地址得信誉
度,一旦发现它们存在网络攻/击痕迹迅速封禁。
- 微步在线
- VirusTotal
- 安恒威胁分析平台
- 深信服威胁情报中心
- VenusEye威胁情报中心
- 360威胁情报中心
- Data Mining for Threat Intelligence
SSH
SSH(Secure Shell)是一种加密的网络传输协议,通常利用SSH来传输命令行界面和远程执行命令。
账户密码
vulab@sechelper:~$ users vulab vulab@sechelper:~$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash ... systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false vulab:x:1000:1000::/home/vulab:/bin/bash
|
账户可登录,登录后使用/bin/bash
解释执行脚本
不可登录,不会有任何提示。
不可登录,拒绝用户登录。
密钥篡改
vulab@sechelper:~$ cat authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDH9DeY9Ry/8FSlIEKEU/HH2yaPklCf36/ePIW9oS/9i7QklEqvvrPEfhpcSH0by98a+AjktEoUqt3TRLvM4IHtr7/KAP0m8cFyN0wlpvmY2rqwko3kPbaVm4sb8Qxc4IJo/0HjRvTAzNvTzzT7unWLaPZ8vUyrDVooRJWdjwbxpq0wtBvcNci7//145sTocddJDvsnwT7ulE/QIdBWHQdtclUr5zqToSZvslFZHOvoPx34+65R48CrBaucvdBPPslno6FFecQmc0Cy5CSVMr6VM67YdJp/E7RGTyl5M8KlCwXHjEabA9dUaT9oMyoR1Jb1u2m1lZWjAx1PTZ86+22XtskCizG3+hZIdwsSvGwArAhBymnkAsNZso3zqHymbnsnJpZ22FCUs/Gb4YiDjFahC61WsAmfiag6eJwLApfe086QVAcVfSLZQ82ppFRZV79PM+wu2VU0sb1zmj5F97MaF7LbZB4+QPoL9mnpOcRY6Unbs+TFyp7Pp4W8+/HbI5U=
|
重装覆盖
vulab@sechelper:~$ ls -lt /usr/bin/ssh /usr/sbin/sshd # 不可靠,时间可以被篡改 -rwxr-xr-x 1 root root 876328 Dec 2 2021 /usr/sbin/sshd -rwxr-xr-x 1 root root 789448 Dec 18 2015 /usr/bin/ssh
vulab@sechelper:~$ sudo touch -a -m -t 201512180130.09 /usr/bin/ssh # 篡改ssh创建时间
vulab@sechelper:~$ ssh -V OpenSSH_8.2p1 Ubuntu-4ubuntu0.4, OpenSSL 1.1.1f 31 Mar 2020
|
参考:
- openssh-backdoor
- ssh服务是如何劫持密码
定时任务
定时定点执行Linux程序或脚本。
crontab
定时任务计划命令,下面几个是创建任务后保存的路径。
- /var/spool/cron/ 目录里的任务以用户命名
- /etc/crontab 调度管理维护任务
- /etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
- 下面这些都是检查重点对象
- /etc/cron.hourly/ 每小时执行一次
- /etc/cron.daily/ 每天执行一次
- /etc/cron.weekly/ 每周执行一次
- /etc/cron.monthly/ 每月执行一次
扩展知识:
/etc/cron.allow
存放可创建定时任务账户,一行一个账户名,已创建的定时任务不受影响
vulab@sechelper:~$sudo cat /etc/cron.allow root vulab@sechelper:~$ crontab -e You (vulab) are not allowed to use this program (crontab) See crontab(1) for more information
|
/etc/cron.deny
存放不可创建定时任务账户,一行一个账户名,已创建的定时任务不受影响
vulab@sechelper:~$ crontab -e You (vulab) are not allowed to use this program (crontab) See crontab(1) for more information
|
参考:
Rootkit
Rootkit是指其主要功能为:隐藏其他程序进程的软件,可能是一个或一个以上的软件组合。在今天,Rootkit一词更多地是指被作为驱动程序,加载到操作系统内核中的恶意软件。
图4 rootkit原理图
vulab@sechelper:~/1337kit$ sudo python3 builder.py --config config.yml # 编译rootkit [sudo] password for vulab:
████ ████████ ████████ ██████████ █████ ███ █████ ░░███ ███░░░░███ ███░░░░███░███░░░░███░░███ ░░░ ░░███ ░███ ░░░ ░███░░░ ░███░░░ ███ ░███ █████ ████ ███████ ░███ ██████░ ██████░ ███ ░███░░███ ░░███ ░░░███░ ░███ ░░░░░░███ ░░░░░░███ ███ ░██████░ ░███ ░███ ░███ ███ ░███ ███ ░███ ███ ░███░░███ ░███ ░███ ███ █████░░████████ ░░████████ ███ ████ █████ █████ ░░█████ ░░░░░ ░░░░░░░░ ░░░░░░░░ ░░░ ░░░░ ░░░░░ ░░░░░ ░░░░░ LKM Rootkit Builder ... LD [M] /tmp/ItclNzX3O3hJUXQ3/project.ko make[1]: Leaving directory '/usr/src/linux-headers-5.4.0-109-generic'
=== File /home/vulab/1337kit/project.ko created ===
vulab@sechelper:~/1337kit$ sudo insmod project.ko # 将rootkit安装到内核 vulab@sechelper:~/1337kit$ sudo lsmod # 查看内核模块 vulab@sechelper:~/1337kit$ sudo rmmod project # 卸载内核模块
|
检查系统是否被植入rootkit
vulab@sechelper:~$ sudo apt install chkrootkit # 安装chkrootkit vulab@sechelper:~$ sudo chkrootkit [sudo] password for vulab: ROOTDIR is `/' Checking `amd'... not found Checking `basename'... not infected Checking `biff'... not found Checking `chfn'... not infected Checking `chsh'... not infected Checking `cron'... not infected ... Searching for suspect PHP files... nothing found Searching for anomalies in shell history files... nothing found Checking `asp'... not infected Checking `bindshell'... not infected Checking `lkm'... chkproc: nothing detected chkdirs: nothing detected Checking `rexedcs'... not found Checking `sniffer'... lo: not promisc and no packet ... Checking `w55808'... not infected Checking `wted'... chkwtmp: nothing deleted Checking `scalper'... not infected Checking `slapper'... not infected Checking `z2'... chklastlog: nothing deleted Checking `chkutmp'... chkutmp: nothing deleted Checking `OSX_RSPLUG'... not tested
|
sudo apt install rkhunter # 安装rkhunter sudo apt install rkhunter # 安装rkhunter
|
图5 rhkhunter 配置
vulab@sechelper:~$ sudo rkhunter --check [ Rootkit Hunter version 1.4.6 ]
Checking system commands...
Performing 'strings' command checks Checking 'strings' command [ OK ]
Performing 'shared libraries' checks Checking for preloading variables [ None found ] Checking for preloaded libraries [ None found ] Checking LD_LIBRARY_PATH variable [ Not found ]
...
|
隐藏的rootkit如何删除
Rootkit在内核模块里找不到,那么就存在删除不掉的可能,这时候需要将感染系统以文件挂载到其它Linux系统上,进行清除操作。
参考:
- rkhunter 官网
- chkrootkit 官网
- rootkit demo
严重声明
文中技术只可用于安全技术研究,任何非法用途与作者无关,请勿用在生产环境安装测试rootkit。
原文转载自,助安社区( https://secself.com/)
关注公众号【助安社区】安全零基础到入门都在这,社区内部红队沙龙、资源共享和大厂工作经验。真正热爱安全和喜欢技术交流的小伙伴欢迎加入我们