企业内网模拟靶场搭建2_环境搭建

本文旨在对企业内网搭建的模块进行划分,并给出完整的规划情况和调研所得的技术栈,汇报共7轮,于16周内完成。

组长:鲁昊朗

小组成员:刘奇、彭竑睿、时钰铎、周椿林

汇报时间:2023年3月20日

一、针对网络拓扑的优化与修改

针对网络拓扑,在实际搭建过程中,我们进行了优化,并分配了IP地址:

image-20230318142816273

网络拓扑图有以下改动:

  • 取消子网边界的多余的防火墙:子网内部设置过多防火墙会进行重复、赘余的检查,降低网络效率;
  • 取消数据中心区的设置:我们曾经错误的认为DMZ-WEB服务器的数据库应该放置在核心内网中隔离,但是实际上并不需要,如果那样部署反而会引起黑客入侵内网;
  • 优化了IPS的连接方式:由于DMZ区的web、邮件服务器均已经收到来自网络层的边界fw和来自网络层的WAF的保护,在其中再架设IPS就会增大IPS的负载,故IPS只用来保护核心内网的主机;

于此同时,我们对内网中每一个终端(虚拟终端)的IP地址进行了计划.

二、针对组网技术的调研

1. 使用云服务技术进行虚拟组网

​ 在前期调研中,我们提到使用Openstack、StarVcenter等工具,完成完整网络拓扑的构建(即使用云服务模拟网络架构的功能,模拟整个网络),该方案具有一定的可行性,如openstack提供了基于网络拓扑的配置的单独界面:

img

然而,Openstack具有如下的不可行性:

  • 所需要的硬件资源庞大,单独电脑无法承受其带来的负载,增添节点后,又会增加部署和环境的复杂度
  • 本身作为云服务部署在虚拟机上,在上面再进行云服务的嵌套,层数太多,消耗性能
  • 配置网络内容时,更多的使用web页面提供的集成功能,而不是手动进行web配置
  • 软件体系过大,导致更多的困难集中于对于拓扑的部署,而不是对于主题安全防护设备本身的思考

综合以上原因,虽然我们在上一周已经对云服务进行了初步的尝试和配置,最终选择放弃这一方案。

2. 使用拓扑软件的思路

​ eNSP是华为的一个网络模拟器,借助这个模拟器,可以模拟网络架构和建设,在其中,我们可以进行较为复杂的网络配置的工作,同时,由于ensp还支持虚拟机,也就是cloud的接入,可以在不搭建云服务的情况下实现较为完整的网络拓扑。

image-20230318164008869

eNSP的优点:

  • 其中的网络设备(如路由器)均可以使用等同于现实的命令行进行配置,帮助了解网络配置步骤:
image-20230318165056455
  • 可以配置较为复杂的网络拓扑,并通过cloud接入本地虚拟机

之所以不选择ensp的原因:

  • eNSP连入的本地虚拟机需要同时启动,没有能装得下那么多虚拟机的系统,如果只启动一部分虚拟机都不太方便
  • 单机配置环境,若多机配置,需要迁移虚拟机,面临网络配置、虚拟机版本问题,不利于团队协作

3. zerotier调研使用情况

​ zerotier是一个组网工具,支持windows、linux、freeBSD多种操作系统。在对应主机上安装软件后,可以为多个能够连接公网的物理\虚拟设备分配ip地址,进行虚拟组网,使他们在逻辑上处于一个虚拟局域网中,首先在注册后创建一个网络:

image-20230318172558600

​ 通过该网络独有的网络IP,即NETWORK ID加入网络:

image-20230318172746303

​ 如上所示,该虚拟局域网中有9台主机加入,并分别分配了IP,形成如下拓扑

image-20230318173058248

​ 其中,被圈中的三个节点为同一台主机,并按照ip分发网络拓扑配置。实现在192.168.0.0/16的大内网下,分别划分192.168.10.0/24和192.168.11.0/24两个子网,并通过被圈起的,也就是列表中的kali主机进行流量的转发工作(为了实验,暂时使用此系统)。

