目录
1. 蜜罐技术介绍
1.1 蜜罐技术是什么
1.2 蜜罐分类
2. 使用蜜罐技术获取信息
2.1 初始化项目
2.2 读取 PFRO.log 文件
2.2.1 PFRO.log 作用及位置
2.2.2 使用 fs 读取 PFRO.log 文件
2.2.3 关于 buffer 与字符编码(扩展)
2.3 使用 正则表达式 匹配系统用户名
2.4 通过 系统用户名 获取 微信ID
2.5 通过 系统用户名 + 微信ID 获取用户信息
1. 蜜罐技术介绍
1.1 蜜罐技术是什么
蜜罐技术是一种主动防御技术,通过部署 没有真实业务数据 的系统,诱骗攻击者实施攻击。蜜罐记录攻击过程中的痕迹,如病毒源码、操作手段等,进而提高真是系统的防御力量。
1.2 蜜罐分类
实系统蜜罐 —— 运行着真实的系统,并且带着真实可入侵的漏洞;入侵者每一次入侵都会引起系统真实的反应,例如被溢出、渗透、夺取权限等;但是它记录下的入侵信息往往是最真实的
伪系统蜜罐 —— 利用一些工具程序强大的模仿能力,伪造出不属于自己平台的“漏洞”;因为很少有能同时攻击几种系统的漏洞代码(LSASS 溢出漏洞能拿到 Windows 的权限,却拿不到 Linux 的);它可以最大程度防止被入侵者破坏,也能模拟不存在的漏洞
蜜罐技术_百度百科蜜罐技术本质上是一种对攻击方进行欺骗的技术,通过布置一些作为诱饵的主机、网络服务或者信息,诱使攻击方对它们实施攻击,从而可以对攻击行为进行捕获和分析,了解攻击方所使用的工具与方法,推测攻击意图和动机,能够让防御方清晰地了解他们所面对的安全威胁,并通过技术和管理手段来增强实际系统的安全防护能力。蜜罐好比是情报收集系统。蜜罐好像是故意让人攻击的目标,引诱黑客前来攻击。所以攻击者入侵后,你就可以知道他是如何得逞的,随时了解针对服务器发动的最新的攻击和漏洞。还可以通过窃听黑客之间的联系,收集黑客所用的种种工具,并且掌握他们的社交网络。https://baike.baidu.com/item/%E8%9C%9C%E7%BD%90%E6%8A%80%E6%9C%AF/9165942?fr=aladdin
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 - 将每个字节编码为两个十六进制字符
Node.js Buffer(缓冲区) | 菜鸟教程Node.js Buffer(缓冲区) JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。 但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。 在 Node.js 中,Buffer 类是随 Node 内核一起发布的核心库。Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处..https://www.runoob.com/nodejs/nodejs-buffer.html
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)
})
打印结果: