honeynet/DICOMHawk
GitHub: honeynet/DICOMHawk
DICOMHawk 是一个模拟DICOM服务器的蜜罐,用于捕获和记录未授权的医疗影像数据访问尝试。
Stars: 58 | Forks: 51
# m itself.

DICOMHawk 是一个强大且高效的 DICOM 服务器蜜罐,旨在吸引并记录未授权的访问尝试和交互行为。它基于 Flask 和 pynetdicom 构建,提供了简洁的网页界面,用于实时监控和管理 DICOM 交互。
# 核心功能
- DICOMHawk 通过其 DICOM 端口,允许潜在攻击者在两个标准 DICOM 信息模型(STUDYROOT 和 PATIENTROOT)上执行 DICOM 操作。
- DICOMHawk 提供 API 服务,使攻击者能够与 DICOM 服务器内容进行交互。利用 API 端点,攻击者可以搜索和下载检查、序列、患者和图像数据。此外,他们还可以向 Web API 服务器上传文件。
- DICOMHawk 存储真实的 DICOM 文件,这些文件通过“癌症影像档案 (TCIA)”的 API 定期更新,其作为 PHI 的元数据被修改以模拟丹麦设置中丹麦公民的真实患者数据。
- DICOMHawk 支持动态数据轮换机制,会自动用从 TCIA 下载的新文件替换已存储的 DICOM 文件。
- DICOMHawk 在 DICOM 服务器和 Web API 中均部署了多种类型的蜜令牌,包括封装的 PDF 金丝雀令牌、蜜 URL(嵌入到 DICOM 数据集中的虚假 URL)、凭证蜜令牌、隐藏端点以及源代码中隐藏的凭证。
- DICOMHawk 会对与蜜罐交互的每个唯一 IP 地址进行自动的威胁情报检查。
- 集成了可选的黑洞服务,用于在内核层面拦截已知大规模扫描服务的流量。要启用此功能,请参阅 _DICOMHawk 配置_。
- DICOMHawk 使用集中监控来跟踪攻击者活动。它采用 Elastic Stack,其中 Logstash 只需蜜罐的 IP 地址即可从 Redis 服务器检索暂存数据以进行日志记录和监控。
# DICOMHawk 监控系统
- 背景
DICOMHawk 实现了一个集中式安全监控基础设施,旨在跟踪和分析攻击者行为。它通过帮助网络安全团队快速检测安全事件、分析使用和交互模式,使医疗保健和研究环境受益。它有助于更好地了解潜在的攻击者技术,为取证分析维护详细日志,并追踪每次交互的来源和影响。

