前言
通常厂商威胁捕捉与诱骗系统内置的蜜罐的特征,都在各红队挂上号了。哈希时代下的蜜罐隐藏,只能开发自定义蜜罐以规避哈希识别。
对于一个正常服务,通常情况下不会使用ip+端口,或域名+端口的形式提供服务。一个长期使用的外部应用服务通常使用子域名,以及ssl加密,即https传输。然而,正常服务也可以收集登录正确与失败的账号密码。
本文内容基于微步HFish胁捕捉与诱骗系统。
蜜罐于HFish后台启用后,使用三级域名以及反向代理nginx伪装为正常服务。
单个域名申请证书
使用certbot申请证书
Let's Encrypt是一个数字证书认证机构,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为安全网站提供免费的SSL/TLS证书。
前置步骤:
于/etc/nginx/conf.d/文件夹下,将以下内容写入文件,命名为*.conf(建议为命名为hfish.conf,星号内容可自定义)
server {
listen 80;
listen [::]:80;
server_name sub.domain.com; #将sub.domain.com替换为需要申请证书的域名
#反向代理 / 用于let's encrypto验证域名归属
location ^~ /.well-known/acme-challenge/{
default_type "text/plain";
root /;
}
}
文件写入后运行命令
nginx -t && systemctl restart nginx
安装certbot
# ubuntu系统
apt install certbot
# centos系统
yum install certbot
完成域名验证并生成证书
certbot certonly --webroot sub.domain.com #将sub.domain.com替换为需要申请证书的域名
运行该命令后根据提示输入验证文件地址。根据配置,验证地址为root /; ,即此处输入‘/’即可。
生成证书与密钥默认存放于/etc/letsencrypt/live/domain.com/文件夹下,此时将/etc/nginx/conf.d/文件夹下(建议为命名为hfish.conf)配置文件替换为完整的配置文件并运行以下命令即可。
nginx -t && systemctl restart nginx
完整配置文件:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name sub.domain.com; #需要将sub.domain.com替换为您所使用的子域名。
ssl_certificate /etc/nginx/cert/sub.domain.com.pem; #您的证书存储位置,通常位于/etc/nginc/cert文件夹下,需要将sub.domain.com.pem替换为您的证书文件。
ssl_certificate_key /etc/nginx/cert/sub.domain.com.key; #您证书私钥的存储位置,通常位于/etc/nginc/cert文件夹下,需要将sub.domain.com.key替换为您证书私钥文件。
# 反向代理 / 用于与 Web 服务
location / {
proxy_pass https://127.0.0.1:[port]$request_uri; #port更改为蜜罐启用所设置的端口
proxy_pass http://cloud/;
proxy_redirect off;
proxy_set_header host $host;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header x-forwarded-host $server_name;
}
}
# HTTP 重定向至 HTTPS
server {
listen 80;
listen [::]:80;
server_name sub.domain.com;
location / {
return 301 https://sub.domain.com$request_uri? permanent;
}
}
说明
本文件为生成证书后所使用的文件,存放于/etc/nginx/conf.d/文件夹下(建议为命名为hfish.conf)。
CERT证书自动续期方案
编辑定时任务
crontab -e #首次使用定时任务则选择“2”,使用vim编辑
写入以下命令,将domain.com替换为需要自动需求的域名
00 00 1 * * certbot renew --force-renewal && systemctl restart nginx #每月一号强制续期所有使用certbot生成的证书
certbot申请由Let's encrypto签发的证书通常有效期为三个月,剩余有效期大于三十日则判定为证书有效无法续期,此时使用“--force-renewal ”强制续期即可。
值得注意的是,Let's encrypto限制单个域名/IP每周生成证书最多五十个,每次生成证书时错误尝试次数小于等于五次。建议生成证书时先加入参数“--dry-run”测试。
泛解析方案
泛解析使用acme协议申请证书。
简单来说acme.sh 实现了 acme 协议, 可以从 let‘s encrypt 生成免费的证书。 acme.sh 有以下特点:
一个纯粹用Shell(Unix shell)语言编写的ACME协议客户端。
完整的ACME协议实施。 支持ACME v1和ACME v2 支持ACME v2通配符证书
简单,功能强大且易于使用。你只需要3分钟就可以学习它。
Let's Encrypt免费证书客户端最简单的shell脚本。
纯粹用Shell编写,不依赖于python或官方的Let's Encrypt客户端。
只需一个脚本即可自动颁发,续订和安装证书。 不需要root/sudoer访问权限。
不同意certbot的是,使用acme申请证书无需使用nginx验证域名,仅需提供域名所有者于域名解析商的注册邮箱以及CF密钥。当然,也可也使用dns设置txt解析记录校验泛解析域名归属。
下文基于使用CF密钥申请泛解析证书。dns设置txt验证可能会导致dns设置混乱,可能不利于长期运维。
使用CF_key申请泛解析ssl证书
git clone https://github.com/acmesh-official/acme.sh.git && cd ./acme.sh
./acme.sh --install -m [your_email] #将[your_email]替换为你的邮箱
export email="[your_email]" #将[your_email]替换为你的邮箱
alias acme.sh=/root/.acme.sh/acme.sh
acme.sh --set-default-ca --server letsencrypt
export CF_Email="[your_email]" #将[your_email]替换为你在域名解析商注册的邮箱
export CF_Key="[your_CF_key]" #将[your_CF_key]替换为你的CF密钥
acme.sh --issue --dns dns_cf -d *.domain.com --keylength ec-256
自动续期方案
编辑定时任务
crontab -e #首次使用定时任务则选择“2”,使用vim编辑
写入以下命令,将domain.com替换为需要自动续期的域名
00 00 1 * * acme.sh --issue --force --dns dns_cf -d *.log.hscsec.cn --keylength ec-256 && systemctl restart nginx #每月一号强制续期所有使用acme生成的证书
Nginx配置文件*.conf
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name sub.domain.com; #需要将sub.domain.com替换为您所使用的子域名。
ssl_certificate /root/.acme.sh/*.domain.com_ecc/fullchain.cer; #您的证书存储位置,通常位于.acme.sh文件夹下,需要将domain.com替换为您的域名。
ssl_certificate_key /root/.acme.sh/*.domain.com_ecc/*.domain.com.key; #您证书私钥的存储位置,通常位于.acme.sh文件夹下,需要将domain.com替换为您的域名。
# 反向代理 / 用于与 Web 服务
location / {
proxy_pass https://127.0.0.1:[port]$request_uri; #port更改为蜜罐启用所设置的端口
proxy_redirect off;
proxy_set_header host $host;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header x-forwarded-host $server_name;
}
}
HTTP 重定向至 HTTPS
# HTTP 重定向至 HTTPS
server {
listen 80;
server_name ~^(?<subdomain>.+).domain.com$;
rewrite ^ https://$subdomain.domain.com$request_uri? permanent;
}