​ 然而,zerotier并没有实现内网的划分功能:

image-20230318173440005

​ 如图,指定LAN地址为192.168.0.0/16,zerotier所支持的,就是在词虚拟局域网LAN和其他网段之间构建路由,并添加via。如ip route add 192.168.0.0/24 via 192.168.1.2就表示,要进入192.168.0.0/24网段,需要经过入口主机也就是192.168.1.2主机。

​ 这一方式,实现网段划分的问题是,要进行网段逻辑上的分离需要创建多个zerotier网络,这和内网实际不是非常相似(企业的内网也应该是通过在大内网中划分小网段的方式实现的)。

​ 经过研究,我们提出了另一种划分子网的方式,即通过flow rules划分:

如下,可实现不同网段的隔离:

1
2
3
4
accept ipdest 192.168.10.0/24 and ipsrc 192.168.10.0/24;
accept ipdest 192.168.11.0/24 and ipsrc 192.168.11.0/24;

drop;

如下,可手动实现redirect,这一功能可将网络中指定ID号的主机设置为网关主机。

image-20230318174948459

通过flow rules配置,就可以满足内网划分子网模拟的需要。

三、针对网络内部主机(组件)的配置

​ 我们对网络中各个组件(也就是终端)进行了分模块的部署工作。

0.网络入口

pfSense入口FW

pfSense概况

​ pfSense是一款基于FreeBSD操作系统的免费开源防火墙和路由器软件。它提供了许多功能,例如虚拟专用网络(VPN)功能,负载平衡,网络地址转换(NAT),DHCP服务,域名系统(DNS)服务,以及其他网络安全和路由功能。通过官网教程,可在vm workstatio对该系统进行安装:

image-20230319143823012

​ 如上所示,pfsense系统需要wan、lan两个网段分别对应企业架构中的外网和内网,对应的,也需要添加两张网卡。在option中的1、2可以分别指定不同网段对应的网卡(也就是选择那张网卡对应lan、哪个对应wan)和某一网卡的IP配置情况(等同于linux的/etc/sysconfig/network-script目录下的配置)。而后,在Lan,也就是内网可访问到pfsense的webUI界面,或使用sshshell或本机shell对其进行操作:

image-20230319144214374

​ 如图,web界面中,每一个选项的功能如下:

  1. Interfaces:配置接口类型、IP地址、子网掩码、MTU(最大传输单元)等。
  2. Firewall:配置pfSense的防火墙规则,包括入站、出站和NAT规则
  3. Services:配置pfSense提供的服务,例如DHCP、DNS、NTP等。
  4. VPN:可以配置OpenVPN和IPsec等。
  5. Status:此页面提供了系统状态和事件日志的信息,包括接口状态、系统日志、DHCP租赁信息等,当出现错误时,可以在此处找到历史流量的记录。
  6. Diagnostics:此页面提供了一些诊断工具,例如ping、traceroute、nslookup等。用户可以使用这些工具来测试网络连接和解决故障。
nat策略

多种NAT技术:

  • 端口转发:将外部网络请求转发到内部网络的指定主机和端口,从而实现内部网络主机的对外服务。如,将外部网络对公共IP地址的80端口请求转发到内部网络的某个主机的8080端口;
  • 地址转换:NAT设备将内部网络的私有IP地址转换为外部网络的公共IP地址,从而实现内部网络主机的访问外部网络;
  • 端口映射:NAT设备将外部网络请求映射到内部网络的不同端口,从而实现内部网络主机的对外服务,但是映射后的端口与内部网络的原始端口不同。

端口映射&端口转发

​ 查了很多资料,最后得出的结论就是:端口映射和端口转发的区别在于数据包的源IP地址和端口是否被修改,修改了,则是端口转发;反之,则是映射。

​ 在端口映射中,数据包的源IP地址和端口不会被修改,内网主机接收到的数据包的源IP地址和端口与外部用户发送的数据包的源IP地址和端口相同。内网主机响应该请求时,将响应数据包发送回路由器或防火墙。路由器或防火墙会将目的IP地址和端口修改为外部用户的IP地址和端口,然后将响应数据包发送给外部用户。数据包只需要经过一次NAT转换。

​ 在端口转发中,外部用户向路由器或防火墙的公共IP地址和转发的端口发送数据包时,数据包的目的IP地址和端口会被修改为内网主机的IP地址和端口。内网主机接收到的数据包的源IP地址和端口与外部用户发送的数据包的源IP地址和端口不同,内网主机响应该请求时,将响应数据包发送回路由器或防火墙。路由器或防火墙会将源IP地址和端口修改为公共IP地址和转发的端口,然后将响应数据包发送给外部用户。因此,在端口转发中,数据包的目的IP地址和端口会被修改,数据包需要经过两次NAT转换。

​ 在端口映射中,由于映射的端口与内部网络的原始端口不同,因此在内部网络中的主机向外部网络发送响应数据包时,这些数据包需要经过路由器或防火墙的处理,并且源地址和端口需要正确地映射为公共IP地址和映射的端口,才能被正确返回。因此,在端口映射中需要回流规则来确保响应数据包能够正确返回。端口转发中,公共IP地址和端口直接映射到内部网络中的主机和端口,返回的数据包是直接从目标主机返回到客户端,没有经过路由器或防火墙的再次处理,因此不存在回流问题,不需要设置回流规则。

​ 最终实际使用的技术是端口映射

实际配置过程:

image-20230319173726373

配置端口映射策略,得到如下规则:

image-20230319173806702

将来自外网针对边界防火墙的8081端口的请求,映射到内网192.168.152.100主机的80端口。

过程中遇到的问题:

问题一:未关闭针对私有地址回流的屏蔽,两个内网网段无法通信。

image-20230318141013748

问题二:未启用NAT回流

image-20230319180720377

问题三:经过一系列正确配置后,未将pfsense防火墙主机设置为被保护主机的网关,被保护主机默认将数据包返回到vmware网关,故无法正确进行数据包的返回。

suricata

简介

Suricata是一个免费、开源、成熟、快速、健壮的网络威胁检测引擎。Suricata引擎能够进行实时入侵检测(IDS)、入侵防御系统(IPS)和离线pcap处理。Suricata使用强大而广泛的规则和签名语言来检查网络流量,并提供强大的Lua脚本支持来检测复杂的威胁。使用标准的输入和输出格式(如YAML和JSON),使用现有的SIEMs、Splunk、Logstash/Elasticsearch、Kibana和其他数据库等工具进行集成将变得非常简单。

  1. SIEMs(Security Information and Event Management):是一种集成了安全信息管理和安全事件管理的综合性安全系统,可以对安全事件进行实时监控、检测和响应,并提供事件管理、日志管理、威胁情报和风险评估等功能。常见的SIEM产品包括IBM QRadar、Splunk Enterprise Security、LogRhythm等。
  2. Splunk:是一种用于实时日志管理和分析的软件,可以从各种数据源中收集、存储和分析数据,并提供数据可视化、报告和警报等功能,可广泛应用于IT运维、安全事件响应等领域。
  3. Logstash/Elasticsearch:Logstash是一种数据采集和处理工具,可以将来自各种数据源的数据进行采集、处理和转换,最终将数据存储到Elasticsearch中。Elasticsearch是一种开源搜索引擎,用于存储、搜索和分析各种类型的数据。Logstash和Elasticsearch通常一起使用,形成一种日志管理和分析系统。
  4. Kibana:是一种开源数据可视化工具,与Elasticsearch紧密集成,可以对Elasticsearch中的数据进行实时查询和分析,并生成各种类型的数据可视化图表和报告。Kibana通常用于IT运维、日志分析和安全事件响应等领域。

注:生成自chatgpt

三种运行模式:

​ 网关模式:

image-20230319220442749

​ 主机模式:

img

​ 旁路模式:

image-20230319220531210
安装&配置
  • 系统:CentOS 7

我们在CentOS 上安装的是 Suricata 6.0

1
2
3
yum install epel-release yum-plugin-copr
yum copr enable @oisf/suricata-6.0
yum install suricata

安装后可以通过 suricata查看

image-20230319203424354

基本使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
目录:
/etc/suricata/ 存放suricata执行和配置文件的目录
/etc/suricata/rules 规则文件存放目录,自己之后写的也要放在这里
/var/log/suricata/ 存放suricata日志的目录
/var/lib/suricata/rules 更新的配置文件

//官方更新的rule规则,更新的配置文件存放在`/var/lib/suricata/rules`中,文件为classification.config和`suricata.rules`,需要`cp`至`/etc/suricata/rules`中才能加载成功,不然可能会有错误

文件:
suricata.yaml suricata的配置文件,重中之重,特别重要,位于/etc/suricata/下
suricata.rules 官方规则文件,存放在/etc/suricata/rules中
fast.log 警告日志文件,存放在/var/log/suricata/下,匹配的输出都在这里

启动 suricata -c /etc/suricata/suricata.yaml -i ens32
查看日志 vi /var/log/suricata/fast.log

简单测试:

这里,我们先对 /etc/suricata/suricata.yaml文件开头的HOME_NETEXTERNAL_NET进行设置

image-20230319203507239

然后,修改suricata.yaml中最后配置中的默认规则文件rule-files,将其修改为自己的test-rules文件,对了,这里记得将默认的路径修改为/etc/suricata/rules,这个路径下全部都是suricata的规则文件,我们自己写的test-rules也是放在这个文件路径下的。

image-20230319203530494

然后,编辑test-rules,加入百度触发规则alert http any any -> any any (msg:"hit baidu.com...";content:"baidu"; reference:url, www.baidu.com;)

image-20230319203607817使用ifconfig ens32 promiscens32网卡设置为混杂模式,接收网络中的数据包:

网卡的混杂模式(Promiscuous mode)是指网卡可以接收到所有经过它的网络流量,包括那些不是发送给它的数据包。通常情况下,网卡只会接收那些目标地址是它自己或者广播地址的数据包,而忽略其他的数据包,这样可以避免网络拥塞和减轻网卡的工作负担。但是,在某些情况下,需要使用网卡的混杂模式,例如网络分析、数据包捕获、入侵检测等。

image-20230319203636234如果这里显示CentOS上没有安装ifconfig,可以使用指令yum install net-tools.x86_64 -y进行安装

然后,执行suricata -c /etc/suricata/suricata.yaml -i ens32启动suricata,进行对ens32网卡的网络检测,

并且开启处于同一网段下的另一台CentOS主机192.168.215.136,通过curl http://www.baidu.com访问百度页面

然后,suricata主机执行 vi /var/log/suricata/fast.log查看日志信息,这里就可以看到另一主机访问百度的信息,

image-20230319203709319这表明,我们成功使用suricata192.168.215.0/24网段下的网络流量进行了监测行为。

1.DMZ区

bind DNS服务器

DNS-概况

Bind简介

BIND(Berkeley Internet Name Domain)作为一款目前市面是最主流的开源DNS软件,占据了市面上DNS服务器软件的九成,目前由 互联网系统协会 (Internet Systems Consortium) 负责开发和维护。目前,最新的稳定版BIND已经更新到了 BIND 9 版本。

本地部署环境:

​ Dns服务器:ubuntu20 bind9

​ Dns客户端:ubuntu20

DNS-企业为什么要搭建DNS服务器?

参考博客:https://www.bbsmax.com/A/Vx5MZoZ9dN/

​ DNS服务器的最主要功能用于提供对应服务器的FQDN(Fully qualified domain name),既然使用互联网上的DNS服务器就可以解析全球域名,为何还要自掏腰包搭建DNS服务器呢?有2点原因:

完全限定域名(英语:Fully qualified domain name),缩写为FQDN,又译为完全资格域名完整领域名称,又称为绝对领域名称(absolute domain name)、 绝对域名域名的一种,能指定其在域名系统 (DNS) 树状图下的一个确实位置。

完整域名由主机名称与母域名两部分所组成,例如有一部服务器的本地主机名为myhost,而其母域名为example.com,那指向该服务器的完整域名就是myhost.example.com。虽然世界上可能有很多服务器的本地主机名是myhost,但myhost.example.com是唯一的,因此完整域名能识别该特定服务器。

① 解析内网服务器域名
② 降低内网域名解析流量

image-20230319130003309

​ 在BUPT域名下,有很多域名,如jwgl.bupt.deu.cn是不提供给公网上的用户访问的,只提供内网用户人员进行访问,此时,这些域名未向相关机构进行注册,也就无法被互联网的DNS服务器解析。如上图所示校内ftp服务器的FQDN就是ftp.bupt.edu.cn,其他服务器类似。企业内部计算机访问ftp的时候就会被DNS解析成内网的IP(内网的IP都是私网IP,指望互联网上DNS是不可能解析出来的)。对于非内网的域名,比如www.baidu.com,内网DNS自己解析不出来就寻求互联网上的根DNS服务器,后面过程就是标准DNS递归解析流程了。

​ 与此同时,若企业内部没有DNS服务器,所有客户上网都是用互联网上的DNS服务器。以上百度为例,所有客户机都需要缓存一份到百度的域名解析记录。这无疑是很浪费资源的,同时企业中计算机较为庞大,每个人都有域名解析需求,必然会消耗企业到互联网之间宝贵的带宽。在企业内网引入一个DNS服务器,企业计算机的DNS都指向该内网DNS服务器,对于外网的域名,只需要内网DNS服务器解析缓存一次即可,内网计算机的域名解析流量被拦截在了内网。

​ 使用内网DNS服务器还有个好处,就是可以限制内网客户机上网。在公司内部,需要对一些一致的恶意域名和与办公无关的域名进行屏蔽,如在内网DNS上把淘宝的域名屏蔽掉,内网客户机就不能访问淘宝了。当然如果内网主机能够使用互联网上的DNS照样能够访问淘宝,但是,如果企业继续在内网到外网的出口路由器(防火墙)进行对于dns协议的屏蔽策略,在出口路由器那里设置只允许内网DNS服务器的ip地址通过dns协议访问Internet,就能实现对于内网域名解析的限制。

DNS-配置

​ 实验目的:服务器和客户端在同一网段(可互相ping通),通过手动配置dns客户端dns服务器地址。实现局域网内终端机dns正向解析、逆向解析和域名屏蔽。(说明:因为当前架构较小,没有考虑设置出于完备性的从属dns服务器作为备份)

配置文件

​ Bind需要配置的文件有这么几个

  • named.conf
    • 全局设置
      img

​ 一般的全局设置放在了named.conf.options中,这里的named.conf仅用作域名屏蔽。

  • named.conf.options

    • 全局设置选项(实际上效果和named.conf能够平替)
      img
  • named.conf.local

    • zones解析文件的引导文件
      img

上面每个域的解析文件分别如下

  • nyc3.example.com(正向解析表)
    img

  • 122.10.in-addr.arpa(逆向解析表)
    img

dns正向解析效果:

img

dns逆向解析效果:

img

域名屏蔽效果:

img

作为对比,访问淘宝网站时正常:

img

Nginx

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

http://nginx.org/en/linux_packages.html#mainline

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
To set up the apt repository for stable nginx packages, run the following command:

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \\
<http://nginx.org/packages/ubuntu> `lsb_release -cs` nginx" \\
| sudo tee /etc/apt/sources.list.d/nginx.list
If you would like to use mainline nginx packages, run the following command instead:

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \\
<http://nginx.org/packages/mainline/ubuntu> `lsb_release -cs` nginx" \\
| sudo tee /etc/apt/sources.list.d/nginx.list
Set up repository pinning to prefer our packages over distribution-provided ones:

