企业内网模拟靶场搭建3_中期进展

一、环境搭建进展情况

1. 云服务进展

1. 针对云服务防御思路

参考文献:https://segmentfault.com/a/1190000022004561

image-20230402190342456

​ 自底向上看,底层从硬件安全(可信环境)到宿主机安全 。将容器编排技术(Kubernetes等)看作云上的“操作系统”,它负责自动化部署、扩缩容、管理应用等。在它之上由微服务、Service Mesh、容器技术(Docker等)、容器镜像(仓库)组成。它们之间相辅相成,以这些技术为基础构建云原生安全。

​ 我们再对容器安全做一层抽象,又可以看作构建时安全(Build)、部署时安全(Deployment)、运行时安全(Runtime)。对于安全实施准则,我们将其分为三个阶段:

  • 攻击前:裁剪攻击面,减少对外暴露的攻击面(本文涉及的场景关键词:隔离);
  • 攻击时:降低攻击成功率(本文涉及的场景关键词:加固);
  • 攻击后:减少攻击成功后攻击者所能获取的有价值的信息、数据以及增加留后门的难度等。
image-20230402190502171

​ 容器一共有7个攻击面:Linux Kernel、Namespace/Cgroups/Aufs、Seccomp-bpf、Libs、Language VM、User Code、Container(Docker) engine。

以容器逃逸为风险模型,可以提炼出3个攻击面:

  1. Linux内核漏洞;
  2. 容器自身;
  3. 不安全部署(配置)。
  1. Linux Kernel:云容器运行在主机操作系统之上,因此,Linux Kernel 是云容器最基本的攻击面之一。攻击者可以通过利用 Linux Kernel 的漏洞来访问和破坏云容器内部的数据和应用程序。
  2. Namespace/Cgroups/Aufs:这些技术是云容器中的核心组件,用于隔离和限制容器的资源和访问权限。然而,攻击者可以利用这些技术的漏洞,绕过容器的隔离和限制,访问和破坏容器内部的数据和应用程序。
  3. Seccomp-bpf:这是一种 Linux 内核的安全模块,用于限制容器内的系统调用。攻击者可以通过利用 Seccomp-bpf 的漏洞,绕过容器的系统调用限制,访问和破坏容器内部的数据和应用程序。
  4. Libs:容器中使用的库也是一个攻击面。攻击者可以通过利用库的漏洞,绕过容器的安全限制,访问和破坏容器内部的数据和应用程序。
  5. Language VM:容器中运行的虚拟机(例如 Java VM 或 Python VM)也是一个攻击面。攻击者可以利用虚拟机的漏洞,访问和破坏容器内部的数据和应用程序。
  6. User Code:容器中运行的用户代码也是一个攻击面。攻击者可以通过注入恶意代码或利用应用程序的漏洞,访问和破坏容器内部的数据和应用程序。
  7. Container(Docker) engine:Docker 引擎本身也是一个攻击面。攻击者可以通过利用 Docker 引擎的漏洞,控制和破坏容器的配置和运行环境

2.主机网络模式探究

Pod为Host网络模式,即直接使用宿主机的网络,不进行网络虚拟化隔离。这样一来,Pod中的所有容器就直接暴露在宿主机的网络环境中,这时候,Pod的PodIP就是其所在Node的IP。
从原理上来说,当设定Pod的网络为Host时,是设定了Pod中pod-infrastructure(或pause)容器的网络为Host,Pod内部其他容器的网络指向该容器。

Yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 1
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: mynginx
imagePullPolicy: IfNotPresent # 宿主机不存在则拉取远程
image: nginx
hostNetwork: true
k8s pod镜像拉取策略
  • Always:每次创建pod时重新远程拉取镜像
  • IfNotPresent:宿主机不存在则拉取远程
  • Never:只使用宿主机上存在的,永不拉取
Command
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 根据yaml配置文件创建资源
kubectl create -f xxx.yml

# 资源本不存在: 创建新资源。
# 资源已存在: 使配置在已存在的资源上生效
kubectl apply -f xxx.yml

# 获取某类资源列表信息
kubectl get pod/deployment/...
# 删除某类资源
kubectl delete pod/deployment/...
# 详细信息
kubectl describe pod
# 打印日志
kubectl logs

常见错误

