s3db.js 18.0.11-next.1534f717 → 18.0.11-next.47047b5d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/clients/recker-http-handler.js +56 -8
  2. package/dist/clients/recker-http-handler.js.map +1 -1
  3. package/dist/concerns/id/alphabets.js +150 -0
  4. package/dist/concerns/id/alphabets.js.map +1 -0
  5. package/dist/concerns/id/entropy.js +243 -0
  6. package/dist/concerns/id/entropy.js.map +1 -0
  7. package/dist/concerns/id/generators/nanoid.js +74 -0
  8. package/dist/concerns/id/generators/nanoid.js.map +1 -0
  9. package/dist/concerns/id/generators/sid.js +73 -0
  10. package/dist/concerns/id/generators/sid.js.map +1 -0
  11. package/dist/concerns/id/generators/ulid.js +208 -0
  12. package/dist/concerns/id/generators/ulid.js.map +1 -0
  13. package/dist/concerns/id/generators/uuid-v7.js +150 -0
  14. package/dist/concerns/id/generators/uuid-v7.js.map +1 -0
  15. package/dist/concerns/id/index.js +74 -0
  16. package/dist/concerns/id/index.js.map +1 -0
  17. package/dist/concerns/plugin-storage.js +114 -0
  18. package/dist/concerns/plugin-storage.js.map +1 -1
  19. package/dist/concerns/s3-errors.js +72 -0
  20. package/dist/concerns/s3-errors.js.map +1 -0
  21. package/dist/concerns/s3-key.js +54 -0
  22. package/dist/concerns/s3-key.js.map +1 -0
  23. package/dist/concerns/safe-merge.js +47 -0
  24. package/dist/concerns/safe-merge.js.map +1 -0
  25. package/dist/core/resource-config-validator.js +12 -2
  26. package/dist/core/resource-config-validator.js.map +1 -1
  27. package/dist/core/resource-partitions.class.js +12 -1
  28. package/dist/core/resource-partitions.class.js.map +1 -1
  29. package/dist/core/resource-persistence.class.js +41 -12
  30. package/dist/core/resource-persistence.class.js.map +1 -1
  31. package/dist/core/resource-query.class.js +21 -47
  32. package/dist/core/resource-query.class.js.map +1 -1
  33. package/dist/plugins/concerns/s3-mutex.class.js +155 -0
  34. package/dist/plugins/concerns/s3-mutex.class.js.map +1 -0
  35. package/dist/plugins/recon/stages/recker-asn-stage.js +279 -0
  36. package/dist/plugins/recon/stages/recker-asn-stage.js.map +1 -0
  37. package/dist/plugins/recon/stages/recker-dns-stage.js +227 -0
  38. package/dist/plugins/recon/stages/recker-dns-stage.js.map +1 -0
  39. package/dist/plugins/recon/stages/recker-scrape-stage.js +369 -0
  40. package/dist/plugins/recon/stages/recker-scrape-stage.js.map +1 -0
  41. package/dist/plugins/spider/recker-link-discoverer.js +544 -0
  42. package/dist/plugins/spider/recker-link-discoverer.js.map +1 -0
  43. package/dist/plugins/spider/recker-llms-validator.js +334 -0
  44. package/dist/plugins/spider/recker-llms-validator.js.map +1 -0
  45. package/dist/plugins/spider/recker-robots-validator.js +336 -0
  46. package/dist/plugins/spider/recker-robots-validator.js.map +1 -0
  47. package/dist/plugins/spider/recker-security-adapter.js +325 -0
  48. package/dist/plugins/spider/recker-security-adapter.js.map +1 -0
  49. package/dist/plugins/spider/recker-seo-adapter.js +399 -0
  50. package/dist/plugins/spider/recker-seo-adapter.js.map +1 -0
  51. package/dist/plugins/spider/recker-sitemap-validator.js +406 -0
  52. package/dist/plugins/spider/recker-sitemap-validator.js.map +1 -0
  53. package/dist/resource.class.js +2 -0
  54. package/dist/resource.class.js.map +1 -1
  55. package/dist/s3db.cjs +353 -71
  56. package/dist/s3db.cjs.map +1 -1
  57. package/dist/s3db.es.js +354 -72
  58. package/dist/s3db.es.js.map +1 -1
  59. package/dist/types/clients/recker-http-handler.d.ts +1 -0
  60. package/dist/types/clients/recker-http-handler.d.ts.map +1 -1
  61. package/dist/types/clients/types.d.ts +14 -0
  62. package/dist/types/clients/types.d.ts.map +1 -1
  63. package/dist/types/concerns/id/alphabets.d.ts +125 -0
  64. package/dist/types/concerns/id/alphabets.d.ts.map +1 -0
  65. package/dist/types/concerns/id/entropy.d.ts +84 -0
  66. package/dist/types/concerns/id/entropy.d.ts.map +1 -0
  67. package/dist/types/concerns/id/generators/nanoid.d.ts +46 -0
  68. package/dist/types/concerns/id/generators/nanoid.d.ts.map +1 -0
  69. package/dist/types/concerns/id/generators/sid.d.ts +45 -0
  70. package/dist/types/concerns/id/generators/sid.d.ts.map +1 -0
  71. package/dist/types/concerns/id/generators/ulid.d.ts +71 -0
  72. package/dist/types/concerns/id/generators/ulid.d.ts.map +1 -0
  73. package/dist/types/concerns/id/generators/uuid-v7.d.ts +60 -0
  74. package/dist/types/concerns/id/generators/uuid-v7.d.ts.map +1 -0
  75. package/dist/types/concerns/id/index.d.ts +51 -0
  76. package/dist/types/concerns/id/index.d.ts.map +1 -0
  77. package/dist/types/concerns/plugin-storage.d.ts +25 -0
  78. package/dist/types/concerns/plugin-storage.d.ts.map +1 -1
  79. package/dist/types/concerns/s3-errors.d.ts +20 -0
  80. package/dist/types/concerns/s3-errors.d.ts.map +1 -0
  81. package/dist/types/concerns/s3-key.d.ts +30 -0
  82. package/dist/types/concerns/s3-key.d.ts.map +1 -0
  83. package/dist/types/concerns/safe-merge.d.ts +22 -0
  84. package/dist/types/concerns/safe-merge.d.ts.map +1 -0
  85. package/dist/types/core/resource-config-validator.d.ts.map +1 -1
  86. package/dist/types/core/resource-partitions.class.d.ts.map +1 -1
  87. package/dist/types/core/resource-persistence.class.d.ts.map +1 -1
  88. package/dist/types/core/resource-query.class.d.ts.map +1 -1
  89. package/dist/types/plugins/concerns/s3-mutex.class.d.ts +30 -0
  90. package/dist/types/plugins/concerns/s3-mutex.class.d.ts.map +1 -0
  91. package/dist/types/plugins/recon/stages/recker-asn-stage.d.ts +90 -0
  92. package/dist/types/plugins/recon/stages/recker-asn-stage.d.ts.map +1 -0
  93. package/dist/types/plugins/recon/stages/recker-dns-stage.d.ts +125 -0
  94. package/dist/types/plugins/recon/stages/recker-dns-stage.d.ts.map +1 -0
  95. package/dist/types/plugins/recon/stages/recker-scrape-stage.d.ts +96 -0
  96. package/dist/types/plugins/recon/stages/recker-scrape-stage.d.ts.map +1 -0
  97. package/dist/types/plugins/spider/recker-link-discoverer.d.ts +54 -0
  98. package/dist/types/plugins/spider/recker-link-discoverer.d.ts.map +1 -0
  99. package/dist/types/plugins/spider/recker-llms-validator.d.ts +105 -0
  100. package/dist/types/plugins/spider/recker-llms-validator.d.ts.map +1 -0
  101. package/dist/types/plugins/spider/recker-robots-validator.d.ts +92 -0
  102. package/dist/types/plugins/spider/recker-robots-validator.d.ts.map +1 -0
  103. package/dist/types/plugins/spider/recker-security-adapter.d.ts +83 -0
  104. package/dist/types/plugins/spider/recker-security-adapter.d.ts.map +1 -0
  105. package/dist/types/plugins/spider/recker-seo-adapter.d.ts +187 -0
  106. package/dist/types/plugins/spider/recker-seo-adapter.d.ts.map +1 -0
  107. package/dist/types/plugins/spider/recker-sitemap-validator.d.ts +121 -0
  108. package/dist/types/plugins/spider/recker-sitemap-validator.d.ts.map +1 -0
  109. package/dist/types/resource.class.d.ts.map +1 -1
  110. package/mcp/prompts/index.ts +275 -0
  111. package/mcp/resources/index.ts +322 -0
  112. package/mcp/tools/plugins.ts +1137 -0
  113. package/mcp/tools/streams.ts +340 -0
  114. package/package.json +20 -21
  115. package/src/clients/recker-http-handler.ts +74 -8
  116. package/src/clients/types.ts +14 -0
  117. package/src/concerns/id/alphabets.ts +175 -0
  118. package/src/concerns/id/entropy.ts +286 -0
  119. package/src/concerns/id/generators/sid.ts +90 -0
  120. package/src/concerns/id/generators/ulid.ts +249 -0
  121. package/src/concerns/id/generators/uuid-v7.ts +179 -0
  122. package/src/concerns/id/index.ts +167 -0
  123. package/src/concerns/plugin-storage.ts +144 -0
  124. package/src/concerns/s3-errors.ts +97 -0
  125. package/src/concerns/s3-key.ts +62 -0
  126. package/src/concerns/safe-merge.ts +60 -0
  127. package/src/core/resource-config-validator.ts +9 -2
  128. package/src/core/resource-partitions.class.ts +14 -1
  129. package/src/core/resource-persistence.class.ts +47 -13
  130. package/src/core/resource-query.class.ts +21 -46
  131. package/src/plugins/concerns/s3-mutex.class.ts +228 -0
  132. package/src/plugins/recon/stages/recker-asn-stage.ts +385 -0
  133. package/src/plugins/recon/stages/recker-dns-stage.ts +360 -0
  134. package/src/plugins/recon/stages/recker-scrape-stage.ts +509 -0
  135. package/src/plugins/spider/recker-link-discoverer.ts +645 -0
  136. package/src/plugins/spider/recker-llms-validator.ts +500 -0
  137. package/src/plugins/spider/recker-robots-validator.ts +473 -0
  138. package/src/plugins/spider/recker-security-adapter.ts +489 -0
  139. package/src/plugins/spider/recker-seo-adapter.ts +605 -0
  140. package/src/plugins/spider/recker-sitemap-validator.ts +621 -0
  141. package/src/resource.class.ts +2 -0