echo -e "Package: *\\nPin: origin nginx.org\\nPin: release o=nginx\\nPin-Priority: 900\\n" \\
| sudo tee /etc/apt/preferences.d/99nginx
To install nginx, run the following commands:

sudo apt update
sudo apt install nginx

Modsecurity

Modsecurity安装

安装依赖

1
2
3
4
5
6
7
8
9
$ yum install -y wget epel-release gcc-c++ flex bison yajl yajl-devel curl-devel curl GeoIP-devel doxygen zlib-devel pcre-devel lmdb-devel libxml2-devel ssdeep-devel lua-devel libtool autoconf automake
$ wget <https://github.com/maxmind/libmaxminddb/releases/download/1.6.0/libmaxminddb-1.6.0.tar.gz>
$ tar -zxvf libmaxminddb-1.6.0.tar.gz
$ cd libmaxminddb-1.6.0
$ ./configure
$ make
$ make check
$ make install
$ ldconfig

安装 ModSecurity

1
2
3
4
5
6
7
$ git clone --depth 1 -b v3/master --single-branch <https://github.com/SpiderLabs/ModSecurity>
$ cd ModSecurity
$ git submodule init
$ git submodule update
$ ./build.sh
$ ./configure --with-maxmind=/usr/local
$ make && make install

出现 fatal: No names found, cannot describe anything. 报错忽略即可

如果连接不上 git 可以使用 代理服务

下载用于 ModSecuritynginx 连接器

1
$ git clone --depth 1 <https://github.com/SpiderLabs/ModSecurity-nginx.git>

确定当前 nginx 版本

1
2
$ nginx -v
nginx version: nginx/1.20.1

下载与安装版本对应的源代码

1
2
3
$ wget <http://nginx.org/download/nginx-1.20.1.tar.gz>
$ tar -zxvf nginx-1.20.1.tar.gz
$ cd nginx-1.20.1
Modsecurity动态编译

编译动态模块,复制到 nginx 模块标准目录

1
2
3
4
5
6
# 查看当前 nginx 编译参数
$ nginx -V
# 复制 nginx 所有参数,删除所有 --add-module 选项
$ ./configure --add-dynamic-module=../ModSecurity-nginx ...
$ make modules
$ cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules/

注意:这里的模块是放到了/etc/nginx/modules/目录下,但实操过程中,这样配置完无法运行nginx(报错是找不到目的文件)。

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

经分析,原始配置文件的模块加载默认地址似乎为/usr/share/nginx/modules/,所以实操时还执行了一句cp objs/ngx_http_modsecurity_module.so /usr/share/nginx/modules/,才得以成功运行,这个地方之后可能还要再修改。

加载模块:

1
2
vim /etc/nginx/nginx.conf
load_module modules/ngx_http_modsecurity_module.so;

修改 nginx 配置文件,在主配置文件 events 上加入一行,具体路径根据自己 nginx 模块路径来定

1
load_module modules/ngx_http_modsecurity_module.so;

重新加载配置: nginx -s reload

Modsecurity配置

1.创建一个mod配置文件夹:

1
/etc/nginx/modsec

2.给modsec文件夹添加配置文件,

1
2
3
4
5
wget
<https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended>
wget <https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/unicode.mapping>

mv modsecurity.conf-recommended modsecurity.conf

3.将modsecurity.conf中现有的SecRuleEngine修改为On:

1
2
# SecRuleEngine DetectionOnly
SecRuleEngine On

4.创建自定义规则,如下规则意为param参数若出现test字段,则deny,返回403.

vim /etc/nginx/modsec/main.conf

1
2
3
4
# Include the recommended configuration
Include /etc/nginx/modsec/modsecurity.conf
# A test rule
SecRule ARGS:param "@contains test" "id:1234,deny,log,status:403"

5.在nginx的conf中添加刚才的配置来启用modsec

1
2
3
4
5
6
7
8
9
10
11
vim /etc/nginx/conf.d/proxy.conf
server {
listen 80;
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
location / {
proxy_pass <http://localhost:8085>;
proxy_set_header Host $host;
}
}
[root@centos24-4 modsec]# nginx -s reload

通过发出在查询字符串param参数的值中包含字符串test的请求,验证步骤4中配置的规则是否正常工作,出现403证明触发了相应的规则,进一步可以在log里看到触发的是我们自定义的规则。

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

Nginx反向代理配置

在Ubuntu-WebServer(192.168.254.133)上运行nginx服务:

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

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

在Centos7-WAF(192.168.254.133)上运行开启了ModSecurity动态模块的Nginx服务,配置该Nginx服务,使其反向代理Ubuntu-WebServer(192.168.254.133)的Nginx服务:

1
2
3
4
5
6
7
8
9
10
11
vim /etc/nginx/conf.d/proxy.conf
server {
listen 80;
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
location / {
proxy_pass <http://192.168.254.133/>;
proxy_set_header Host $host;
}
}
[root@centos24-4 modsec]# nginx -s reload

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

其中modsecurity on; 开启了ModSecurity模块,

modsecurity_rules_file /etc/nginx/modsec/main.conf; 指定了ModSecurity规则。

重启服务systemctl restart nginx

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

ModSecurity引用OWASP CRS 规则

OWASP CRS (OWASP ModSecurity Core Rule Set) 是一个开源的 Web 应用程序防火墙 (WAF) 规则集,它是基于 ModSecurity 开发的。

github 地址

1
2
3
4
5
$ cd /etc/nginx/modsec
$ wget -O coreruleset-3.3.4.tar.gz <https://codeload.github.com/coreruleset/coreruleset/tar.gz/refs/tags/v3.3.4>
$ tar -zxvf coreruleset-3.3.4.tar.gz
$ cd coreruleset-3.3.4
$ cp crs-setup.conf.example crs-setup.conf

modsec/main.conf 配置文件里引入 CRS 配置和规则

