xtr3sor/dnstwist-ts

GitHub: xtr3sor/dnstwist-ts

DNSTwist 的 TypeScript 移植版,通过多种域名排列引擎生成变体列表以辅助检测钓鱼和品牌冒充。

Stars: 2 | Forks: 0

# dnstwist-ts [DNSTwist](https://github.com/elceef/dnstwist) 的 TypeScript 移植版 - 用于检测域名抢注、钓鱼攻击和企业间谍活动的域名排列引擎。 ## 概述 dnstwist-ts 是一个 TypeScript/JavaScript 库,用于生成域名变体,以帮助检测潜在的 typosquatting(域名错位抢注)、钓鱼攻击和品牌冒充。它是 [@elceef](https://github.com/elceef) 开发的热门 Python 工具 [dnstwist](https://github.com/elceef/dnstwist) 的直接移植版本。 ## 功能 - **多种排列引擎**:元音交换、字符替换、Unicode 同形字等 - **基于字典的变体**:使用常用词汇和特定领域关键词的词表 - **支持自定义字典**:创建您自己的字典或从外部来源加载 - **Unicode 支持**:通过内置的 punycode 转换处理国际化域名 (IDN) - **TypeScript 支持**:包含完整的类型定义 - **模块化设计**:可使用单独的引擎或根据需要进行组合 - **极简依赖**:仅需要 `tldts` 和 `punycode` ## 安装 ``` npm install dnstwist-ts ``` ## 使用说明 ### 基本用法 ``` import { generateDomainVariations } from "dnstwist-ts"; // Generate all possible variations const variations = generateDomainVariations("example.com"); console.log(variations); // Output: ['ex4mple.com', 'ex4mpl3.com', 'exampl3.com', ...] ``` ### 带选项的高级用法 ``` import { generateDomainVariations } from "dnstwist-ts"; // Generate variations with specific engines only const variations = generateDomainVariations("example.com", { includeVowelSwap: true, includeGlyphs: true, includeUnicode: false, includeDictionary: true, // ... other options }); ``` ### 使用独立引擎 ``` import { engineVowelswap, engineGlyphs, engineUnicode, engineDictionary, } from "dnstwist-ts"; const domain = "example"; const vowelVariations = engineVowelswap(domain); const glyphVariations = engineGlyphs(domain); const unicodeVariations = engineUnicode(domain); const dictVariations = engineDictionary(domain, "com"); ``` ### 简单的 Twist 函数 ``` import { twistDomain } from "dnstwist-ts"; // Quick domain variations const variations = twistDomain("google.com"); console.log(variations); ``` ## 可用引擎 - **Vowel Swap**:交换域名中的元音字母 (a, e, i, o, u) - **Glyphs**:使用视觉上相似的字符进行替换 - **Unicode**:进行 Unicode 同形字替换并转换为 punycode - **Omission**:移除单个字符 - **Duplication**:复制单个字符 - **Addition**:在不同位置添加字符 - **Replacement**:用字母数字替代字符替换原字符 - **Bitsquatting**:比特级别的字符变体 - **Hyphenation**:在不同位置添加连字符 - **Subdomain**:创建子域名变体 - **Position Swap**:交换字符位置 - **Dictionary**:使用词表生成域名变体 - **Number to Letter**:将数字转换为外形相似的字母 - **Homoglyphs**:Unicode 字符替换 - **Common Misspellings**:常见拼写错误 - **TLD Fusion**:不同的顶级域名变体 - **Keyboard Shift**:相邻键盘按键替换 - **Letter Repetition**:常见字母重复模式 - **Letter Swap**:常见字母对交换 - **Common Typo**:常见输入错误模式 ## API 参考 ### `generateDomainVariations(domain: string, options?: Options): string[]` 使用指定的引擎生成域名变体。 **参数:** - `domain`:要生成变体的目标域名 - `options`:可选的配置对象 **选项:** ``` interface Options { includeVowelSwap?: boolean; includeGlyphs?: boolean; includeUnicode?: boolean; includeOmission?: boolean; includeDuplication?: boolean; includeAddition?: boolean; includeReplacement?: boolean; includeBitsquatting?: boolean; includeHyphenation?: boolean; includeSubdomain?: boolean; includePositionSwap?: boolean; includeDictionary?: boolean; includeNumberToLetter?: boolean; includeHomoglyphs?: boolean; includeCommonMisspellings?: boolean; includeTldFusion?: boolean; includeKeyboardShift?: boolean; includeLetterRepetition?: boolean; includeLetterSwap?: boolean; includeCommonTypo?: boolean; } ``` ### `twistDomain(domain: string): string[]` 生成基础域名变体的简单函数。 ### 独立引擎函数 所有引擎都可以作为独立函数使用: - `engineVowelswap(domain: string): string[]` - `engineGlyphs(domain: string): string[]` - `engineUnicode(domain: string): string[]` - `engineOmission(domain: string): string[]` - `engineDuplication(domain: string): string[]` - `engineAddition(domain: string): string[]` - `engineReplacement(domain: string): string[]` - `engineBitsquatting(domain: string): string[]` - `engineHyphenation(domain: string): string[]` - `engineSubdomain(domain: string): string[]` - `enginePositionswap(domain: string): string[]` - `engineDictionary(baseDomain: string, tld: string): string[]` - `engineNumberToLetter(domain: string): string[]` - `engineHomoglyphs(domain: string): string[]` - `engineCommonMisspellings(domain: string): string[]` - `engineTldFusion(domain: string, originalTld: string): string[]` - `engineKeyboardShift(domain: string): string[]` - `engineLetterRepetition(domain: string): string[]` - `engineLetterSwap(domain: string): string[]` - `engineCommonTypo(domain: string): string[]` ## 示例 ### 基础域名变体 ``` import { generateDomainVariations, twistDomain } from "dnstwist-ts"; // Simple domain variations const variations = twistDomain("google.com"); console.log(variations); // Output: ['g00gle.com', 'g0ogle.com', 'go0gle.com', 'googl3.com', ...] // More comprehensive variations const allVariations = generateDomainVariations("example.com"); console.log(`Generated ${allVariations.length} variations`); ``` ### 检测潜在钓鱼域名 ``` import { generateDomainVariations } from "dnstwist-ts"; const targetDomain = "paypal.com"; const variations = generateDomainVariations(targetDomain, { includeVowelSwap: true, includeGlyphs: true, includeUnicode: true, includeDictionary: true, }); console.log("Potential phishing domains:"); variations.slice(0, 10).forEach((variation) => { console.log(variation); }); // Output: // payp4l.com // payp4l.com // p4ypal.com // paypal.com // payp4l.com // ... ``` ### 使用特定引擎进行品牌保护 ``` import { generateDomainVariations } from "dnstwist-ts"; const brandDomain = "microsoft.com"; const variations = generateDomainVariations(brandDomain, { includeVowelSwap: true, includeGlyphs: true, includeDictionary: true, includeTldFusion: true, includeUnicode: false, // Skip Unicode for faster processing includeBitsquatting: false, // Skip bitsquatting for faster processing }); console.log(`Generated ${variations.length} potential brand variations`); // Monitor these variations for potential brand abuse ``` ### 使用独立引擎 ``` import { engineVowelswap, engineGlyphs, engineUnicode, engineDictionary, engineHyphenation, engineTldFusion, } from "dnstwist-ts"; const domain = "facebook"; const tld = "com"; // Vowel swapping const vowelVariations = engineVowelswap(domain); console.log("Vowel variations:", vowelVariations); // Output: ['f4cebook', 'f4c3book', 'f4c3b00k', ...] // Character glyph substitutions const glyphVariations = engineGlyphs(domain); console.log("Glyph variations:", glyphVariations.slice(0, 5)); // Output: ['f4cebook', 'f4c3book', 'f4c3b00k', ...] // Unicode homoglyphs (with punycode conversion) const unicodeVariations = engineUnicode(domain); console.log("Unicode variations:", unicodeVariations.slice(0, 5)); // Dictionary-based variations const dictVariations = engineDictionary(domain, tld); console.log("Dictionary variations:", dictVariations.slice(0, 5)); // Output: ['wwwfacebook', 'facebookwww', 'www-facebook', ...] // Hyphenation const hyphenVariations = engineHyphenation(domain); console.log("Hyphen variations:", hyphenVariations.slice(0, 5)); // Output: ['f-acebook', 'fa-cebook', 'fac-ebook', ...] // TLD variations const tldVariations = engineTldFusion(domain, tld); console.log("TLD variations:", tldVariations.slice(0, 5)); // Output: ['facebook.net', 'facebook.org', 'facebook.io', ...] ``` ### 金融域名保护 ``` import { generateDomainVariations } from "dnstwist-ts"; const bankDomain = "chase.com"; const variations = generateDomainVariations(bankDomain, { includeVowelSwap: true, includeGlyphs: true, includeUnicode: true, includeDictionary: true, includeHyphenation: true, includeTldFusion: true, }); // Focus on variations that could be used for phishing const phishingCandidates = variations.filter((variation) => { // Look for variations that are very similar to original const similarity = calculateSimilarity(bankDomain, variation); return similarity > 0.8; }); console.log(`Found ${phishingCandidates.length} high-similarity variations`); ``` ### 电商域名监控 ``` import { generateDomainVariations } from "dnstwist-ts"; const ecommerceDomain = "amazon.com"; const variations = generateDomainVariations(ecommerceDomain, { includeVowelSwap: true, includeGlyphs: true, includeDictionary: true, includeTldFusion: true, }); // Check for variations that might confuse customers const confusingVariations = variations.filter((variation) => { // Look for variations that could be easily mistyped return variation.length <= ecommerceDomain.length + 2; }); console.log( "Potentially confusing variations:", confusingVariations.slice(0, 10) ); ``` ### 社交媒体域名保护 ``` import { generateDomainVariations } from "dnstwist-ts"; const socialDomain = "twitter.com"; const variations = generateDomainVariations(socialDomain, { includeVowelSwap: true, includeGlyphs: true, includeUnicode: true, includeDictionary: true, }); // Look for variations that could be used for fake accounts const fakeAccountDomains = variations.filter( (variation) => variation.includes("twitter") && variation !== socialDomain ); console.log("Potential fake account domains:", fakeAccountDomains.slice(0, 10)); ``` ### 性能优化 ``` import { generateDomainVariations } from "dnstwist-ts"; // For large-scale monitoring, use only essential engines const fastVariations = generateDomainVariations("example.com", { includeVowelSwap: true, includeGlyphs: true, includeDictionary: false, // Skip dictionary for speed includeUnicode: false, // Skip Unicode for speed includeBitsquatting: false, // Skip bitsquatting for speed includeTldFusion: true, // Keep TLD fusion as it's fast }); console.log(`Fast generation: ${fastVariations.length} variations`); ``` ### 自定义域名分析 ``` import { generateDomainVariations, engineVowelswap, engineGlyphs, removeDuplicates, } from "dnstwist-ts"; function analyzeDomain(domain: string) { // Generate variations using different engines const vowelVariations = engineVowelswap(domain); const glyphVariations = engineGlyphs(domain); // Combine and deduplicate const allVariations = removeDuplicates([ ...vowelVariations, ...glyphVariations, ]); // Analyze the results const analysis = { original: domain, totalVariations: allVariations.length, vowelVariations: vowelVariations.length, glyphVariations: glyphVariations.length, variations: allVariations, }; return analysis; } const result = analyzeDomain("github.com"); console.log(`Analysis for ${result.original}:`); console.log(`Total variations: ${result.totalVariations}`); console.log(`Sample variations:`, result.variations.slice(0, 5)); ``` ### 自定义字典支持 ``` import { generateDomainVariations, createCustomDictionary, loadDictionaryFromFile, loadDictionaryFromUrl, Dictionary, } from "dnstwist-ts"; // Create a simple custom dictionary const simpleDict = createCustomDictionary(["admin", "secure", "login"]); const variations = generateDomainVariations("example.com", { includeDictionary: true, customDictionary: simpleDict, }); // Create a categorized dictionary const bankingDict = createCustomDictionary( ["admin", "secure"], // custom words { banking: ["bank", "finance", "money", "account"], security: ["verify", "authenticate", "confirm", "validate"], } ); // Use categorized dictionary const bankingVariations = generateDomainVariations("chase.com", { includeDictionary: true, customDictionary: bankingDict, }); // Load dictionary from file const fileDict = await loadDictionaryFromFile("./my-dictionary.json"); // Load dictionary from URL const urlDict = await loadDictionaryFromUrl( "https://example.com/dictionary.json" ); ``` ### 与 DNS 检查集成 ``` import { generateDomainVariations } from "dnstwist-ts"; async function checkDomainVariations(domain: string) { const variations = generateDomainVariations(domain); const results = []; for (const variation of variations.slice(0, 10)) { // Limit for demo try { // In a real implementation, you would use a DNS library // const dns = require('dns'); // const addresses = await dns.promises.resolve4(variation); // For demo purposes, we'll simulate const isRegistered = Math.random() > 0.8; // 20% chance of being registered results.push({ domain: variation, registered: isRegistered, // addresses: addresses // In real implementation }); } catch (error) { results.push({ domain: variation, registered: false, error: error.message, }); } } return results; } // Usage checkDomainVariations("google.com").then((results) => { const registeredDomains = results.filter((r) => r.registered); console.log( `Found ${registeredDomains.length} registered variations:`, registeredDomains ); }); ``` ## 示例目录 本包在 `examples/` 目录中包含了详尽的示例: - **`basic-usage.js`** - 基本用法示例和简单的域名变体 - **`individual-engines.js`** - 使用各个独立引擎的示例 - **`advanced-usage.js`** - 高级用法模式和自定义分析 - **`dns-integration.js`** - DNS 集成示例(模拟和真实环境) - **`custom-dictionary.js`** - 自定义字典创建和使用示例 运行示例: ``` cd examples npm install npm run basic # Run basic examples npm run engines # Run individual engine examples npm run advanced # Run advanced examples npm run dns # Run DNS integration examples npm run dictionary # Run custom dictionary examples npm run all # Run all examples ``` ### 开发设置 #### 前置条件 - Node.js 18+ - npm 或 yarn - Git #### 项目结构 ``` dnstwist-ts/ ├── src/ # TypeScript source files │ ├── index.ts # Main library file │ └── dictionaryEN.json # English dictionary ├── dist/ # Compiled JavaScript (auto-generated) ├── examples/ # Usage examples ├── package.json # Package configuration ├── tsconfig.json # TypeScript configuration └── README.md # This file ``` #### 可用脚本 - `npm run build` - 将 TypeScript 编译为 JavaScript - `npm run dev` - 用于开发的监听模式 - `npm run clean` - 移除 dist 目录 - `npm run prepublishOnly` - 在发布前进行构建 ### 获取帮助 - **GitHub Issues**:用于报告 Bug 和提出功能请求 - **GitHub Discussions**:用于提问和一般性讨论 - **Pull Requests**:用于代码贡献 ### 行为准则 - 保持尊重和包容 - 专注于建设性的反馈 - 帮助他人学习和成长 - 遵循 [贡献者公约](https://www.contributor-covenant.org/) ### 致谢 贡献者将在以下位置获得致谢: - README.md 的贡献者部分 - 发布说明 - GitHub 贡献者页面 感谢您对 dnstwist-ts 的贡献!🚀 ## 许可证 MIT 许可证 - 详情请参阅 [LICENSE](LICENSE) 文件。 ## 鸣谢 本项目是 [@elceef](https://github.com/elceef) 开发的杰出 [dnstwist](https://github.com/elceef/dnstwist) 工具的 TypeScript 移植版。如需查看 Python 原版实现,请访问原始项目。 ## 安全提示 本工具专为合法的安全研究、品牌保护和威胁情报目的而设计。请负责任地使用,并遵守相关的法律法规。
标签:MITM代理, TypeScript, 品牌保护, 域名安全, 域名生成, 威胁情报, 安全插件, 开发者工具, 数据可视化, 自动化攻击, 误植域名检测