image-20230402182406353

  • ImagePullBackOff:远程镜像拉取失败
  • ErrImageNeverPull:当策略为Never且部署节点上不存在该镜像;从节点上要有这个镜像。准确的说是调度到哪个节点,那个节点上就要有这个镜像,否则会报错;当使用本地镜像时需要注意该问题!

image-20230402182423634

image-20230402182504542
以pod形式启动了一个镜像,执行kubectl get pod 查看状态,发现pod一直重启。查看具体的报错信息,发现报错内容为:Back-off restarting failed container

  • 原因:镜像启动容器后,容器内部没有常驻进程,导致容器启动成功后即退出,从而进行了持续的重启。
  • 解决:只需要给容器加上一个常驻的进程就可以要使Pod持续运行,就必须指定一个永远不会完成的任务。
    因此在yaml文件中指定一个启动命令,完整内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 1
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: mynginx
imagePullPolicy: IfNotPresent # 宿主机不存在则拉取远程
image: nginx
command: ["/bin/bash", "-ce", "tail -f /dev/null"]
hostNetwork: true

3.K8s防护调研

调研情况

参考链接:https://segmentfault.com/a/1190000041424520

NeuVector 此次开源的并非某个组件或者安全工具,而是一套完整的容器安全平台。这与其他各大云原生安全厂商的开源策略有很大的区别。目前,云原生领域活跃的开源厂商包括:Aqua Security, Falco(sysdig), Anchore, Fairwinds, Portshift 等,以及被红帽收购的 Stackrox,除此还有像 Clair 这样来自大厂的安全工具。而传统的安全厂商虽然都有面向原生安全的产品,然而鲜有软件开源。

开源项目情况:

项目 厂商 链接 Star 类型 开源时间
clair Quay https://github.com/quay/clair 8.4k 镜像扫描 2015-11-13
trivy Aqua https://github.com/aquasecuri… 10.1k 镜像扫描 2019-04-11
kube-hunter Aqua https://github.com/aquasecuri… 3.4k 漏洞扫描 2018-07-18
kube-bench Aqua https://github.com/aquasecuri… 4.5k CIS 安全基线 2017-06-19
starboard Aqua https://github.com/aquasecuri… 968 Dashboard 2020-03-17
tracee Aqua https://github.com/aquasecuri… 1.5k 基于 eBPF 的系统事件追踪 2019-09-18
anchore-engine anchore https://github.com/anchore/an… 1.4k 漏洞扫描 2017-09-06
kyverno kyverno.io https://github.com/kyverno/ky… 1.8k Kubernetes 策略与审计 2019-02-04
GateKeeper OPA (sysdig) https://github.com/open-polic… 1.3k Kubernetes 策略与审计 2018-10-26
falco falcosecurity(sysdig) https://github.com/falcosecur… 4.4k 基于内核模块的系统事件追踪、警告 2016-01-19
terrascan accurics.com https://github.com/accurics/t… 2.7k 通用的 IaS 配置扫描 2017-09-11
Kubei portshift https://github.com/cisco-open… 489 镜像扫描(带面板) 2020-03-22
Polaris Fairwinds https://github.com/FairwindsO… 2.4k 配置扫描与策略 2018-11-15
kubesec controlplaneio https://github.com/controlpla… 667 Kubernetes 配置扫描 2017-10-10
KubeEye KubeSphere https://github.com/kubesphere… 424 基于策略的 Kubernetes 集群配置扫描 2020-11-07
kube-linter Stackrox(RedHat) https://github.com/stackrox/k… 1.8k Kubernetes 配置扫描 2020-08-13

上表中,我们列举出了来自各个安全厂商的主要开源项目。从上面的表格中我们可以看出,目前开源安全软件集中在四大类别:

  1. 镜像漏洞扫描
  2. 合规、基线扫描
  3. Kubernetes 安全策略、配置管理
  4. 威胁检测
image-20230402183537496
  • Manager, NeuVector 的 Web 控制台,为用户提供了统一的管理 UI,便于用户查看安全事件、管理安全解决方案、规则等。
  • Controller, Backend 服务器及控制器,管理如 Enforcer、Scanner 等其他组件,分发安全策略及调度扫描任务。
  • Scanner, 用户执行漏洞扫描、基线扫描等任务。
  • Enforcer, 一个轻量级的容器,用于拦截系统事件,执行安全策略等。通常以 Daemon set 运行再集群中的每个节点上。
  • Updater, 用于更新 CVE 数据库。
KubeArmor

KubeArmor是一个支持容器的运行时安全实施系统,它可以从系统级别限制容器的行为(如进程执行、文件访问、网络操作和资源利用率)。

官网
git

该工具可通过规则配置,对容器指定资源与行为进行监控和拦截,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: security.kubearmor.com/v1
kind: KubeArmorPolicy
metadata:
name: ksp-group-1-proc-path-block
namespace: multiubuntu
spec:
selector:
matchLabels:
group: group-1
process:
matchPaths:
- path: /bin/sleep
action:
Block

说明:此策略的目的是阻止在带有“group-1”标签的容器中执行“/bin/sleep”。 为此,我们在 selector -> matchLabels 中定义 ‘group-1’ 标签,在 process -> matchPaths 中定义特定路径(’/bin/sleep’)。 此外,我们将“阻止”作为此策略的操作。
通过不同的规则配置可达到不同的拦截效果,下面列举出部分:

  • Block a specific executable
  • Block all executables in a specific directory
  • Block all executables in a specific directory and its subdirectories
  • Allow specific executables to access certain files only
  • …..

4. NeuVector

NeuVector提供实时深入的容器网络可视化、东西向容器网络监控、主动隔离和保护、容器主机安全以及容器内部安全。
NeuVector并非某个组件或者安全工具,而是一套完整的容器安全平台。

Install

安装过程:

创建 namespace

1
kubectl create namespace neuvector

部署 CRD (Kubernetes 1.19+ 版本)

1
kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/crd-k8s-1.19.yaml

部署 CRD (Kubernetes 1.18 或更低版本)

1
kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/crd-k8s-1.16.yaml

配置 RBAC

1
2
3
4
5
6
7
8
9
10
11
12
kubectl create clusterrole neuvector-binding-app --verb=get,list,watch,update --resource=nodes,pods,services,namespaces
kubectl create clusterrole neuvector-binding-rbac --verb=get,list,watch --resource=rolebindings.rbac.authorization.k8s.io,roles.rbac.authorization.k8s.io,clusterrolebindings.rbac.authorization.k8s.io,clusterroles.rbac.authorization.k8s.io
kubectl create clusterrolebinding neuvector-binding-app --clusterrole=neuvector-binding-app --serviceaccount=neuvector:default
kubectl create clusterrolebinding neuvector-binding-rbac --clusterrole=neuvector-binding-rbac --serviceaccount=neuvector:default
kubectl create clusterrole neuvector-binding-admission --verb=get,list,watch,create,update,delete --resource=validatingwebhookconfigurations,mutatingwebhookconfigurations
kubectl create clusterrolebinding neuvector-binding-admission --clusterrole=neuvector-binding-admission --serviceaccount=neuvector:default
kubectl create clusterrole neuvector-binding-customresourcedefinition --verb=watch,create,get --resource=customresourcedefinitions
kubectl create clusterrolebinding neuvector-binding-customresourcedefinition --clusterrole=neuvector-binding-customresourcedefinition --serviceaccount=neuvector:default
kubectl create clusterrole neuvector-binding-nvsecurityrules --verb=list,delete --resource=nvsecurityrules,nvclustersecurityrules
kubectl create clusterrolebinding neuvector-binding-nvsecurityrules --clusterrole=neuvector-binding-nvsecurityrules --serviceaccount=neuvector:default
kubectl create clusterrolebinding neuvector-binding-view --clusterrole=view --serviceaccount=neuvector:default
kubectl create rolebinding neuvector-admin --clusterrole=admin --serviceaccount=neuvector:default -n neuvector

检查是否有以下 RBAC 对象

1
2
3
4
5
6
7
8
9
10
kubectl get clusterrolebinding  | grep neuvector

neuvector-binding-admission ClusterRole/neuvector-binding-admission 44h
neuvector-binding-app ClusterRole/neuvector-binding-app 44h
neuvector-binding-customresourcedefinition ClusterRole/neuvector-binding-customresourcedefinition 44h
neuvector-binding-nvadmissioncontrolsecurityrules ClusterRole/neuvector-binding-nvadmissioncontrolsecurityrules 44h
neuvector-binding-nvsecurityrules ClusterRole/neuvector-binding-nvsecurityrules 44h
neuvector-binding-nvwafsecurityrules ClusterRole/neuvector-binding-nvwafsecurityrules 44h
neuvector-binding-rbac ClusterRole/neuvector-binding-rbac 44h
neuvector-binding-view ClusterRole/view 44h
1
2
3
4
kubectl get rolebinding -n neuvector | grep neuvector

neuvector-admin ClusterRole/admin 44h
neuvector-binding-psp Role/neuvector-binding-psp 44h

部署 NeuVector

底层 Runtime 为 Docker

1
kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.0.0/neuvector-docker-k8s.yaml

底层 Runtime 为 Containerd(对于 k3s 和 rke2 可以使用此 yaml 文件)

1
kubectl apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.0.0/neuvector-containerd-k8s.yaml

1.21 以下的 Kubernetes 版本会提示以下错误,将 yaml 文件下载将 batch/v1 修改为 batch/v1beta1

1
error: unable to recognize "https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.0.0/neuvector-docker-k8s.yaml": no matches for kind "CronJob" in version "batch/v1"

1.20.x cronjob 还处于 beta 阶段,1.21 版本开始 cronjob 才正式 GA 。

默认部署 web-ui 使用的是 loadblance 类型的 Service,为了方便访问修改为 NodePort,也可以通过 Ingress 对外提供服务

1
kubectl patch  svc neuvector-service-webui  -n neuvector --type='json' -p '[{"op":"replace","path":"/spec/type","value":"NodePort"},{"op":"add","path":"/spec/ports/0/nodePort","value":30888}]'
遇到的问题和解决方案

​ NeuVector 安装部署需要在k8s集群中部署包括controller,enforcer,manager,scanner在内的若干个pod,通过官方的yaml文件进行部署时,出现了上述的镜像拉取失败而导致的pod启动失败的问题。

image-20230402182710512

image-20230402182725446

​ 如上图所示,多数pod启动失败,原因皆为镜像拉取失败导致的,查看官方提供的yaml文件,得知所有镜像的默认拉取策略为Always,尝试将其改为IfNotPresent,并提前手动拉取镜像(docker pull)到node节点本地来提高pod的部署与启动速度。

​ 出现网络问题,这个应该就是之前镜像拉取失败的主要原因:
image-20230402182747459

​ 尝试配置DNS解析,并重启docker服务后解决:

image-20230402182824599

​ 所有的镜像均手动拉取下来后,重启之前启动失败的pod:

image-20230402182849092

访问 https://node-ip:30888,使用 admin/admin登录

image-20230402182934688

功能应用:

​ 成功安装 NeuVector 后,用户即可通过浏览器打开 NeuVector 的控制台。在控制台的导航栏中包含了,资产管理、策略管理、安全风险、通知、平台设置及联邦集群等五项核心功能:

Assets Policy Security Risks Notifications Settings
Platforms Admission Control Vulnerabilities Security Events Users & Roles
Nodes Groups Vulnerabilities Profile Risk Reports Configuration
Containers Network Rules Compliance Events LDAP/AD Settings
Registries Response Rules Compliance Profile - SAML Setting
System Components DLP Sensors - - OIDC Settings
WAF Sensors - - -

扫描查看容器存在的中高危漏洞情况

image-20230402184613404

查看容器内存使用与网络通信情况
image-20230402184527091

配置容器应用分组的相关进程规则,文件访问规则等
image-20230402184507499

配置集群与容器的网络规则

image-20230402184409738

image-20230402184334052

查看集群中的安全事件
image-20230402184309228

2.网络边界防火墙

pfsense配置zerotier

pfsense对应的freeBSD版本是12.3

image-20230402141015331

下载zerotier:

image-20230402140810947

1
pkg add -f https://pkg.freebsd.org/FreeBSD:12:amd64/latest/All/zerotier-1.10.4.pkg

第二步,安装pfSense-pkg-zerotier软件包,这个软件包提供了在pfSense web界面管理zerotier网络的功能。

下载pfSense-pkg-zerotier-cn软件包,解压缩后上传到pfSense后台,然后在pfSense shell环境下执行以下安装命令:

1
pkg install pfSense-pkg-zerotier-cn.pkg

在启动ZeroTier服务之前,需要手动修改两个文件。

打开etc>rc.conf文件,添加以下内容并保存:

1
zerotier_enable="YES"

打开etc>sysctl.conf,添加以下内容并保存:

1
net.link.tap.up_on_open=1

防火墙配置思路(不同区域的访问控制规则)

添加zerotier接口:

image-20230402144022465

单一防火墙:

​ 使用单一防火墙创建包含DMZ的网络体系必须具有3个以上的网络接口:

  • 外部网络ISP连接到防火墙第一网络接口;

  • 内部网络接防火墙的第二网络接口;

  • DMZ则连接防火墙的第三网络接口。

image-20230402151106595

双重防火墙:

​ 第一个防火墙(Pfsense)配置为仅允许通往DMZ的通信;IDS(suricata)配置为只允许从DMZ到内部网络的通信。这个设置在安全性上更高,因为攻击内部网络需要突破两个防火墙,如果这两个防火墙是由两个不同的供应商提供的话,则会提供更多的保护,因为这样两个设备就不太可能遇到同样的安全漏洞。这种配置的缺点是购买和管理成本更高。使用不同供应商的不同防火墙的做法被认为是“纵深防御”安全策略的一个组成部分。

image-20230402151122412

防火墙的设置原则如下:

  • 内网可以访问外网。内网的用户显然需要自由地访问外网。在这一策略中,防火墙需要进行源地址转换。

  • 内网可以访问DMZ。此策略是为了方便内网用户使用和管理DMZ中的服务器。建议只对有限的主机进行开放。

  • 外网不能访问内网。很显然,内网中存放的是公司内部数据,这些数据不允许外网的用户进行访问。

  • 外网可以访问DMZ。DMZ中的服务器本身就是要给外界提供服务的,所以外网必须可以访问DMZ。同时,外网访问DMZ需要由防火墙完成对外地址到服务器实际地址的转换。

  • DMZ访问内网有限制。很明显,如果违背此策略,则当入侵者攻陷DMZ时,就可以进一步进攻到内网的重要数据。

  • DMZ不能访问外网。此条策略也有例外,比如DMZ中放置邮件服务器时,就需要访问外网,否则将不能正常工作。可以根据需要进行设置。


当防火墙策略将数据包设置为 “block” 时,防火墙将完全丢弃该数据包,并且不会向发送者发送任何响应。这意味着,被阻止的数据包将被完全忽略,而发送者将不会知道它们是否已被接收或被丢弃。

相反,当防火墙策略将数据包设置为 “reject” 时,防火墙将向发送者发送一个拒绝的响应,通知其其请求已被阻止。这意味着,发送者将会知道其请求已被拒绝,并且可以尝试进行其他操作。

image-20230402170708527

image-20230402170719845

image-20230402170648171

IDS的另一种部署方式

image-20230402181207296

使用nat代理转发dns请求

image-20230402182009012

3. Web&邮件服务的搭建情况

坚冰官网——模拟企业官网

选型:Vue+npm

端口:5000

1
2
3
4
5
6
7
cd /var/www/fastice-tech && npm run serve -- --port 5000
Project setup
npm install
Compiles and hot-reloads for development
npm run serve
Compiles and minifies for production
npm run build
image-20230402204948566

北半球小说网站——模拟博客

选型:Flask+Mysql+nginx

端口:5002

1
2
3
cd /var/www/beibq && python manage.py runserver -h 0.0.0.0 -p 5002
启动:python manage.py runserver -h 0.0.0.0 -p 5002
beibq:用户名root-密码123456

创建小说、阅览小说、创建用户、md浏览等功能。

预留漏洞:文件上传、XSS、sql注入

image-20230402204909966

学生选课/论坛——模拟多用户论坛

选型:Django+Mysql

1
cd /var/www/studentTrainPlan && python main.py runserver
image-20230402204857538

预留漏洞:sql注入、XSS

全部反向代理指WAF

WAFip为 http://192.168.254.128/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#企业官网
server {
listen 5000;
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
location / {
#proxy_pass <http://localhost:8085>;
proxy_pass <http://192.168.254.133:5000>;
proxy_set_header Host $host;
}
}

#学生论坛
server {
listen 80;
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
location / {
proxy_pass <http://192.168.254.133:5001>;
proxy_set_header Host $host;
}
}
#北半球小说
server {
listen 5002;
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
location / {
proxy_pass <http://192.168.254.133:5002>;
proxy_set_header Host $host;
}
}

image-20230402204835963

image-20230402204814105

防火墙测试:(sql注入过滤测试,测试结果为被防火墙拦截,如下)

image-20230402204700848

image-20230402204733169

邮件服务器简单使用

Postfix 是一种 Mail Transfer Agent 邮件传送代理 (MTA) 是 Ubuntu 缺省的邮件代理程序.

1
2
配置SMTP用户名和密码
biscuit19@bisc.com:587 biscuit19:123456

发送邮件测试:

image-20230402204640329

(由于缺少公网域名,所以无法正常解析DNS、发送邮件)

4. IPS的配置

环境搭建

1
2
3
4
5
6
firewall-cmd --add-masquerade --permanent
#开启防火墙的NAT功能,注意如果防火墙为开启需要先开启防火墙
#这个好像也叫地址伪装功能

firewall-cmd --reload #防火墙重新启动
firewall-cmd --list-all #查看masquerade状态
image-20230402192525999

​ 完成后再开启Linux内核路由功能:

​ 通过vim /etc/sysctl.conf在文件里边修改或添加 net.ipv4.ip_forward=1 修改结果如下所示:

image-20230402192550049

然后输入sysctl -p 使命令生效

这时,回到客户机ping或者traceroute 一下百度www.baidu.com进行测试

image-20230402192622007

成功搭建了路由功能。

IPS配置

​ 首先,输入命令suricata –build-info检查是否在 Suricata 构建中启用了 NFQ,确保输出中列出了 NFQ

image-20230402192906565

​ 使用选项sudo suricata -c /etc/suricata/suricata.yaml -q 0,告诉 Suricata 它应该使用哪个队列号,以便使用NFQ模式运行suricata。

nfqueue是一个Linux内核网络过滤器,可以将特定的网络数据包从内核网络栈中抽取出来,交由用户空间程序处理。通过使用nfqueue,用户空间程序可以对网络数据包进行各种操作,如修改数据包的内容、记录数据包的信息、阻止或允许数据包的传输等。nfqueue可以与iptables或其他内核网络过滤器集成使用,以实现更加复杂的网络过滤和安全策略。通过打开nfqueue支持,可以将网络流量导入到Suricata的处理引擎中,进行深度检测和分析。Suricata可以对流量进行多种操作,如检测、阻止、修改等,以实现更加高效和准确的网络安全策略。

​ 在本次实验中,Suricata 在网关上运行并且旨在保护在该网关后面的计算机 ,在网关场景中,将流量发送到 Suricata 的最简单规则是:sudo iptables -I FORWARD -j NFQUEUE,这种情况下,所有转发的流量都流向suricata。

image-20230402192937279

​ 在suricata.yaml文件中,我们配置自己的test.rules规则:

image-20230402192949380

​ 现在来进行一个简单的测试,我们在test.rules中加入这样一条规则:reject http any any -> any any (msg:”hit baidu.com…”;content:”baidu”; reference:url, www.baidu.com;),禁止客户端对百度网站的访问。

​ 然后让suricata在网关下运行:

image-20230402193014172

​ 这时,使用客户端访问http://www.baidu.com是不可行的,下图中是很明显的前后对比:

image-20230402193032889

规则集选用与规则编写

在高层次上,Suricata签名由三部分组成:

  • Action:当流量符合规则时采取的行动
  • Header:一个标题,描述主机、IP地址、端口、协议和流量方向(传入或传出)
  • Options:选项,指定诸如签名ID(sid)、日志信息、匹配数据包内容的正则表达式、分类类型,以及其他可以帮助缩小识别合法和可疑流量的修饰语

签名的一般结构如下:

1
ACTION HEADER OPTIONS

alert ssh any any -> 203.0.113.0/24 2022 (msg:”SSH TRAFFIC on non-SSH port”; sid:1000000; rev:2;)

​ 然而,我们没必要,也不可能自己编写所有的规则,suricata本身提供了很多对于应用层协议常见攻击方式的检测规则集,如下所示:

image-20230402213026014

较为重要的一些值得注意的协议:

  • Kerberos是一种计算机网络认证协议,是基于加密 Ticket 的身份认证协议,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份。 Kerberos是第三方认证机制,其中用户和服务依赖于第三方(Kerberos服务器)来对彼此进行身份验证。

  • NFS就是Network File System的缩写,即网络文件系统,Windows可以使用NFS(Network File System)协议来访问NFS共享文件系统,这也是一种常见的跨平台文件共享方案,它允许网络中的计算机之间通过TCP/IP网络共享资源,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。

  • Modbus的应用十分广泛,特别是在工业控制领域,Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。

  • NTP是从时间协议(Time Protocol)和ICMP时间戳报文(ICMP TimeStamp Message)演变而来,在准确性和健壮性方面进行了特殊的设计,理论上精度可达十亿分之一秒。NTP协议是基于UDP进行传输的,使用端口号为123。

  • SMB(Server Message Block)是一种在计算机网络中常用的通信协议,它允许客户端在计算机网络中访问和共享文件、打印机、串口和其它资源。SMB协议最初由IBM开发,后来被微软引入并进一步发展和推广,成为Windows系统中最常用的文件和打印共享协议之一。

  • MQTT(消息队列遥测传输)是物联网中用于向设备发送消息和从设备发送消息的轻量级消息传递协议。它通过TCP/IP网络运行。还有许多其他消息传递协议可用于物联网,但MQTT由于其简单性和易用性而迅速成为最受欢迎的协议。

规则分析:

1
alert dhcp any any -> any any (msg:"SURICATA DHCP truncated options"; app-layer-event:dhcp.truncated_options; classtype:protocol-command-decode; sid:2227001; rev:1;)
  • alert: 表示如果满足规则条件,则产生一个警报。
  • dhcp any any -> any any: 表示匹配源地址和目的地址均为任意IP地址的DHCP流量。
  • msg:”SURICATA DHCP truncated options”: 规则的警报信息,表示检测到DHCP请求中存在选项截断。
  • app-layer-event:dhcp.truncated_options: 表示警报是由于DHCP协议中存在选项截断导致的,这是基于Suricata IDS的协议分析引擎检测到的。
  • classtype:protocol-command-decode: 表示规则的类型为“协议命令解码”,即检测协议命令是否被正确解码,可以防止一些协议解码攻击。
  • sid:2227001: 规则的唯一标识符,用于区分不同的规则。
  • rev:1: 规则的版本号,用于区分不同版本的规则。

5. 多模块的拼接

vlan与子网技术辨析

参考:https://blog.csdn.net/hiphop1522/article/details/126688669

VLAN和IP子网划分的目的是隔离广播包数据和访问控制。VLAN隔离的是二层广播包(广播地址是全FF:FF:FF:FF:FF:FF的MAC地址),IP子网隔离的是三层IP广播包,广播地址是IP子网的最后一个IP地址或全网广播地址(255.255.255.255)。

image-20230402224030127
  • PC1:10.1.1.1/24

  • PC2:无地址

  • PC3:10.1.2.1/24

问题一:PC1发送广播帧的话PC2和PC3能不能收到广播帧?

问题二:PC1和PC3是否能够通信?

首先针对问题一的回答是肯定的,PC1发送广播帧的话,PC2和PC3可以收到。

那么我们来看下为什么。

  1. PC1发送广播帧后,该广播帧到达SW1后,因为是广播帧,所以交换机的处理方式是泛洪,将该广播帧从除了接收端口以外的所有接口都复制一份发出去,此时PC2收到了该广播帧,如下图。
  2. SW1将广播帧发给了SW2和PC2,此时SW2收到该广播帧,也会执行泛洪动作,将该广播帧发给PC3,如下图。
  3. 所以问题一的答案是PC1发送广播帧后,PC2和PC3都能收到该广播帧。

再是针对问题二的回答是否定的,PC1和PC3不可以通信(SW1和SW2是傻瓜交换机)。

这又是为什么呢?

​ 对于PC1来说,他的地址是10.1.1.1/24,所以他认为自己所在的广播域是10.1.1.0/24这个区域,PC3:10.1.2.1/24和他不在同一个广播域,所以PC1想要找PC3的话一定会去其他的广播域找,也就是会将报文发给他的网关,而不会在自己所在的这个广播域去找PC3。所以PC1永远无法找到PC3。

zerotier环境

