jagaor/exifhound
GitHub: jagaor/exifhound
ExifHound 是一款自动化提取、地理定位并分析公共图像 EXIF 元数据的被动 OSINT 调查工具。
Stars: 0 | Forks: 0

## 架构

## 演示

# 🇬🇧 阅读 [英文版](README.en.md)
  
# ExifHound
提取、地理定位并分析公共图像的 EXIF 元数据,用于被动 OSINT 调查。
## 描述
每次你将照片上传到社交网络、论坛或网站时,你可能分享的比想象的要多得多。嵌入在 JPEG、TIFF、PNG 和 WEBP 图像中的 EXIF(Exchangeable Image File Format)元数据可能包含敏感信息,例如:
- **精确的地理位置**(纬度、经度、海拔)
- **相机/设备型号**及制造商
- 拍摄的确切**日期和时间**
- **相机设置**(ISO、光圈、快门速度、焦距)
- 用于处理图像的**软件**
- **版权信息**和描述
对于 OSINT(Open Source Intelligence)专业人士和防御性网络安全而言,这些元数据是高价值的被动情报来源。ExifHound 自动化了这些数据的提取、地理定位和报告生成,从而能够:
- 验证图像是否包含 GPS 坐标并获取逆向街道地址。
- 对来自同一来源的图像进行关联,以确定位置、时间和设备。
- 审计个人图像的元数据暴露情况,以提高隐私意识。
## 道德声明
ExifHound 专用于教育、防御性网络安全研究和个人隐私审计目的。**你不应使用它来提取不属于你的图像或未获得所有者明确许可的图像的元数据。** 滥用此工具侵犯第三方隐私可能会违反当地和国际法律。作者对你可能进行的任何误用不承担责任。
## 架构
ExifHound 由五个独立的模块组成,由 `main.py` 进行编排:
1. **`fetcher.py`**:接收一个远程 URL 或本地路径(或包含它们的目录/列表),并使用 `requests` 下载文件,验证 Content-Type 是否为受支持的图像(JPEG、TIFF、PNG、WEBP),并在将其传递给下一个模块之前计算二进制文件的 SHA-256 哈希值。
2. **`extractor.py`**:使用 `Pillow` 打开图像,并使用 `piexif` 将 EXIF IFD0、ExifIFD 和 GPSIFD 块反序列化为带有类型的 Python 字典,对值进行规范化(将 rationals 转换为 float,将 bytes 转换为 UTF-8 字符串)。
3. **`geo.py`**:接收 GPSLatitude、GPSLongitude 和 GPSAltitude 字段(如果存在),将它们转换为十进制度数,并调用 `geopy`(Nominatim)获取逆向街道地址;返回一个包含坐标和人类可读地址的 `GeoResult` 对象。
4. **`reporter.py`**:接收处理后的 EXIF 字典和 `GeoResult` 并构建三种输出:(1) 使用 `rich` 在控制台中格式化的表格,(2) 带有时间戳的版本化结构化 JSON 文件,以及 (3) 使用 `folium` 生成的交互式 HTML 地图,其中包含位于坐标处的标记和带有键字段的弹出窗口。
5. **`main.py`**:带有 `argparse` 的 CLI,公开了下面描述的标志并编排整个流程。
整个架构是无状态的:每张图像生成其独立的报告。
## 系统要求
- Python 3.11 或更高版本
- pip(Python 包管理器)
- 用于逆向地理编码(Nominatim)和下载远程图像的 Internet 连接
## 安装
```
git clone https://github.com/javiergarridoortiz/exifhound.git
cd exifhound
pip install -r requirements.txt
```
## 基本用法
### 从 URL 分析图像
```
python src/main.py --input https://ejemplo.com/foto.jpg
```
### 分析本地图像
```
python src/main.py --input /ruta/a/imagen.jpg
```
### 从文件处理 URL 列表
```
python src/main.py --batch lista_urls.txt
```
### 生成交互式 HTML 地图
```
python src/main.py --input imagen.jpg --map
```
### 跳过地理编码(无 DNS/Nominatim 解析)
```
python src/main.py --input imagen.jpg --no-geocode
```
## CLI 标志
| 标志 | 描述 |
|------|-------------|
| `--input` | 图像(或目录)的远程 URL 或本地路径。 |
| `--output` | 报告的输出文件夹(默认:`./output`)。 |
| `--map` | 使用 Folium 生成交互式 HTML 地图。 |
| `--json` | 强制生成 JSON 报告(如果存在地理数据,默认会生成)。 |
| `--batch` | 指向 `.txt` 文件的路径,每行一个 URL/路径。 |
| `--quiet` | 禁止在控制台中使用 Rich 格式化的输出。 |
| `--no-geocode` | 跳过逆向地理编码解析(出于隐私或离线状态时非常有用)。 |
## JSON 输出示例
```
{
"file": {
"path": "/ruta/a/imagen.jpg",
"sha256": "a1b2c3d4e5f6...",
"size": 123456
},
"exif": {
"Make": "Canon",
"Model": "EOS 5D Mark IV",
"DateTimeOriginal": "2023:08:15 14:30:00",
"GPSLatitudeRef": "N",
"GPSLatitude": 40.416775,
"GPSLongitudeRef": "W",
"GPSLongitude": -3.703790
},
"geo": {
"lat": 40.416775,
"lon": -3.703790,
"address": "Puerta del Sol, Madrid, España"
}
}
```
## 生成的 HTML 地图
如果使用 `--map` 标志,会在输出文件夹中生成一个 `mapa.html` 文件。地图在提取的 GPS 坐标(如果存在)处包含一个标记,并带有一个显示以下内容的弹出窗口:
- 文件名
- 拍摄日期
- 相机制造商和型号
- 街道地址(如果进行了地理编码)
地图是交互式的,允许缩放、点击标记以及切换基础图层(OpenStreetMap、卫星图)。
## 映射到 MITRE ATT&CK
在防御背景下,ExifHound 与以下信息收集技术相关:
- **T1593 - Search Open Websites/Domains**:从网站或开放存储库中的公共图像中提取元数据,可能会揭示有关基础设施、人员或位置的信息。
- **T1596 - Search Open Technical Databases**:EXIF 分析可被视为在开放技术数据库(即嵌入的元数据本身)中进行搜索。
这些技术是攻击者在侦察阶段所采用的;了解它们有助于防御者识别和缓解元数据的暴露。
## 许可证
本项目基于 **MIT License** 授权。有关更多详细信息,请参阅 [LICENSE](LICENSE) 文件。
## 贡献
欢迎 contributions。请在仓库中开启一个 issue 或 pull request。确保代码通过 pytest 测试并遵循模块化架构。
标签:ESC4, EXIF元数据, OSINT, Python, 图像分析, 地理位置, 无后门, 逆向工具, 隐私审计