本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关.
一个由 glaslos 等人开发的,用于获得关于工控系统的威胁情报的开源 ICS/SCADA 蜜罐
项目地址
搭建过程
docker pull honeynet/conpot
docker run -it -p 80:8800 -p 102:10201 -p 502:5020 -p 161:16100/udp --network=bridge honeynet/conpot
访问 http://IP
相关文章
HFish 是一款基于 Golang 开发的跨平台多功能主动诱导型开源蜜罐框架系统,为了企业安全防护做出了精心的打造,全程记录黑客攻击手段,实现防护自主化。
项目地址
搭建过程
docker pull imdevops/hfish
docker run -d --name hfish -p 21:21 -p 22:22 -p 23:23 -p 69:69 -p 3306:3306 -p 5900:5900 -p 6379:6379 -p 8080:8080 -p 8081:8081 -p 8989:8989 -p 9000:9000 -p 9001:9001 -p 9200:9200 -p 11211:11211 --restart=always imdevops/hfish:latest
- 环境变量API_IP的值为 API 的 IP 地址加端口组成。
- 默认帐号密码均为:admin,如需修改可以通过加入-e USERNAME= -e PASSWORD= 传入环境变量进行修改。
- 如需做数据持久化存储,可加参数 -v $PWD:/opt 挂载数据卷到宿主机上,避免容器删除数据丢失。
官网
简介
Snort 是开源的基于误用检测的网络入侵检测系统,采用规则匹配机制检测网络分组是否违反了事先配置的安全策略。安装在一台主机上就可以监测整个共享网段,一旦发现入侵和探测行为,具有将报警信息发送到系统日志、报警文件或控制台屏幕等多种实时报警方式。Snort 不仅能够检测各种网络攻击,还具有网络分组采集、分析和日志记录功能。相对于昂贵与庞大的商用产品而言,Snort 具有系统规模小、容易安装、容易配置、规则灵活和插件(plug-in)扩展等诸多优点。
组成
Snort 主要由分组协议分析器、入侵检测引擎、日志记录和报警模块组成。协议分析器的任务就是对协议栈上的分组进行协议解析,以便提交给入侵检测引擎进行规则匹配。入侵检测引擎根据规则文件匹配分组特征,当分组特征满足检测规则时,触发指定的响应操作。日志记录将解析后的分组以文本或 Tcpdump 二进制格式记录到日志文件,文本格式便于分组分析,二进制格式提高记录速度。报警信息可以发送到系统日志;也可以采用文本或 Tcpdump 二进制格式发送到报警文件;也容许选择关闭报警操作。记录到报警文件的报警信息有完全和快速两种方式,完全报警记录分组首部所有字段信息和报警信息,而快速报警只记录分组首部部分字段信息。
安装
-
rpm 包安装
这里以 2.9.16-1 为例,最新版访问官网了解 https://www.snort.org
yum install -y https://www.snort.org/downloads/snort/snort-2.9.16-1.centos7.x86_64.rpm
注;如果下载失败,有可能是官方更新了,每次snort更新原来的包地址就访问不了,去官网看下更新下载地址即可。
安装 snort 的时候可能会报错 :
缺少 libnghttp2.so.14()(64bit)
yum install -y epel-release -y yum install -y nghttp2
测试:
snort
,如果没有报错则安装成功.如果报错
snort: error while loading shared libraries: libdnet.1: cannot open shared object file: No such file or directory
wget http://prdownloads.sourceforge.net/libdnet/libdnet-1.11.tar.gz tar -xzvf libdnet-1.11.tar.gz cd libdnet-1.11 ./configure make && make install
-
Centos 下源代码编译安装
安装依赖
yum install -y gcc flex bison zlib zlib-devel libpcap libpcap-devel pcre pcre-devel libdnet libdnet-devel tcpdump openssl openssl-devel
下载 snort
wget https://www.snort.org/downloads/snort/daq-2.0.6.tar.gz wget https://www.snort.org/downloads/snort/snort-2.9.15.tar.gz
tar xvzf daq-2.0.6.tar.gz cd daq-2.0.6 ./configure && make && make install cd ../
wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz tar xvzf LuaJIT-2.0.5.tar.gz cd LuaJIT-2.0.5 make install
tar xvzf snort-2.9.15.tar.gz cd snort-2.9.15 ./configure --enable-sourcefire && make && make install
测试:
snort
,如果没有报错则安装成功. -
Ubuntu 下源代码编译安装
apt update apt install -y build-essential libpcap-dev libpcre3-dev libdumbnet-dev bison flex zlib1g-dev liblzma-dev openssl libssl-dev libnghttp2-dev autoconf libtool mkdir ~/snort_src cd ~/snort_src wget https://snort.org/downloads/snort/daq-2.0.7.tar.gz tar -xvzf daq-2.0.7.tar.gz cd daq-2.0.7 ./configure autoreconf -vfi make make install cd ~/snort_src wget https://snort.org/downloads/snort/snort-2.9.16.tar.gz tar -xvzf snort-2.9.16.tar.gz cd snort-2.9.16 ./configure --disable-open-appid make make install ldconfig ln -s /usr/local/bin/snort /usr/sbin/snort
测试:
snort
,如果没有报错则安装成功.
注 : 如果安装中还是遇到报错的问题可以参考 https://blog.csdn.net/rdgfdd/article/details/83420811
配置
在使用 snort 之前,需要根据保护网络环境和安全策略对 snort 进行配置,主要包括网络变量、预处理器、输出插件及规则集的配置,位于 etc 的 snort 配置文件 snort.conf 可用任意文本编辑器打开。除内部网络环境变量 HOME_NET 之外,在大多数情况下,可以使用 snort.conf 的默认配置。
由于我们不想使用 root 权限来运行 snort,所以需要创建相关用户。同时也需要建立工作目录。
# Create the snort user and group:
groupadd snort
useradd snort -r -s /sbin/nologin -c SNORT_IDS -g snort
# Create the Snort directories:
mkdir /etc/snort
mkdir /etc/snort/rules
mkdir /etc/snort/rules/iplists
mkdir /etc/snort/preproc_rules
mkdir /usr/local/lib/snort_dynamicrules
mkdir /etc/snort/so_rules
# Create some files that stores rules and ip lists
touch /etc/snort/rules/iplists/black_list.rules
touch /etc/snort/rules/iplists/white_list.rules
touch /etc/snort/rules/local.rules
touch /etc/snort/sid-msg.map
# Create our logging directories:
mkdir /var/log/snort
mkdir /var/log/snort/archived_logs
# Adjust permissions:
chmod -R 5775 /etc/snort
chmod -R 5775 /var/log/snort
chmod -R 5775 /var/log/snort/archived_logs
chmod -R 5775 /etc/snort/so_rules
chmod -R 5775 /usr/local/lib/snort_dynamicrules
# Change Ownership on folders:
chown -R snort:snort /etc/snort
chown -R snort:snort /var/log/snort
chown -R snort:snort /usr/local/lib/snort_dynamicrules
移动配置文件
cd ~/snort_src/snort-2.9.16/etc/
cp *.conf* /etc/snort
cp *.map /etc/snort
cp *.dtd /etc/snort
cd ~/snort_src/snort-2.9.16/src/dynamic-preprocessors/build/usr/local/lib/snort_dynamicpreprocessor/
cp * /usr/local/lib/snort_dynamicpreprocessor/
sed -i "s/include \$RULE\_PATH/#include \$RULE\_PATH/" /etc/snort/snort.conf
修改配置文件,将 HOME_NET 更改为自己电脑所在的 CIDR 地址
vim /etc/snort/snort.conf
ipvar HOME_NET 10.0.0.0/24
...104
var RULE_PATH /etc/snort/rules
var SO_RULE_PATH /etc/snort/so_rules
var PREPROC_RULE_PATH /etc/snort/preproc_rules
var WHITE_LIST_PATH /etc/snort/rules/iplists
var BLACK_LIST_PATH /etc/snort/rules/iplists
...564
include $RULE_PATH/local.rules
测试使用
vim /etc/snort/rules/local.rules
alert icmp any any -> $HOME_NET any (msg:"ICMP test detected"; GID:1; sid:10000001; rev:001; classtype:icmp-event;)
/usr/local/bin/snort -A console -q -u snort -g snort -c /etc/snort/snort.conf -i eth0
启动,此时用其他机器 Ping Snort 主机可以看到日志信息
也可以直接读取 pcap 包
/usr/local/bin/snort -c /etc/snort/snort.con -r foo.pcap
注意:snort 只能识别 pcap 后缀的包文件,用 wireshark 的 pcapng 后缀会报错 需要再另存为一下 修改文件格式 不是直接改后缀
规则下载
Snort 官方提供的三类规则
- Community rules : 无需注册 or 购买,可直接下载使用
- Registered rules : 需要注册才可以下载
- Subscriber rules : 需要注册花钱购买
访问官网 https://www.snort.org/ 下载规则
下载完,解压至相应目录
cd /etc/snort/rules/
wget https://www.snort.org/downloads/community/community-rules.tar.gz -O community-rules.tar.gz
tar -xvf community-rules.tar.gz
mv /etc/snort/rules/community-rules/community.rules /etc/snort/rules/
vim /etc/snort/snort.conf
include $RULE_PATH/community.rules
其他 Snort 规则
PLC inject
alert tcp any any -> $any 502 (msg:”plcinject”; content:”|d0 9d 00 00 00 06 01 03 00 80 00 01|”; sid:001111111; GID:001; priority:0;)
相关文章
官网
项目地址
简介
Suricata 是由 OISF(开发信息安全基金会)开发,它也是基于签名,但是集成了创新的技术。该引擎嵌入了一个 HTTP 规范化器和分析器(HTP 库),可提供非常先进的 HTTP 流处理,从而能够在 OSI 模型的第七层(应用层)上解析流量。
Suircata 是一款支持 IDS 和 IPS 的多线程入侵检测系统,与传统 Snort 相比,Suircata 的多线程和模块化设计上使其在效率和性能上超过了原有 Snort,它将 CPU 密集型的深度包检测工作并行地分配给多个并发任务来完成。这样的并行检测可以充分利用多核硬件的优势来提升入侵检测系统的吞吐量,在数据包的深度检测上效果优越。并且 Suircata 可以兼容现有的 Snort 规则签名,还增加了对 ipv6 的支持,已经逐渐成为传统 Snort 入侵检测系统的代替方案。
架构
Suricata 有三种运行模式,分别为 single,workers,autofp。官方推荐性能最佳的运行模式为 workers 模式。
- single 模式:只有一个包处理线程,一般在开发模式下使用。
- workers 模式:多个包处理线程,每个线程包含完整的处理逻辑。
- autofp 模式:有多个包捕获线程,多个包处理线程。一般适用于 nfqueue 场景,从多个 queue 中消费流量来处理。
报文检测系统通常包含四大部分,报文获取、报文解码、报文检测、日志记录;Suricata 不同的功能安装模块划分,一个模块的输出是另一个模块的输入。
安装
- Ubuntu 下安装
add-apt-repository ppa:oisf/suricata-stable apt update apt install -y suricata jq apt install -y suricata-update
使用
suricata-update # 更新规则
suricata -T # 测试运行
suricata -i ens33 -c /etc/suricata/suricata.yaml -vvv # 启动运行
# 注: 这里 -vvv 参数建议加上. 如果你的Lua脚本有一些问题, 如果加上了这个参数, 就可以通过 suricata.log 日志看出。
suricata -r <path> -c /etc/suricata/suricata.yaml -vvv # 在PCAP脱机模式(重放模式)下运行,从PCAP文件读取文件。如果<path>指定了一个目录,则该目录中的所有文件将按修改时间的顺序进行处理,以保持文件之间的流状态。
配置文件
/etc/suricata/
目录下有 4 个配置文件和一个文件夹, 作用分别是:
- classification.config : 定义了各种流量攻击类型和优先级,类似拒绝服务攻击和 web 应用攻击等
- reference.config : 记录一些安全网站,漏洞平台的网址,或者是自己可以自定义的 url,是参考的意思,用来联系外部的恶意攻击检测网站中关于此类攻击的页面。
- suricata.yaml : Suricata 默认的配置文件,以硬编码的形式写在源代码中, 里面定义了几乎关于 Suricata 的所有运行内容,包括运行模式、抓包的数量和大小、签名和规则的属性和日志告警输出等等。
- 先设置
HOME_NET
与EXTERNAL_NET
,推荐HOME_NET
填写内网网段,EXTERNAL_NET
设置为any
- 如果
HOME_NET
设置了any
,EXTERNAL_NET
设置!$HOME_NET
的话会报错,如果HOME_NET
设置了内网地址,EXTERNAL_NET
设置为!$HOME_NET
的话,有些内网之间的告警就无法匹配到
- 先设置
- threshold.config : threshold(阈值)关键字可用于控制规则的警报频率,可用于在规则生成警报之前为其设置最小阈值.
- rules : 规则目录, 存放不同种类的规则,规则用来判定流量攻击类型,并定义攻击类型和告警种类,可以存放自带的规则,也可以自己按规则语法编写
规则详解
suricata 完全兼容 snort 规则
alert modbus any any -> any any (msg:"SURICATA Modbus Request flood detected"; flow:to_server;app-layer-event:modbus.flooded; classtype:protocol-command-decode; sid:2250009; rev:2;)
- alert: 默认顺序为:pass,drop,reject,alert,跳过、丢弃、拒绝、警告四种类型的动作
- Modbus: 注明协议种类,UDP/ICMP 等
- Any: 源地址 / 目的地址(IP)
- Any: 源端口 / 目的端口
- ->: 方向,单向流量;<> 双向流量
- Any: 源地址 / 目的地址(IP)
- Any: 源端口 / 目的端口
- msg:”SURICATA Modbus Request flood detected”: 关键字 msg 提供对触发警报的有关签名 / 规则相关文本提示信息
- flow:to_server: 客户端到服务器
- app-layer-event:modbus.flooded: 具体攻击内容
- classtype:protocol-command-decode: 提供有关规则和警报分类的信息,由 classification.config 文件定义。
- sid:2250009: 用于唯一性规则标识,sid 不能重复
- rev:2: 规则版本号,每次修改规则 rev 则递增 1
以下内容来自文章 [Suricata IDS 入门 — 规则详解]
完整规则
alert tcp $EXTERNAL_NET $FILE_DATA_PORTS -> $HOME_NET any (msg:"INDICATOR-SHELLCODE heapspray characters detected - ASCII "; flow:to_client,established; file_data; content:"0d0d0d0d"; fast_pattern:only; metadata:service ftp-data, service http,service imap, service pop3; reference:url,sf-freedom.blogspot.com/2006/07/heap-spraying-internet-exploiter.html; classty pe:attempted-user; sid:33339; rev:1;)
alert tcp $EXTERNAL_NET $FILE_DATA_PORTS -> $HOME_NET any
规则行为 协议 源 ip 源端口 流量方向 目标 ip 目标端口 红色代表规则头
- 规则行为,根据优先级排列:
pass
如果匹配到规则后,suricata 会停止扫描数据包,并跳到所有规则的末尾drop
ips 模式使用,如果匹配到之后则立即阻断数据包不会发送任何信息reject
对数据包主动拒绝,接受者与发送中都会收到一个拒绝包alert
记录所有匹配的规则并记录与匹配规则相关的数据包
- 协议:在规则中指定匹配那些协议,suricata 支持的协议要比 snort 多一些
- TCP、UDP、ICMP、IP(同时用与 TCP 与 UDP)、http、ftp、smb、dns
- 源 ip,目标 ip:
- 支持单个 ip,cidr,ip 组,[96.30.87.36,96.32.45.57],所有主机 any,以及规则文件中配置的 ip 变量
$HOME_NET
(受保护的 ip 段)与$EXTERNAL_NET
(其他所有 ip):
- 支持单个 ip,cidr,ip 组,[96.30.87.36,96.32.45.57],所有主机 any,以及规则文件中配置的 ip 变量
- 源端口 / 目标端口:
- 支持设置单个端口 80,端口组 [80,8080], 端口范围[1024:65535] 以及 any 任意端口, 还可以在配置文件中添加端口组,通过
!
号来进行排除
- 支持设置单个端口 80,端口组 [80,8080], 端口范围[1024:65535] 以及 any 任意端口, 还可以在配置文件中添加端口组,通过
- 流量方向:
->
单向流量,从源 ip 到目标 ip 的单项流量<>
双向流量,2 个 ip 往返之间的流量
- 规则行为,根据优先级排列:
- 规则体 :
(msg:"INDICATOR-SHELLCODE heapspray characters detected - ASCII"; flow:to_client,established; file_data; content:"0d0d0d0d"; fast_pattern:only; metadata:service ftp-data, service http,service imap, service pop3; reference:url,sf-freedom.blogspot.com/2006/07/heap-spraying-internet-exploiter.html; classtype:attempted-user; sid:33339; rev:1;)
- MSG:规则名称,规则中的第一个字段
- ids 告警上显示的信息,INDICATOR-SHELLCODE heapspray characters detected - ASCII
- 源 ip、目标 ip 检测:
- sameip 会将流量中源 ip 和目标 ip 相同的显示出来
alert ip any any -> any any (msg:"GPL SCAN same SRC/DST"; sameip; reference:bugtraq,2666; reference:cve,1999-0016; reference:url,www.cert.org/advisories/CA-1997-28.html; classtype:bad-unknown; sid:2100527; rev:9; metadata:created_at 2010_09_23, updated_at 2010_09_23;)
- flow 流匹配:
- flow 是特定时间内具有相同数据的数据包(5 元组信息)同属于一个流,suricata 会将这些流量保存在内存中。
- flowbits set , name 设置条件
- flowbits isset, name 选择条件
- 一旦设置 flowbits 之后,第一条规则没有命中那么第二条规则即使命中了也不会显示出来,例如一些攻击行为的响应信息,现在请求中设置条件,然后在响应中选择条件
- to_client/from_server 服务器到客户端
- to_server/from_client 客户端到服务器
- established 匹配已经建立连接的(tcp 则是经过 3 次握手之后,udp 则是有双向流量)
- no_established 匹配不属于建立连接的
- only_stream 匹配由流引擎重新组装的数据包
- no_stream 不匹配流引擎重新组装的数据包
- 阀值 threshold:
- threshold:
type <threshold|limit|both>, track <by_src|by_dst>, count <N>, seconds <T>
- threshold 最小阀值 也就是说只有匹配到至少多少次数才进行告警
- limit 限制告警次数,例如最少 5 分钟内告警一次
- 调节阀值主要是通过 2 种方法,一种是通过规则内的 threshold 关键字来调节,下图中类型是 limit 也就是限制告警次数,track by_s rc 代表来源 ip,seconds 60 每个 60 秒告警一次 count 1
- 另外一种则是通过配置文件 /etc/suricata/threshold.config 来进行控制,更加推荐这种方法,写在规则内部每次更新后都会替换掉。
event_filter gen_id 1(组 id), sig_id 1101111(规则 id), type limit ,track by_src, count 1 , seconds 60
- suppress 则是告警排除,排除指定 ip 产生的规则告警
- threshold:
- 内容匹配 content:检测数据包中是否存在此内容,例如检测流量中是否存在 0d0d0d0d
- 如果有多个匹配项可以使用
content:"evilliveshere"; content:"here";
这种写法,注意如果没有用内容修饰的话,ids 不会按照先后顺序去匹配的,只会在内容中匹配是否包含这 2 个值,必须用内容修饰来调整先后顺序,用 distance 0 来让第二个匹配项在第一个匹配项匹配位置之后匹配,并且如果有多个 content 他们的关系是 and 关系必须都匹配到才告警 。 - 使用感叹号
!
对匹配项的否定:content:!"evilliveshere"
; - 将字符串的十六进制用管道符(|)进行包围:content:"|FF D8|"; 字符串与十六进制混合使用:content:"FF |SMB|25 05 00 00 80";
- 匹配内容区分大小写,保留字符(; \ "|)须进行转义或十六进制转码
- 内容修饰,能够更加精准匹配
- 不区分大小写 nocase:
- content:"root";nocase; 修饰符直接在;号后面添加
- 偏移位置 offset:
- content:"xss";offset 100; 代表了从数据包开始位置 0 往后偏移 100 位字节后进行匹配
- 结束位置 depth:
- content:"xss";offset 100;depth 200; 代表了匹配数据包结束的位置,如果没有 offset 则是从开始位置计算,有 offset 则是从 offset 开始,此次则是从 100 字节开始匹配到 200 字节内的内容。
- 在 xx 范围外 distance :
- 本次匹配必须在上一次匹配结束位置到 distance 设置的偏移位置区间之外,例如 content:"msg1";content:"msg2";distance 25; 如果 msg1 在第 100 行找到,那么就会在 100+25 后匹配 msg2
- 在 xx 范围内 within:
- 本次匹配必须在上一次匹配结束位置之内,如果上次结束是 100,within 15;那么第二次匹配必须在 100 到 115 之内开始匹配, 如果 within 与 distance 同时出现 content:"evilliveshere"; content:"here"; distance:1;within:7; 则匹配 here 在 evilliveshere 位置结束 1-7 内匹配
- Payload 大小 dsize:
- dsize: >64 用来匹配 payload 大小,可以用来检测异常包大小
- pcre 正则 pcre:
- content:"xss"; pcre:"xss\w" 先匹配 content 内容后才进行匹配 pcre 正则,这样的话减少系统开销
- http 修饰符:
- 更多详细内容查看:http://suricata.readthedocs.io/en/suricata-4.0.4/rules/http-keywords.html
alert tcp any any -> any 80(msg:"Evil Doamin www.appliednsm.com"; "content:"GET";httpmethod; content:"www.appliednsm.com";http_uri; sid:5445555; rev:1;)
- http_client_body HTTP 客户端请求的主体内容
- http_cookie HTTP 头字段的 “Cookie” 内容
- http_header HTTP 请求或响应头的任何内容
- http_method 客户端使用的 HTTP 方法(GET,POST 等)
- http_uri HTTP 客户端请求的 URI 内容
- http_stat_code 服务器响应的 HTTP 状态字段内容
- http_stat_message 服务器响应的 HTTP 状态消息内容
- http_encode 在 HTTP 传输过程中所使用的编码类型
- url_len url 长度
- 快速匹配模式:
- fast_pattern; 如果 suricata 规则中有多个匹配项目,快速匹配的目的是设置优先级最高的匹配项,如果设置了快速匹配模式没有命中则跳过这条规则
- 如果有多个匹配项可以使用
- 元数据 Metadata:
- suricata 会忽略元数据背后的语句,用于添加备注
- 组 gid:
- [1:2000000] 告警前面的 1 代表组 id
- 优先级 priority:
- 手动设置规则优先级别,范围 1-255,1 最高,一般都是 1-4,suricata 会首先检查优先级较高的规则
- 引用 reference:
- 连接外部信息来源,补充描述,reference:url,sf-freedom.blogspot.com/2006/07/heap-spraying-internet-exploiter.html
- 类别 classtype:
- 根据规则检测到的活动类型为规则分类,classtype:attempted-user
- 特征标示符 sid:
- 用于唯一性规则标识,sid 不能重复,0-10000000 VRT 保留,20000000-29999999 Emerging 保留,30000000+:公用
- 修订 rev:
- 规则版本号,每次修改规则 rev 则递增 1
- MSG:规则名称,规则中的第一个字段
规则修改
suricata 主要是 et/open 规则,这是系统自带的规则,目前开源免费的就是 et/open、pt 规则、sslbl 规则,其余的需要授权码才能更新
suricata-update list-sources # 列出当前的规则源
suricata-update update-sources # 更新规则源
suricata-update # 更新规则
suricata-update enable-source ptresearch/attackdetection # 启用ptresearch/attackdetection的规则集
suricata-update disable-source et/pro # 关闭某个规则源
suricata-update remove-source et/pro # 删除某个规则源
例如要禁用某一个规则,直接新建 /etc/suricata/disable.conf
文件,然后在里面填入 sid,正则表达式,规则组名, 配置好 disable.conf
后,使用如下命令更新规则:
suricata-update --disable-conf /etc/suricata/disable.conf
使用 Suricata-update 更新规则时,默认是将所有规则合并在一个规则文件中:/var/lib/suricata/rules/suricata.rules
,Suricata-update 有个 --no-merge 参数,使用这个参数更新规则,规则不会进行合并,是以独立的文件存在于文件夹下。但是在管理规则的时候很不方便,必须要自己管理 Suricata 引入的规则。
指定一个文件让 suricata-update 合并输出会更简单。在 suricata.yaml 中修改 default-rule-path 和 rule-files。
相关文章