# 蜜罐隐藏方案

## 前言

通常厂商威胁捕捉与诱骗系统内置的蜜罐的特征，都在各红队挂上号了。哈希时代下的蜜罐隐藏，只能开发自定义蜜罐以规避哈希识别。

对于一个正常服务，通常情况下不会使用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
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访问权限。
> * 支持在Docker内使用，支持IPv6

不同意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;
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs-hfish.hscsec.cn/qi-ta/mi-guan-yin-cang-fang-an.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