@@ -0,0 +1,369 @@
1
+ /**
2
+ * ReckerScrapeStage
3
+ *
4
+ * Web scraping and search reconnaissance using Recker
5
+ *
6
+ * Uses Recker's HTML parser and link extractor for better accuracy
7
+ * Uses Recker's HTTP client for search queries
8
+ *
9
+ * Falls back to GoogleDorksStage if Recker is not available
10
+ */
11
+ import { createHttpClient } from '../../../concerns/http-client.js';
12
+ export class ReckerScrapeStage {
13
+ plugin;
14
+ config;
15
+ _httpClient = null;
16
+ reckerAvailable = null;
17
+ extractLinks = null;
18
+ parse = null;
19
+ fallbackStage = null;
20
+ constructor(plugin) {
21
+ this.plugin = plugin;
22
+ this.config = plugin.config;
23
+ }
24
+ async _checkReckerAvailability() {
25
+ if (this.reckerAvailable !== null) {
26
+ return this.reckerAvailable;
27
+ }
28
+ try {
29
+ const scrapeModule = await import('recker/scrape');
30
+ this.extractLinks = scrapeModule.extractLinks;
31
+ this.parse = scrapeModule.parseHtmlSync;
32
+ this.reckerAvailable = true;
33
+ return true;
34
+ }
35
+ catch {
36
+ this.reckerAvailable = false;
37
+ return false;
38
+ }
39
+ }
40
+ async _getHttpClient() {
41
+ if (!this._httpClient) {
42
+ this._httpClient = await createHttpClient({
43
+ headers: {
44
+ 'User-Agent': this.config.curl?.userAgent || 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
45
+ },
46
+ timeout: 15000,
47
+ retry: {
48
+ maxAttempts: 2,
49
+ delay: 1000,
50
+ backoff: 'exponential',
51
+ retryAfter: true,
52
+ retryOn: [429, 500, 502, 503, 504]
53
+ }
54
+ });
55
+ }
56
+ return this._httpClient;
57
+ }
58
+ async _getFallbackStage() {
59
+ if (!this.fallbackStage) {
60
+ const { GoogleDorksStage } = await import('./google-dorks-stage.js');
61
+ this.fallbackStage = new GoogleDorksStage(this.plugin);
62
+ }
63
+ return this.fallbackStage;
64
+ }
65
+ async execute(target, options = {}) {
66
+ const isReckerAvailable = await this._checkReckerAvailability();
67
+ if (!isReckerAvailable) {
68
+ return this._executeFallback(target, options);
69
+ }
70
+ const domain = this._extractBaseDomain(target.host);
71
+ const companyName = this._extractCompanyName(domain);
72
+ const result = {
73
+ status: 'ok',
74
+ domain,
75
+ companyName,
76
+ categories: {
77
+ github: null,
78
+ pastebin: null,
79
+ linkedin: null,
80
+ documents: null,
81
+ subdomains: null,
82
+ loginPages: null,
83
+ configs: null,
84
+ errors: null
85
+ },
86
+ summary: {
87
+ totalResults: 0,
88
+ totalCategories: 0
89
+ }
90
+ };
91
+ const individual = {};
92
+ const enabledCategories = options.categories || [
93
+ 'github', 'pastebin', 'linkedin', 'documents',
94
+ 'subdomains', 'loginPages', 'configs', 'errors'
95
+ ];
96
+ for (const category of enabledCategories) {
97
+ try {
98
+ let categoryData = null;
99
+ switch (category) {
100
+ case 'github':
101
+ categoryData = await this._searchGitHub(domain, companyName, options);
102
+ break;
103
+ case 'pastebin':
104
+ categoryData = await this._searchPastebin(domain, companyName, options);
105
+ break;
106
+ case 'linkedin':
107
+ categoryData = await this._searchLinkedIn(domain, companyName, options);
108
+ break;
109
+ case 'documents':
110
+ categoryData = await this._searchDocuments(domain, options);
111
+ break;
112
+ case 'subdomains':
113
+ categoryData = await this._searchSubdomains(domain, options);
114
+ break;
115
+ case 'loginPages':
116
+ categoryData = await this._searchLoginPages(domain, options);
117
+ break;
118
+ case 'configs':
119
+ categoryData = await this._searchConfigs(domain, options);
120
+ break;
121
+ case 'errors':
122
+ categoryData = await this._searchErrors(domain, options);
123
+ break;
124
+ }
125
+ result.categories[category] = categoryData;
126
+ individual[category] = categoryData;
127
+ }
128
+ catch (error) {
129
+ result.categories[category] = {
130
+ status: 'error',
131
+ message: error.message
132
+ };
133
+ individual[category] = {
134
+ status: 'error',
135
+ message: error.message
136
+ };
137
+ }
138
+ }
139
+ let totalResults = 0;
140
+ let totalCategories = 0;
141
+ for (const [, data] of Object.entries(result.categories)) {
142
+ if (data && data.status === 'ok') {
143
+ totalCategories++;
144
+ if (data.results) {
145
+ totalResults += data.results.length;
146
+ }
147
+ }
148
+ }
149
+ result.summary.totalResults = totalResults;
150
+ result.summary.totalCategories = totalCategories;
151
+ return {
152
+ _individual: individual,
153
+ _aggregated: result,
154
+ ...result
155
+ };
156
+ }
157
+ async _performSearch(query, options = {}) {
158
+ const maxResults = options.maxResults || 10;
159
+ const results = [];
160
+ try {
161
+ const encodedQuery = encodeURIComponent(query);
162
+ const url = `https://html.duckduckgo.com/html/?q=${encodedQuery}`;
163
+ const client = await this._getHttpClient();
164
+ const response = await client.get(url);
165
+ if (!response.ok) {
166
+ return results;
167
+ }
168
+ const html = await response.text();
169
+ const doc = this.parse(html);
170
+ const links = doc.querySelectorAll('.result__url');
171
+ for (const link of links) {
172
+ let resultUrl = (link.textContent || '').trim();
173
+ if (resultUrl.startsWith('//')) {
174
+ resultUrl = 'https:' + resultUrl;
175
+ }
176
+ if (resultUrl && !results.includes(resultUrl)) {
177
+ results.push(resultUrl);
178
+ }
179
+ if (results.length >= maxResults) {
180
+ break;
181
+ }
182
+ }
183
+ }
184
+ catch {
185
+ // Silently fail
186
+ }
187
+ return results;
188
+ }
189
+ async _searchGitHub(domain, companyName, options) {
190
+ const queries = [
191
+ `site:github.com "${companyName}"`,
192
+ `site:github.com "${domain}"`,
193
+ `site:github.com "api" "${domain}"`,
194
+ `site:github.com "config" "${domain}"`
195
+ ];
196
+ const results = [];
197
+ for (const query of queries) {
198
+ const urls = await this._performSearch(query, options);
199
+ results.push(...urls.map(url => ({ url, query })));
200
+ await this._sleep(2000);
201
+ }
202
+ return {
203
+ status: 'ok',
204
+ results: this._deduplicateResults(results),
205
+ count: results.length
206
+ };
207
+ }
208
+ async _searchPastebin(domain, companyName, options) {
209
+ const queries = [
210
+ `site:pastebin.com "${domain}"`,
211
+ `site:pastebin.com "${companyName}"`,
212
+ `site:paste2.org "${domain}"`,
213
+ `site:slexy.org "${domain}"`
214
+ ];
215
+ const results = [];
216
+ for (const query of queries) {
217
+ const urls = await this._performSearch(query, options);
218
+ results.push(...urls.map(url => ({ url, query })));
219
+ await this._sleep(2000);
220
+ }
221
+ return {
222
+ status: 'ok',
223
+ results: this._deduplicateResults(results),
224
+ count: results.length
225
+ };
226
+ }
227
+ async _searchLinkedIn(domain, companyName, options) {
228
+ const queries = [
229
+ `site:linkedin.com/in "${companyName}"`,
230
+ `site:linkedin.com/company/${companyName.toLowerCase().replace(/\s+/g, '-')}`
231
+ ];
232
+ const results = [];
233
+ for (const query of queries) {
234
+ const urls = await this._performSearch(query, options);
235
+ results.push(...urls.map(url => ({ url, query })));
236
+ await this._sleep(2000);
237
+ }
238
+ return {
239
+ status: 'ok',
240
+ results: this._deduplicateResults(results),
241
+ count: results.length
242
+ };
243
+ }
244
+ async _searchDocuments(domain, options) {
245
+ const filetypes = ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx'];
246
+ const results = [];
247
+ for (const filetype of filetypes) {
248
+ const query = `site:${domain} filetype:${filetype}`;
249
+ const urls = await this._performSearch(query, options);
250
+ results.push(...urls.map(url => ({ url, filetype, query })));
251
+ await this._sleep(2000);
252
+ }
253
+ return {
254
+ status: 'ok',
255
+ results: this._deduplicateResults(results),
256
+ count: results.length
257
+ };
258
+ }
259
+ async _searchSubdomains(domain, options) {
260
+ const query = `site:*.${domain}`;
261
+ const urls = await this._performSearch(query, options);
262
+ const subdomains = urls.map(url => {
263
+ const match = url.match(/https?:\/\/([^\/]+)/);
264
+ return match ? match[1] : null;
265
+ }).filter((s) => s !== null);
266
+ return {
267
+ status: 'ok',
268
+ results: [...new Set(subdomains)].map(subdomain => ({ url: subdomain, subdomain })),
269
+ count: subdomains.length
270
+ };
271
+ }
272
+ async _searchLoginPages(domain, options) {
273
+ const queries = [
274
+ `site:${domain} inurl:login`,
275
+ `site:${domain} inurl:admin`,
276
+ `site:${domain} inurl:dashboard`,
277
+ `site:${domain} inurl:portal`,
278
+ `site:${domain} intitle:"login" OR intitle:"sign in"`
279
+ ];
280
+ const results = [];
281
+ for (const query of queries) {
282
+ const urls = await this._performSearch(query, options);
283
+ results.push(...urls.map(url => ({ url, query })));
284
+ await this._sleep(2000);
285
+ }
286
+ return {
287
+ status: 'ok',
288
+ results: this._deduplicateResults(results),
289
+ count: results.length
290
+ };
291
+ }
292
+ async _searchConfigs(domain, options) {
293
+ const queries = [
294
+ `site:${domain} ext:env`,
295
+ `site:${domain} ext:config`,
296
+ `site:${domain} ext:ini`,
297
+ `site:${domain} ext:yml`,
298
+ `site:${domain} ext:yaml`,
299
+ `site:${domain} inurl:config`,
300
+ `site:${domain} intitle:"index of" "config"`
301
+ ];
302
+ const results = [];
303
+ for (const query of queries) {
304
+ const urls = await this._performSearch(query, options);
305
+ results.push(...urls.map(url => ({ url, query })));
306
+ await this._sleep(2000);
307
+ }
308
+ return {
309
+ status: 'ok',
310
+ results: this._deduplicateResults(results),
311
+ count: results.length
312
+ };
313
+ }
314
+ async _searchErrors(domain, options) {
315
+ const queries = [
316
+ `site:${domain} intext:"error" OR intext:"exception"`,
317
+ `site:${domain} intext:"stack trace"`,
318
+ `site:${domain} intext:"warning" intitle:"error"`,
319
+ `site:${domain} intext:"mysql" intext:"error"`,
320
+ `site:${domain} intext:"fatal error"`
321
+ ];
322
+ const results = [];
323
+ for (const query of queries) {
324
+ const urls = await this._performSearch(query, options);
325
+ results.push(...urls.map(url => ({ url, query })));
326
+ await this._sleep(2000);
327
+ }
328
+ return {
329
+ status: 'ok',
330
+ results: this._deduplicateResults(results),
331
+ count: results.length
332
+ };
333
+ }
334
+ _deduplicateResults(results) {
335
+ const seen = new Set();
336
+ return results.filter(item => {
337
+ const key = item.url || item.subdomain || '';
338
+ if (seen.has(key)) {
339
+ return false;
340
+ }
341
+ seen.add(key);
342
+ return true;
343
+ });
344
+ }
345
+ _extractBaseDomain(host) {
346
+ const parts = host.split('.');
347
+ if (parts.length > 2) {
348
+ return parts.slice(-2).join('.');
349
+ }
350
+ return host;
351
+ }
352
+ _extractCompanyName(domain) {
353
+ const parts = domain.split('.');
354
+ return parts[0].charAt(0).toUpperCase() + parts[0].slice(1);
355
+ }
356
+ async _sleep(ms) {
357
+ return new Promise(resolve => setTimeout(resolve, ms));
358
+ }
359
+ async _executeFallback(target, options) {
360
+ const fallback = await this._getFallbackStage();
361
+ const fallbackResult = await fallback.execute(target, options);
362
+ return fallbackResult;
363
+ }
364
+ isReckerEnabled() {
365
+ return this.reckerAvailable === true;
366
+ }
367
+ }
368
+ export default ReckerScrapeStage;
369
+ //# sourceMappingURL=recker-scrape-stage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recker-scrape-stage.js","sourceRoot":"","sources":["../../../../src/plugins/recon/stages/recker-scrape-stage.ts"],"names":[],"mappings":"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"}