anoopnaveen/7018SCN-Portfolio
GitHub: anoopnaveen/7018SCN-Portfolio
一个安全工程实践项目,提供认证、SIEM 与恶意软件分析的三合一命令行工具集。
Stars: 0 | Forks: 0
# 安全工程作品集脚本
一组自定义命令行安全工具的完整集合,展示了安全软件开发原则、威胁检测和恶意软件分析技术。
## 项目概述
本作品集包含三个独立的安全工具,用于解决关键的网络安全挑战:
1. **任务 1:安全认证** - 实现带有盐值哈希、复杂度强制和暴力破解防御的安全用户注册与登录
2. **任务 2:SIEM Lite** - 解析服务器日志并检测网络流量中的恶意 IP
3. **任务 3:恶意软件分析与数字取证** - 执行安全的静态恶意软件分析和取证提取
## 安装
### 先决条件
- Python 3.7+
- pip 包管理器
### 设置
```
cd "Task copy 6"
python3 -m pip install -r requirements.txt
```
**依赖项:**
- `Pillow` - 用于图像处理与 EXIF 元数据提取
## 任务 1:安全认证(25%)
### 概述
一个命令行认证系统,演示安全密码处理实践,包括加盐哈希、复杂度强制和暴力破解防御。
**评估的学习成果:** LO1, LO2
### 功能
✅ **安全存储**
- 使用 `os.urandom(16)` 为每个用户生成唯一的 16 字节盐值
- 使用 SHA-256(行业标准,非过时的 MD5)哈希密码
- 以 JSON 格式存储盐值与哈希,便于持久化
✅ **密码复杂度强制**
- 使用正则表达式模式强制严格的密码要求:
- 最小 12 个字符
- 至少一个数字
- 至少一个特殊符号(非字母数字)
✅ **暴力破解防御**
- 仅在**登录失败时**实施 2 秒人工延迟
- 不对成功登录进行延迟(尊重合法用户)
- 使字典攻击在数学上不可行
### 用法
#### 注册新用户:
```
python3 task1_secure_auth.py register
```
**示例:**
```
python3 task1_secure_auth.py register alice
Enter password: P@ssw0rd123!
User 'alice' registered securely.
```
**密码要求:**
- ✓ 有效:`MySecure#Pass123`
- ✓ 有效:`P@ssw0rd!2024`
- ✗ 无效:`weak`(太短,缺少数字和符号)
- ✗ 无效:`Password123`(缺少特殊符号)
- ✗ 无效:`P@ssword!`(缺少数字)
#### 登录已有用户:
```
python3 task1_secure_auth.py login
```
**示例:**
```
python3 task1_secure_auth.py login alice
Enter password: P@ssw0rd123!
Login successful.
```
### 实现细节
- 用户存储在持久化 JSON 文件:`users.json`
- 盐值以十六进制字符串存储,便于序列化
- 密码比较使用常量时间哈希相等性
- 对缺失或损坏的用户数据库进行适当的错误处理
### 示例 users.json 结构
```
{
"alice": {
"salt_hex": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
"password_hash": "sha256_hash_here..."
}
}
```
## 任务 2:SIEM Lite(威胁检测与缓解)(25%)
### 概述
一个安全信息与事件管理(SIEM)工具,解析服务器日志和网络流量文件以检测并告警恶意活动。
**评估的学习成果:** LO1, LO2, LO3
### 功能
✅ **数据解析**
- 读取模拟的 Linux `auth.log` 或网络流量 CSV 文件
- 使用 UTF-8 回退优雅处理编码错误
- 支持大文件的高效流式处理
✅ **使用正则表达式进行模式提取**
- 从“Failed password”日志中提取 IP 地址
- 检测包含“spike”或“massive”关键字的流量峰值
- 健壮的 regex 模式以处理日志格式变化
✅ **动态告警**
- 通过命令行参数(`sys.argv`)传递告警阈值
- 允许在事件响应期间实时调整灵敏度
- **无硬编码限制** - 完全灵活
✅ **结构化 JSON 导出**
- 以防火墙兼容的 JSON 格式导出检测到的 IP
- 包含元数据:阈值、唯一 IP 数量、事件频率
- 按事件计数排序(最活跃的攻击者优先)
### 用法
```
python3 task2_siem_lite.py
```
**参数:**
- `` - 包含事件的 auth.log 或 CSV 文件路径
- `` - 标记 IP 为恶意的最小事件计数(正整数)
- `` - 恶意 IP 列表的输出文件路径
### 示例
#### 示例 1:低灵敏度(标记事件数 ≥ 2 的 IP)
```
python3 task2_siem_lite.py test_auth.log 2 malicious_ips.json
```
**输出:**
```
Processed events: 8
Exported malicious IP list to: malicious_ips.json
```
#### 示例 2:高灵敏度(标记事件数 ≥ 5 的 IP)
```
python3 task2_siem_lite.py auth.log 5 blocked_ips.json
```
### 输入日志格式
该脚本接受标准 Linux auth.log 条目:
```
Jan 15 08:12:45 server sshd[1234]: Failed password for invalid user admin from 192.168.1.100 port 22 ssh2
Jan 15 08:12:46 server sshd[1235]: Failed password for invalid user root from 10.10.10.10 port 23 ssh2
```
或带有峰值指示器的网络流量 CSV:
```
2024-01-15 08:12:45,192.168.1.100,443,massive spike detected,data_exfiltration
```
### JSON 输出格式
```
{
"threshold": 2,
"total_unique_ips": 3,
"malicious_ips": [
{
"ip": "192.168.1.100",
"event_count": 5
},
{
"ip": "10.10.10.10",
"event_count": 3
},
{
"ip": "22.22.22.22",
"event_count": 2
}
]
}
```
### 错误处理
- 文件未找到:提供包含文件路径的清晰错误信息
- 无效阈值:拒绝非正整数
- 编码问题:优雅处理损坏的 UTF-8
- 权限错误:捕获 OSError 并提供描述性消息
## 任务 3:恶意软件分析与数字取证(30%)
### 概述
用于可疑文件的静态分析与取证检查工具,安全地计算文件哈希、与威胁情报比对、隔离匹配项并提取取证元数据。
**评估的学习成果:** LO2, LO3, LO5
### 功能
✅ **安全分块哈希**
- 以 4096 字节块读取文件,防止内存崩溃
- 处理任意大小的文件而不影响系统
- 安全扫描大型企业数据库
✅ **签名比对**
- 将 SHA-256 哈希与已知恶意签名数据库比对
- 在 Python 列表中存储已知恶意哈希
- 与威胁情报(TI)源集成
✅ **安全隔离**
- 使用 `shutil.move()` 物理移动恶意文件
- 创建隔离的 `QUARANTINE_VAULT` 目录
- 通过递增后缀处理文件名冲突
- **非**简单重命名 - 真正的隔离
✅ **取证提取**
- 从图像文件中提取 EXIF GPS 坐标
- 将 GPS EXIF 格式转换为十进制度数
- 优雅处理缺失的 EXIF 数据
- 有助于调查受感染设备
✅ **路径白名单安全**
- 限制扫描到安全的根目录(可配置)
- 防止意外隔离操作系统文件
- 使用 `Path.resolve()` 实现符号链接安全
### 用法
```
python3 task3_malware_forensics.py
```
### 示例
#### 示例 1:扫描安全的测试文件
```
python3 task3_malware_forensics.py test_file.txt
```
**输出:**
```
SHA-256: d90ef1651fd9e7563e1a1450a16bd784e9a7e2d3df0f5a798dfc1bdf70a64aea
No known malicious signature match found.
No EXIF GPS metadata found.
```
#### 示例 2:扫描恶意文件
```
python3 task3_malware_forensics.py malware.exe
```
**输出(若签名匹配):**
```
SHA-256: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Known malicious signature found. File moved to: QUARANTINE_VAULT/malware.exe
No EXIF GPS metadata found.
```
#### 示例 3:从受感染图像提取 GPS
```
python3 task3_malware_forensics.py suspicious_photo.jpg
```
**输出:**
```
SHA-256: d8f3e4b9a1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d
No known malicious signature match found.
EXIF GPS -> latitude: 37.7749, longitude: -122.4194
```
### 配置
#### 已知恶意签名
在脚本中编辑 `KNOWN_BAD_SIGNATURES` 列表:
```
KNOWN_BAD_SIGNATURES = [
"d41d8cd98f00b204e9800998ecf8427e4b7e3f6f1f8e9b4f3f4e1a2d3c4b5a6f",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
]
```
#### 安全扫描根目录
定义白名单目录用于扫描:
```
SAFE_SCAN_ROOTS = [
Path.cwd(), # Current working directory
Path("/home/user/downloads"),
]
```
### 隔离目录
恶意文件被移动到:`QUARANTINE_VAULT/`
```
QUARANTINE_VAULT/
├── malware.exe
├── trojan_1.dll
└── backdoor_2.dll
```
### 错误处理
- 文件未找到:提供清晰的错误信息
- 无效文件类型(非文件):拒绝目录
- 路径遍历尝试:阻止访问安全根目录之外的文件
- EXIF 解析错误:继续正常执行
- 权限问题:提供描述性错误消息
## 测试结果
### 任务 1:认证测试
```
$ python3 task1_secure_auth.py register testuser
Enter password: Weak # ✗ Rejected
Error: password must be 12+ chars, include a number, and a special symbol.
$ python3 task1_secure_auth.py register testuser
Enter password: SecurePass#123 # ✓ Accepted
User 'testuser' registered securely.
$ python3 task1_secure_auth.py login testuser
Enter password: WrongPass#123 # ✗ Failed (2-second delay)
Login failed.
$ python3 task1_secure_auth.py login testuser
Enter password: SecurePass#123 # ✓ Instant success
Login successful.
```
### 任务 2:SIEM 测试
```
$ python3 task2_siem_lite.py test_auth.log 2 test_malicious_ips.json
Processed events: 8
Exported malicious IP list to: test_malicious_ips.json
$ cat test_malicious_ips.json
{
"threshold": 2,
"total_unique_ips": 3,
"malicious_ips": [
{"ip": "192.168.1.100", "event_count": 3},
{"ip": "10.10.10.10", "event_count": 3},
{"ip": "22.22.22.22", "event_count": 2}
]
}
```
### 任务 3:取证测试
```
$ echo "test file content" > test_file.txt
$ python3 task3_malware_forensics.py test_file.txt
SHA-256: d90ef1651fd9e7563e1a1450a16bd784e9a7e2d3df0f5a798dfc1bdf70a64aea
No known malicious signature match found.
No EXIF GPS metadata found.
```
## 避免的常见错误
### ✅ 任务 1:认证
- ❌ 问题:硬编码盐值使目的落空
- ✅ 解决方案:`os.urandom(16)` 为每个用户生成唯一的 16 字节盐值
- ❌ 问题:成功时延迟会使用户沮丧
- ✅ 解决方案:仅在失败尝试时执行 `time.sleep(2)`
- ❌ 问题:字符串长度检查不足够
- ✅ 解决方案:正则表达式模式强制数字、特殊字符
### ✅ 任务 2:SIEM Lite
- ❌ 问题:脆弱的字符串分割在格式变化时失效
- ✅ 解决方案:使用正则表达式(`re.findall`)进行健壮的 IP 提取
- ❌ 问题:硬编码阈值限制灵活性
- ✅ 解决方案:通过 `sys.argv` 参数动态设置阈值
- ❌ 问题:无错误处理会在文件缺失时崩溃
- ✅ 解决方案:使用带有描述性错误的 try/except 块
### ✅ 任务 3:取证
- ❌ 问题:`file.read()` 在 50GB 数据库文件上崩溃
- ✅ 解决方案:分块读取,块大小为 4096 字节
- ❌ 问题:`os.rename()` 留下危险文件可访问
- ✅ 解决方案:使用 `shutil.move()` 移动到隔离的 `QUARANTINE_VAULT`
- ❌ 问题:缺乏防护措施可能隔离关键系统文件
- ✅ 解决方案:使用 `Path.resolve()` 进行白名单强制
## 展示的安全最佳实践
| 实践 | 任务 | 实现方式 |
|------|------|----------|
| 加密哈希 | 1 | SHA-256(非常数 MD5)与唯一盐值 |
| 密码复杂度 | 1 | 正则表达式验证(长度、数字、符号) |
| 速率限制 | 1 | 失败尝试时 2 秒延迟 |
| 日志分析 | 2 | 使用正则表达式提取模式 |
| 威胁情报 | 2 | 动态阈值调整 |
| 安全文件哈希 | 3 | 分块读取(4096 字节) |
| 隔离程序 | 3 | 使用 `shutil.move()` 物理隔离 |
| 取证分析 | 3 | EXIF 元数据提取 |
| 路径验证 | 3 | 白名单强制与 `Path.resolve()` |
## 文件结构
```
Task copy 6/
├── task1_secure_auth.py # Secure authentication system
├── task2_siem_lite.py # SIEM log parser & detector
├── task3_malware_forensics.py # Malware analysis & forensics
├── requirements.txt # Python dependencies
├── malicious_ips.json # Example output
├── users.json # Generated user database
├── QUARANTINE_VAULT/ # Isolated malware storage
├── README.md # This file
└── test_auth.log # Test log file
```
## 依赖项
- **Python 3.7+**
- **Pillow** - 图像处理与 EXIF 提取
使用以下命令安装:
```
pip install -r requirements.txt
```
## 故障排除
### 任务 1:"users.json" 权限错误
```
chmod 600 users.json
```
### 任务 2:日志文件编码问题
- 脚本自动处理 UTF-8 错误
- 确保日志文件可读:`chmod 644 auth.log`
### 任务 3:EXIF 数据提取失败
- 确保文件是有效图像(jpg、png、tiff 等)
- 某些图像会剥离 EXIF;脚本会优雅处理
### QUARANTINE_VAULT 权限问题
```
chmod 700 QUARANTINE_VAULT
```
## 性能特征
| 任务 | 可扩展性 | 限制 |
|------|----------|------|
| 任务 1 | O(n) 注册/登录操作 | JSON 文件大小(实际限制:10K 用户) |
| 任务 2 | O(n) 日志行 | 高效处理大于 1GB 的文件 |
| 任务 3 | O(n) 文件块 | 安全支持任意大小文件 |
## 后续增强
- [ ] 任务 1:多因素认证(TOTP)
- [ ] 任务 1:使用 SQLite 数据库替代 JSON
- [ ] 任务 2:实时日志流(tail -f)
- [ ] 任务 2:IP 地理位置丰富化
- [ ] 任务 3:病毒签名数据库集成(ClamAV)
- [ ] 任务 3:并行文件扫描
- [ ] 任务 3:加密隔离存储
## 联系与支持
对于问题或疑问,请查阅每个任务文件的实现说明或检查测试用例。
## 许可证
仅限教育用途。作为安全工程作品集评估的一部分。
**最后更新:** 2026年4月14日
标签:AMSI绕过, DAST, DNS枚举, EXIF 提取, Homebrew安装, JSON 存储, Pillow, Python 3.7, Python CLI, SHA-256, TGT, VEH, 云安全监控, 加盐哈希, 威胁检测, 字典攻击, 安全工程, 安全开发生命周期, 密码复杂度, 密码学, 恶意软件分析, 手动系统调用, 攻防演练, 数字取证, 暴力破解防御, 网络安全工具, 自动化脚本, 逆向工具, 静态分析