​ 上两周,提出了使用zerotier的flow rules进行端口转发的方式,因此,将拓扑图中的14台主机加入同一网络,尝试进行网络划分工作:

image-20230402223724377

​ 遇到的问题:

  • 由于zerotier不是物理设备,因此在linux中没有对应网卡的配置文件,无法进行网关、子网掩码等属性的配置
  • 可以通过如下配置,指定子网掩码位255.255.255.0,但是由于广播域是乱的,导致无法正常通信:
image-20230402230748299

二、攻击思路调研

​ ATT&CK作为MITRE机构开发的攻击模型框架,是一个基于现实世界所观察到的真实攻击向量的集合,其包含了已公开报告的众多威胁组织及其使用的工具和攻击技术。

image-20230402223332107

​ ATT&CK框架包括两个主要部分:战术和技术。战术是攻击者在攻击生命周期中使用的高级目标,而技术则是攻击者在实现这些目标时使用的具体工具和方法。ATT&CK框架还包括一个“预测”部分,其中包含了一些可能的未来攻击趋势。

ATT&CK框架现在包括14个战术,分别是:

Reconnaissance, Resource Development, Initial Access, Execution, Persistence, Privilege Escalation, Defense Evasion, Credential Access, Discovery, Lateral Movement, Collection, Command and Control, Exfiltration, Impact.

​ 侦察、资源开发、初始访问、命令执行、持久化、权限提升、防御规避、发现、横向移动、收集、命令与控制和数据泄露。这些战术按照逻辑分布在多个矩阵中,以“初始访问”战术开始,经过“执行”、“持久化”、“提权”、“防御绕过”、“凭据访问”、“发现”、“横向移动”、“收集”、“命令与控制”、“数据泄露“和”后续破坏“等。

https://cdn.jsdelivr.net/gh/Biscuit19/PicGo/img/image-20230402210746995.png

ID Name Description
https://attack.mitre.org/tactics/TA0043 Reconnaissance The adversary is trying to gather information they can use to plan future operations.
https://attack.mitre.org/tactics/TA0042 Resource Development The adversary is trying to establish resources they can use to support operations.
https://attack.mitre.org/tactics/TA0001 Initial Access The adversary is trying to get into your network.
https://attack.mitre.org/tactics/TA0002 Execution The adversary is trying to run malicious code.
https://attack.mitre.org/tactics/TA0003 Persistence The adversary is trying to maintain their foothold.
https://attack.mitre.org/tactics/TA0004 Privilege Escalation The adversary is trying to gain higher-level permissions.
https://attack.mitre.org/tactics/TA0005 Defense Evasion The adversary is trying to avoid being detected.
https://attack.mitre.org/tactics/TA0006 Credential Access The adversary is trying to steal account names and passwords.
https://attack.mitre.org/tactics/TA0007 Discovery The adversary is trying to figure out your environment.
https://attack.mitre.org/tactics/TA0008 Lateral Movement The adversary is trying to move through your environment.
https://attack.mitre.org/tactics/TA0009 Collection The adversary is trying to gather data of interest to their goal.
https://attack.mitre.org/tactics/TA0011 Command and Control The adversary is trying to communicate with compromised systems to control them.
https://attack.mitre.org/tactics/TA0010 Exfiltration The adversary is trying to steal data.
https://attack.mitre.org/tactics/TA0040 Impact The adversary is trying to manipulate, interrupt, or destroy your systems and data.

根据ATT&CK的渗透战术,我们制定了基本的渗透攻击框架:

步骤 具体执行 渗透工具集
侦查+资源准备 信息收集与攻击准备(如注册账号、了解功能)、账户凭证 theHarvester、Shodan、Recon-ng、Google Hacking Database
接入网络+执行攻击 初次进入网络、执行恶意代码 Metasploit、Empire
持久化+防检测 将恶意攻击持久化 Mimikatz、PowerSploit、Gsecdump、Pwdump
提权 提高用户权限 PowerUp、Incognito、Windows Exploit Suggester、JAWS
窃取数据 窃取用户名与密码 Responder、Wireshark、Tcpdump、Ettercap
环境发现+横向渗透 挖掘环境、横向移动 BloodHound、CrackMapExec、Empire、Metasploit

这些工具集还未具体测试,之后会逐个测试,构建渗透战术与流程。