honeynet/DICOMHawk

GitHub: honeynet/DICOMHawk

DICOMHawk 是一个模拟DICOM服务器的蜜罐,用于捕获和记录未授权的医疗影像数据访问尝试。

Stars: 58 | Forks: 51

# m itself. ![DICOMHawk 标志](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/bcd9730874013839.png) 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 实现了一个集中式安全监控基础设施,旨在跟踪和分析攻击者行为。它通过帮助网络安全团队快速检测安全事件、分析使用和交互模式,使医疗保健和研究环境受益。它有助于更好地了解潜在的攻击者技术,为取证分析维护详细日志,并追踪每次交互的来源和影响。 ![DICOMHawk 监控系统](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/4286e27252013840.png) 该监控系统包含接收的 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 使用不同的端口。 ### 部署架构 部署过程概述如下图所示。 ![DICOMHawk 部署架构](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/7fc7000786013840.png) 要使用 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数据库, 内核级阻止, 医疗信息, 威胁情报, 威胁检测, 开发者工具, 搜索引擎查询, 数据伪装, 未授权访问, 流量重放, 网络安全, 自动旋转, 蜜罐, 蜜罐令牌, 访问监控, 证书利用, 请求拦截, 逆向工具, 隐私保护, 集中监控