1
2
3
4
$ vim /etc/nginx/modsec/main.conf
include coreruleset-3.3.4/crs-setup.conf
include coreruleset-3.3.4/rules/*.cnf
$ curl -H "User-Agent: Nikto" <http://localhost>

验证部分规则,如访问限制:访问http://192.168.254.128/nginx.conf,

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

参数过滤:http://192.168.254.128/?param=/etc/passwd(敏感目录参数)

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

配置路由限制其他ip访问WebServer

使用iptables,使得除了WAF服务器外的ip地址都无法访问WebServer。

1
2
3
4
5
6
7
8
#先关闭所有的对本机80端口的访问
iptables -I INPUT -p tcp --dport 80 -j DROP

#只开放192.168.254.133 对本机80端口的访问
iptables -I INPUT -s 192.168.254.133 -p tcp --dport 80 -j ACCEPT

#开启ip段192.168.1.0/24端的80口
iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT

无法访问web服务器:

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

只能访问代理服务器:

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

注意事项

1、If any other virtual servers (server blocks) in your NGINX configuration listen on port 80, you need to disable them for the reverse proxy to work correctly. For example, the /etc/nginx/conf.d/default.conf file provided in the nginx package includes such a server block. Comment out or remove the server block, but do not remove or rename the default.conf file itself – if the file is missing during an upgrade, it is automatically restored, which can break the reverse-proxy configuration.

如果原来nginx有默认在80端口的服务,要把它移除,否则会影响代理服务器的运行。但是不要删去那个配置文件。

默认的主页在:/usr/share/nginx/html

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

原有默认配置在:/etc/nginx/nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

error_page 404 /404.html;
location = /404.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

把这个server删掉即可。

2、配置路径问题

配置过程中存在很多路径,不同教程的配置路径都不同,需要先规划好各模块存放的路径,包括编译时的路径,ModSecurity规则的路径,模块的路径等。如模块路径问题:

注意:这里的模块是放到了/etc/nginx/modules/目录下,但实操过程中,这样配置完无法运行nginx(报错是找不到目的文件)。

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

经分析,原始配置文件的模块加载默认地址似乎为/usr/share/nginx/modules/,还执行了一句cp objs/ngx_http_modsecurity_module.so /usr/share/nginx/modules/

配置文件位置整理
1
2
3
4
5
6
ModSecurity源代码位置:/opt/ModSecurity
模块源代码存放位置:/opt/ModSecurity/nginx-1.20.1

编译后模块文件存放位置:/etc/nginx/modules/
ModSecurity规则文件:/etc/nginx/modsec/main.conf
Nginx代理配置文件:/etc/nginx/conf.d/proxy.conf

postfix邮件服务器简单搭建

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

2.云服务区-Kubernetes

简介

​ Kubernetes(简称K8s)是一个开源的容器编排平台,提供了容器集群的调度、部署、扩缩、服务发现和负载均衡等功能,可以帮助企业更高效地管理和运维容器化应用程序。Kubernetes可以支持多种容器运行时,其中包括Docker、containerd、CRI-O等。在Kubernetes中,Docker作为一个容器运行时(Container Runtime),被集成在Kubernetes的容器引擎中,用于管理和运行容器镜像。Kubernetes不是基于Docker构建的,但是Kubernetes可以使用Docker镜像,并集成了Docker作为其中一个容器运行时的实现。

image-20230319212643244
  • API Server是整个系统的对外接口,供客户端和其它组件调用;

  • Scheduler负责对集群内部的资源进行调度;

  • Controller manager负责管理控制器;

image-20230319214510993

​ API server是所有请求的唯一入口,Pod是Kubernetes最基本的操作、部署单元,其作为一组容器的结合,在通pod中的容器共享网络命名空间。一个Pod代表着集群中运行的一个进程,它内部封装了一个或多个紧密相关的容器。除了Pod之外,K8S还有一个Service的概念,一个Service可以看作一组提供相同服务的Pod的对外访问接口。每一个node中有Kubelet、Kube-proxy等为该node提供服务。

​ Kubelet,主要负责监视指派到它所在Node上的Pod,包括创建、修改、监控、删除等。

​ Kube-proxy,主要负责为Pod对象提供代理。

环境搭建

• 参考动力节点教程学习k8s,搭建master和node节点

image-20230319210554865

漏洞设立

​ 攻击思路:创建以ubuntu为基础镜像的容器,在其中部署Nginx与存在web漏洞的网站,通过web获取对于云主机的接入权限后,使用操作系统的漏洞用来提权,然后触发容器逃逸漏洞逃逸到企业内网。如下,对于容器逃逸漏洞进行了复现的尝试工作。

image-20230319215001729

Kubernetes 通过多层安全措施来增强容器的安全性,但也不能完全防止容器逃逸漏洞:

  1. 安全上下文:Kubernetes 通过安全上下文为容器内的进程提供了隔离和限制权限的功能。安全上下文定义了容器内进程的用户、组、访问控制和特权等级,从而限制了进程的访问权限。
  2. 安全性设置:Kubernetes 提供了一些安全性设置,如限制容器的 CPU、内存、网络和文件系统等资源的使用量,限制容器能够访问的主机系统的资源等。
  3. 网络隔离:Kubernetes 使用网络隔离来防止容器之间的攻击。每个容器都有一个唯一的 IP 地址,并且可以使用网络策略来限制容器之间的通信。
  4. 权限控制:Kubernetes 提供了丰富的权限控制机制,可以对不同的用户或角色进行访问控制。例如,可以使用 Role-based access control(RBAC)来限制用户对 Kubernetes 资源的访问权限。

3.办公区

windows域

内网web服务

使用apache部署简单的web服务和数据库。

IDS

可使用suricata的对应模式。