该监控系统包含接收的 DICOM 会话和 API 请求的摘要指标和详细分析,并通过多种可视化类型(数字、表格、饼图、时间线)进行展示。它还包括恶意和滥用评分,作为每个 API 请求或 DICOM 会话的即时评分。
该监控系统利用了几个关键组件:
1. Logstash:从与蜜罐集成的 Redis 数据库收集数据。
2. Elasticsearch:索引和存储安全事件。
3. Kibana:对收集到的数据进行可视化。
# 使用指南
## DICOMHawk 配置
`config.py` 是蜜罐的配置文件,位于项目根目录。
此文件包含可修改的常量,用于自定义蜜罐。其中大多数常量(包括 API 密钥)可以通过环境变量进行覆盖,这些环境变量可以通过 `docker-compose` 文件传递。
当前采用通过 Docker Compose 文件传递敏感信息(如 API 密钥)的方法。
需要注意的是,虽然这种方法便于配置,但可能不是最安全的。为了在未来增强这方面的安全性,应使用 Docker Secrets、加密配置文件或其他技术。
要自定义蜜罐设置,您可以通过 `docker-compose.yml` 文件直接传递环境变量,如下例所示:
```
services:
dicom_server:
environment:
- PROD=yes
- FLASK_ACTIVATED=yes
- BLOCK_SCANNERS=no
- INTEGRITY_CHECK=yes
- TCIA_ACTIVATED=yes
- IP_QUALITY_SCORE_API_KEY=APIKEY
- VIRUS_TOTAL_API_KEY=APIKEY
```
## `config.py` 中的主要可配置参数
`config.py` 文件中可用的主要可配置参数及其可能值如下:
### 通用配置
- **PROD**:布尔值(`yes` 或 `no`),用于指定环境模式。设置为 `yes` 会将系统配置为生产环境,并使用相应的生产设置。如果选择 `no`,系统将设置为开发模式,提供调试详情、异常详情及更多系统信息。
### TCIA 服务配置
TCIA 服务应通过在 [TCIA](https://www.cancerimagingarchive.net/access-data/) 创建账户进行配置,请按照此链接 [创建账户](https://wiki.cancerimagingarchive.net/pages/viewpage.action?pageId=23691309)。当启用 TCIA 配置时,DICOMHawk 有一个暂存机制会定期更新文件。
从档案库检索的文件来自公开可用的存储库,其许可证保存在:
`dicom_server/dicom_storage/tcia_data/modality/[StudyInstanceUID]/SeriesInstanceUID/LICENSE`
- **TCIA_USER_NAME**:TCIA API 认证的用户名。
- **TCIA_PASSWORD**:TCIA API 认证的密码。
- **TCIA_ACTIVATED**:布尔值(`yes` 或 `no`),用于激活或停用 TCIA 服务交互。
- **TCIA_PERIOD_UNIT**:用于定期更新 DICOM 文件的时间单位(`day`、`week`、`hour`、`minutes`)。
- **TCIA_PERIOD**:更新频率,以数字指定。例如,如果 **TCIA_PERIOD_UNIT** 设置为 `week` 而 **TCIA_PERIOD** 设置为 `2`,则文件将每周检索两次。
- **MODALITIES**:要检索的模态列表,例如 `["CT", "MR", "US", "DX"]`。这允许您选择从档案库检索哪些模态。
- **MINIMUM_TCIA_FILES_IN_SERIE**:每个序列的最小文件数。
- **MAXIMUM_TCIA_FILES_IN_SERIE**:每个序列的最大文件数。
### 日志配置
- **FLASK_ACTIVATED**:布尔值,用于启用(`yes`)或禁用(`no`)Flask 服务器日志记录。
### 完整性检查
- **INTEGRITY_CHECK**:布尔值,用于启用(`yes`)或禁用(`no`)对蜜罐中存储的 DICOM 文件进行定期完整性检查。
### DICOM 服务器与黑洞配置
- **DICOM_PORT**:DICOM 服务器的端口号。
- **DICOM_SERVER_HOST**:DICOM 服务器的 IP 地址或主机名。
- **BLOCK_SCANNERS**:布尔值,用于阻止(`yes`)或允许(`no`)已知的大规模扫描器。
## DICOM 服务器和 Web API 的威胁情报
要为与 DICOMHawk 交互的地址启用 IP 信誉检查,请在 `docker-compose.yml` 文件中包含以下环境变量。
每个变量对应一个威胁情报服务。您必须在使用前从各提供商处获取有效的 API 密钥:
- **`ABUSE_IP_API_KEY`** – [AbuseIPDB](https://www.abuseipdb.com/)
- **`IP_QUALITY_SCORE_API_KEY`** – [IPQualityScore](https://www.ipqualityscore.com/)
- **`VIRUS_TOTAL_API_KEY`** – [VirusTotal](https://www.virustotal.com/gui/home/upload)
将 `docker-compose.yml` 文件中的 `APIKEY` 值替换为各服务获取的 API 密钥:
**修改前**:
```
ABUSE_IP_API_KEY=APIKEY
IP_QUALITY_SCORE_API_KEY=APIKEY
VIRUS_TOTAL_API_KEY=APIKEY
```
**修改后**:
```
ABUSE_IP_API_KEY=THE_KEY_YOU_OBTAINED
IP_QUALITY_SCORE_API_KEY=THE_KEY_YOU_OBTAINED
VIRUS_TOTAL_API_KEY=THE_KEY_YOU_OBTAINED
```
## 使用 Docker Compose 部署 DICOMHawk
部署 DICOMHawk 之前,请确保系统上的所需端口(104、3000、5000 和 6379)未被占用。
**针对 Linux 用户**
```
netstat -tuln | grep -E '104|3000|5000|6379'
```
**针对 Windows 用户**
```
Get-NetTCPConnection | Where-Object { $_.LocalPort -eq 104 -or $_.LocalPort -eq 3000 -or $_.LocalPort -eq 5000 -or $_.LocalPort -eq 6379 } | Format-Table
```
如果其中任何端口被占用,您需要释放它们或配置 DICOMHawk 使用不同的端口。
### 部署架构
部署过程概述如下图所示。

要使用 Docker Compose 部署 DICOMHawk,请使用以下命令,该命令会克隆仓库、导航到项目目录并启动所需服务。请注意,克隆仓库可能需要较长时间,因为真实的 DICOM 文件体积较大。
```
git clone https://github.com/honeynet/DICOMHawk.git
cd ./DICOMHawk
docker-compose up -d
```
## 在本地运行 DICOMHawk
要在本地运行 DICOMHawk,每个服务应分别在其目录中运行。重要的是在启动其他服务之前,确保 Redis 服务在端口 6379 上运行。
### 前置条件
- **Redis 服务**:确保 Redis 在端口 6379 上运行。如果您已安装 Redis,可以使用以下命令启动 Redis:
`redis-server --port 6379`
如果您没有安装 Redis,可以使用 Docker 轻松运行一个 Redis 实例,命令如下:
`docker run -p 6379:6379 --name redis-db -d redis`
- **安装依赖包**:
`cd ./dicom_server`
`pip install -r .\requirements.txt`
### 启动每个服务
#### DICOM 服务器
- 从项目根目录导航到 DICOM 服务器目录:
`cd ./dicom_server`
- 使用 Python 运行 DICOM 服务器:
`python main.py` # 如果您的环境默认使用 Python 3,请使用 `python3 main.py`
#### API 服务
- 从项目根目录导航到 API 服务目录:
`cd ./API`
- 使用 Node.js 运行 API:
`node app.js`
#### Flask 日志记录服务器
- 从项目根目录导航到 Flask 日志记录服务器目录:
`cd ./flask_logging_server`
- 启动日志记录服务器:
`python logserver.py` # 如果您的环境默认使用 Python 3,请使用 `python3 logserver.py`
## 运行监控套件
**针对 Linux 用户**
```
netstat -tuln | grep -E '5601|9200|9300'
```
**针对 Windows 用户**
```
Get-NetTCPConnection | Where-Object { $_.LocalPort -eq 5601 -or $_.LocalPort -eq 9200 -or $_.LocalPort -eq 9300 } | Format-Table
```
要部署监控套件,请导航到根目录并运行包含监控套件配置的 Docker Compose 文件:
```
cd monitoring_stack/
docker-compose up -d
```
# 蜜令牌
蜜令牌(金丝雀 PDF 和蜜 URL)是用于检测和告警未授权访问或潜在泄露的安全措施。
## DICOM 服务器
DICOMHawk 中的 DICOM 服务器设计为自动定期更新其 DICOM 文件存储库,从癌症影像档案 (TCIA) 拉取新文件。在此更新过程中,系统会将选定的 DICOM 文件注入蜜令牌,具体包括金丝雀 PDF 和蜜 URL,作为其增强安全措施的一部分。
当 DICOM 服务器定期删除旧的 DICOM 文件并从 TCIA 检索新文件时,更新的金丝雀 PDF 和蜜 URL 会自动注入到部分新文件中。
这确保了安全功能得到持续刷新,并适应当前的监控和安全需求。
### 金丝雀 PDF
金丝雀 PDF 文件是作为 DICOM 文件内受监控令牌的文件。
要修改使用的金丝雀 PDF 令牌,请替换 `dicom_server/storage/can.pdf` 目录中现有的 **can.pdf** 文件。服务器使用此文件作为模板,生成注入到从 TCIA 检索的新 DICOM 文件中的金丝雀 PDF。
请确保更新后的 PDF 文件命名为 **can.pdf**,以确保系统能够正确识别和使用它。
### 蜜 URL
蜜 URL 是嵌入在 DICOM 数据中的 URL。当被访问时,它们表明可能存在未授权交互。
可以通过更新 `docker-compose.yml` 文件中的环境变量 **HONEY_URL** 来更改注入到 DICOM 文件中的蜜 URL。
将 `[YOURHONEYURL]` 替换为您自己的蜜 URL。
```
HONEY_URL="https://[YOURHONEYURL]"
```
环境变量的此更改确保服务器自动获取和更新的任何新 DICOM 文件都将包含新的蜜 URL。
## Let's think about "Web API". In the example, "API Reference" becomes "API 参考", so "API" is kept, and "Reference" is translated. For "Web API", if it's a standalone heading, I might translate it as "Web API" but perhaps add Chinese if it's part of a title. However, the heading is just "Web API", so likely, I should keep it as "Web API" in the translation.
Web API 也采用了四种蜜令牌类型来检测不同的攻击向量。
### robots.txt 文件和隐藏端点
允许攻击者被误导,例如,被引导到名为“/admin”、“/admin-config”、“/secure”和“/ensurance_data”的端点。此文件的目的是激发攻击者的好奇心,去探索 Web API 并想办法访问那些受保护的资源。通过这种方式,可以收集到更有意义的攻击者行为信息。
如果有人访问了“robots.txt”文件,该交互将立即被记录并显示在可视化仪表板中,这有助于识别潜在的爬虫或抓取活动。
例如,当“/admin”端点被访问时,会生成一个伪造的管理员访问令牌,其大小与原始访问令牌无异。这是为了给潜在对手提供启发。
### 蜜凭证
虚假凭证看似“泄露”在 Web API 的登录页面中。它们可以在原始 HTML 源代码中找到。如果潜在对手使用了这些凭证,他们将被带到一个“开发中”的页面。
此外,潜在对手从一开始访问 Web API 时,必须登录系统。系统使用了蜜凭证“test” - “test”。登录页面会持续监控登录尝试,因此可以识别猜测攻击、撞库攻击和暴力破解攻击。
# 使用示例
用户可以使用 DCMTK 工具和 DICOM 客户端应用程序(如 Sante DICOM Viewer 等)与 DICOM 服务器交互。
要下载 SANTE DICOM viewer:[点击此链接](https://santesoft.com/win/sante-dicom-viewer-lite/sante-dicom-viewer-lite.html)。
使用 DCMTK 与服务器交互的示例命令如下:
- 使用此命令验证与服务器的连接。
`echoscu localhost 104`
- 查找所有患者。
`findscu -v -S -k QueryRetrieveLevel=PATIENT localhost 104`
- 按姓名查找特定患者。
`findscu -v -S -k QueryRetrieveLevel=PATIENT -k PatientName="Jim Madsen" localhost 104`
- 查找所有检查。
`findscu -v -S -k QueryRetrieveLevel=STUDY localhost 104`
- 通过 StudyInstanceUID 查找特定检查。
`findscu -v -S -k QueryRetrieveLevel=STUDY -k StudyInstanceUID=1.3.6.1.4.1.14519.5.2.1.6279.6001.142460980973539163820236983184 localhost 104`
- 使用 StudyInstanceUID 获取特定检查。
`getscu -v -S -k QueryRetrieveLevel=STUDY -k StudyInstanceUID=1.3.6.1.4.1.14519.5.2.1.6279.6001.142460980973539163820236983184 localhost 104`
- 使用患者姓名获取特定患者的所有检查。
`getscu -v -S -k QueryRetrieveLevel=STUDY -k PatientName="Jim Madsen" localhost 104`
- 使用 SeriesInstanceUID 获取特定序列的所有检查。
`getscu -v -S -k QueryRetrieveLevel=SERIES -k SeriesInstanceUID=1.3.6.1.4.1.14519.5.2.1.6279.6001.140614242738455943374226148817 localhost 104`
- 存储一个 DICOM 文件。
`storescu -v -d localhost 104 [您的 DICOM 文件路径]`
## 访问 Kibana 仪表板
```
To access the Kibana dashbord after running the monitoring stack, navigate to "http://localhost:5601/app/dashboards" then click on DICOMHawk.
```
## 访问简易日志记录服务器
```
To access the simplified logging server, navigate to "http://localhost:5000".
```
## 访问 Web API 用户界面
```
To access the Web API user interface, navigate to "http://localhost:3000" and use username and password is "test" - "test", respectively.
```
标签:AMSI绕过, API安全, DICOM协议, DICOM安全, Elastic Stack, Flask框架, JSON输出, MITM代理, MIT许可证, pynetdicom, Redis数据库, 内核级阻止, 医疗信息, 威胁情报, 威胁检测, 开发者工具, 搜索引擎查询, 数据伪装, 未授权访问, 流量重放, 网络安全, 自动旋转, 蜜罐, 蜜罐令牌, 访问监控, 证书利用, 请求拦截, 逆向工具, 隐私保护, 集中监控