pentest-tool-lite 3.9.3 → 3.10.8

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 (212) hide show
  1. package/LICENSE +19 -0
  2. package/{src → dist}/Pentest.d.ts +1 -0
  3. package/dist/Pentest.js +46 -0
  4. package/{src → dist}/Test.d.ts +1 -0
  5. package/{src → dist}/Test.js +12 -27
  6. package/{src → dist}/commands/Sitemap.d.ts +4 -4
  7. package/dist/commands/Sitemap.js +79 -0
  8. package/dist/dns/A.js +49 -0
  9. package/dist/dns/DMARC.js +59 -0
  10. package/dist/dns/NS.js +36 -0
  11. package/dist/dns/RegistrationDate.js +39 -0
  12. package/dist/dns/index.js +47 -0
  13. package/dist/functions/findEvery.d.ts +2 -0
  14. package/{src → dist}/functions/getDuplicates.js +1 -0
  15. package/dist/functions/getGenerator.d.ts +2 -0
  16. package/{src → dist}/functions/getGenerator.js +3 -0
  17. package/{src → dist}/functions/getHeading.js +4 -0
  18. package/{src → dist}/functions/getImages.js +1 -0
  19. package/dist/functions/getObject.d.ts +2 -0
  20. package/{src → dist}/functions/getScripts.js +1 -0
  21. package/{src → dist}/functions/getStylesheets.js +1 -0
  22. package/{src → dist}/functions/getTitle.js +1 -0
  23. package/{src → dist}/functions/parseHtml.js +4 -0
  24. package/dist/functions/parseSitemap.js +12 -0
  25. package/dist/html/Anchor.js +56 -0
  26. package/dist/html/CSS.js +92 -0
  27. package/dist/html/DuplicateId.js +35 -0
  28. package/dist/html/Generator.js +31 -0
  29. package/dist/html/Image.js +79 -0
  30. package/dist/html/JavaScript.js +107 -0
  31. package/{src → dist}/html/__TESTS__/Generator.test.js +12 -19
  32. package/dist/html/index.js +51 -0
  33. package/{src → dist}/index +39 -28
  34. package/dist/logger/Console.d.ts +14 -0
  35. package/{src → dist}/logger/Console.js +13 -15
  36. package/dist/metadata/HTML.d.ts +6 -0
  37. package/dist/metadata/HTML.js +26 -0
  38. package/dist/metadata/Markdown.d.ts +6 -0
  39. package/dist/metadata/Markdown.js +28 -0
  40. package/dist/metadata/ResponseTime.d.ts +6 -0
  41. package/dist/metadata/ResponseTime.js +25 -0
  42. package/dist/metadata/index.d.ts +6 -0
  43. package/dist/metadata/index.js +45 -0
  44. package/{src → dist}/request/NodeFetch.d.ts +2 -0
  45. package/dist/request/NodeFetch.js +58 -0
  46. package/{src → dist}/request/Request.d.ts +2 -0
  47. package/dist/request/cache/BlackHoleCache.d.ts +7 -0
  48. package/{src → dist}/request/cache/BlackHoleCache.js +4 -3
  49. package/{src → dist}/request/cache/UnlimitedCache.d.ts +1 -2
  50. package/{src → dist}/request/cache/UnlimitedCache.js +4 -0
  51. package/dist/request/index.js +11 -0
  52. package/dist/security/ContentEncoding.js +44 -0
  53. package/dist/security/ContentSecurityPolicy.js +32 -0
  54. package/dist/security/Cookies.js +44 -0
  55. package/dist/security/FingerPrint.js +37 -0
  56. package/dist/security/GoogleWebRisk.js +44 -0
  57. package/dist/security/HSTS.js +48 -0
  58. package/dist/security/HTTPS.js +78 -0
  59. package/dist/security/HTTPVersion.js +50 -0
  60. package/dist/security/PermissionsPolicy.js +53 -0
  61. package/dist/security/Redirect.d.ts +6 -0
  62. package/dist/security/Redirect.js +37 -0
  63. package/dist/security/ReferrerPolicy.js +32 -0
  64. package/dist/security/RobotsTXT.js +28 -0
  65. package/dist/security/SSL.js +36 -0
  66. package/dist/security/XFrameOptions.js +32 -0
  67. package/dist/security/XXSSProtection.js +32 -0
  68. package/{src → dist}/security/__TESTS__/ContentSecurityPolicy.test.js +12 -19
  69. package/{src → dist}/security/__TESTS__/FingerPrint.test.js +12 -19
  70. package/{src → dist}/security/__TESTS__/HSTS.test.js +18 -24
  71. package/{src → dist}/security/__TESTS__/HTTPS.test.js +18 -24
  72. package/dist/security/__TESTS__/XFrameOptions.test.js +37 -0
  73. package/{src → dist}/security/__TESTS__/XXSSProtection.test.js +12 -19
  74. package/{src → dist}/security/index.js +22 -35
  75. package/dist/seo/Heading.js +51 -0
  76. package/dist/seo/Robots.js +21 -0
  77. package/dist/seo/Sitemap.js +32 -0
  78. package/dist/seo/Title.js +44 -0
  79. package/dist/seo/index.js +47 -0
  80. package/dist/wordpress/DefaultFiles.js +50 -0
  81. package/dist/wordpress/Generator.js +58 -0
  82. package/dist/wordpress/index.js +43 -0
  83. package/package.json +68 -59
  84. package/src/Pentest.js +0 -43
  85. package/src/commands/Sitemap.js +0 -94
  86. package/src/dns/A.js +0 -64
  87. package/src/dns/DMARC.js +0 -72
  88. package/src/dns/NS.js +0 -52
  89. package/src/dns/RegistrationDate.js +0 -55
  90. package/src/dns/index.js +0 -58
  91. package/src/functions/findEvery.d.ts +0 -2
  92. package/src/functions/getGenerator.d.ts +0 -2
  93. package/src/functions/getObject.d.ts +0 -2
  94. package/src/functions/parseSitemap.js +0 -22
  95. package/src/html/Anchor.js +0 -71
  96. package/src/html/CSS.js +0 -104
  97. package/src/html/DuplicateId.js +0 -49
  98. package/src/html/Generator.js +0 -45
  99. package/src/html/Image.js +0 -92
  100. package/src/html/JavaScript.js +0 -118
  101. package/src/html/index.js +0 -62
  102. package/src/logger/Console.d.ts +0 -14
  103. package/src/request/NodeFetch.js +0 -49
  104. package/src/request/cache/BlackHoleCache.d.ts +0 -8
  105. package/src/request/cache/Cache.d.ts +0 -6
  106. package/src/request/cache/Cache.js +0 -2
  107. package/src/request/index.js +0 -7
  108. package/src/security/ContentEncoding.js +0 -58
  109. package/src/security/ContentSecurityPolicy.js +0 -46
  110. package/src/security/Cookies.js +0 -58
  111. package/src/security/FingerPrint.js +0 -51
  112. package/src/security/GoogleWebRisk.js +0 -58
  113. package/src/security/HSTS.js +0 -62
  114. package/src/security/HTTPS.js +0 -73
  115. package/src/security/HTTPVersion.js +0 -64
  116. package/src/security/PermissionsPolicy.js +0 -67
  117. package/src/security/ReferrerPolicy.js +0 -46
  118. package/src/security/RobotsTXT.js +0 -42
  119. package/src/security/SSL.js +0 -50
  120. package/src/security/XFrameOptions.js +0 -46
  121. package/src/security/XXSSProtection.js +0 -46
  122. package/src/security/__TESTS__/XFrameOptions.test.js +0 -44
  123. package/src/seo/Heading.js +0 -65
  124. package/src/seo/Robots.js +0 -35
  125. package/src/seo/Sitemap.js +0 -46
  126. package/src/seo/Title.js +0 -58
  127. package/src/seo/index.js +0 -58
  128. package/src/types/Sitemap.d.ts +0 -9
  129. package/src/types/Sitemap.js +0 -0
  130. package/src/wordpress/DefaultFiles.js +0 -66
  131. package/src/wordpress/Generator.js +0 -75
  132. package/src/wordpress/index.js +0 -54
  133. /package/{README.md → dist/README.md} +0 -0
  134. /package/{src → dist}/config.d.ts +0 -0
  135. /package/{src → dist}/config.js +0 -0
  136. /package/{src → dist}/dns/A.d.ts +0 -0
  137. /package/{src → dist}/dns/DMARC.d.ts +0 -0
  138. /package/{src → dist}/dns/NS.d.ts +0 -0
  139. /package/{src → dist}/dns/RegistrationDate.d.ts +0 -0
  140. /package/{src → dist}/dns/index.d.ts +0 -0
  141. /package/{src → dist}/functions/findEvery.js +0 -0
  142. /package/{src → dist}/functions/getAnchors.d.ts +0 -0
  143. /package/{src → dist}/functions/getAnchors.js +0 -0
  144. /package/{src → dist}/functions/getDomain.d.ts +0 -0
  145. /package/{src → dist}/functions/getDomain.js +0 -0
  146. /package/{src → dist}/functions/getDuplicates.d.ts +0 -0
  147. /package/{src → dist}/functions/getHeading.d.ts +0 -0
  148. /package/{src → dist}/functions/getImages.d.ts +0 -0
  149. /package/{src → dist}/functions/getObject.js +0 -0
  150. /package/{src → dist}/functions/getScripts.d.ts +0 -0
  151. /package/{src → dist}/functions/getStylesheets.d.ts +0 -0
  152. /package/{src → dist}/functions/getTitle.d.ts +0 -0
  153. /package/{src → dist}/functions/index.d.ts +0 -0
  154. /package/{src → dist}/functions/index.js +0 -0
  155. /package/{src → dist}/functions/parseHtml.d.ts +0 -0
  156. /package/{src → dist}/functions/parseSitemap.d.ts +0 -0
  157. /package/{src → dist}/functions/parseXml.d.ts +0 -0
  158. /package/{src → dist}/functions/parseXml.js +0 -0
  159. /package/{src → dist}/html/Anchor.d.ts +0 -0
  160. /package/{src → dist}/html/CSS.d.ts +0 -0
  161. /package/{src → dist}/html/DuplicateId.d.ts +0 -0
  162. /package/{src → dist}/html/Generator.d.ts +0 -0
  163. /package/{src → dist}/html/Image.d.ts +0 -0
  164. /package/{src → dist}/html/JavaScript.d.ts +0 -0
  165. /package/{src → dist}/html/__TESTS__/Generator.test.d.ts +0 -0
  166. /package/{src → dist}/html/index.d.ts +0 -0
  167. /package/{src → dist}/index.d.ts +0 -0
  168. /package/{src → dist}/logger/Logger.d.ts +0 -0
  169. /package/{src → dist}/logger/Logger.js +0 -0
  170. /package/{src → dist}/logger/index.d.ts +0 -0
  171. /package/{src → dist}/logger/index.js +0 -0
  172. /package/{src → dist}/report/CommandLine.d.ts +0 -0
  173. /package/{src → dist}/report/CommandLine.js +0 -0
  174. /package/{src → dist}/report/Json.d.ts +0 -0
  175. /package/{src → dist}/report/Json.js +0 -0
  176. /package/{src → dist}/report/Report.d.ts +0 -0
  177. /package/{src → dist}/report/Report.js +0 -0
  178. /package/{src → dist}/report/Symbols.d.ts +0 -0
  179. /package/{src → dist}/report/Symbols.js +0 -0
  180. /package/{src → dist}/report/index.d.ts +0 -0
  181. /package/{src → dist}/report/index.js +0 -0
  182. /package/{src → dist}/request/Request.js +0 -0
  183. /package/{src → dist}/request/index.d.ts +0 -0
  184. /package/{src → dist}/security/ContentEncoding.d.ts +0 -0
  185. /package/{src → dist}/security/ContentSecurityPolicy.d.ts +0 -0
  186. /package/{src → dist}/security/Cookies.d.ts +0 -0
  187. /package/{src → dist}/security/FingerPrint.d.ts +0 -0
  188. /package/{src → dist}/security/GoogleWebRisk.d.ts +0 -0
  189. /package/{src → dist}/security/HSTS.d.ts +0 -0
  190. /package/{src → dist}/security/HTTPS.d.ts +0 -0
  191. /package/{src → dist}/security/HTTPVersion.d.ts +0 -0
  192. /package/{src → dist}/security/PermissionsPolicy.d.ts +0 -0
  193. /package/{src → dist}/security/ReferrerPolicy.d.ts +0 -0
  194. /package/{src → dist}/security/RobotsTXT.d.ts +0 -0
  195. /package/{src → dist}/security/SSL.d.ts +0 -0
  196. /package/{src → dist}/security/XFrameOptions.d.ts +0 -0
  197. /package/{src → dist}/security/XXSSProtection.d.ts +0 -0
  198. /package/{src → dist}/security/__TESTS__/ContentSecurityPolicy.test.d.ts +0 -0
  199. /package/{src → dist}/security/__TESTS__/FingerPrint.test.d.ts +0 -0
  200. /package/{src → dist}/security/__TESTS__/HSTS.test.d.ts +0 -0
  201. /package/{src → dist}/security/__TESTS__/HTTPS.test.d.ts +0 -0
  202. /package/{src → dist}/security/__TESTS__/XFrameOptions.test.d.ts +0 -0
  203. /package/{src → dist}/security/__TESTS__/XXSSProtection.test.d.ts +0 -0
  204. /package/{src → dist}/security/index.d.ts +0 -0
  205. /package/{src → dist}/seo/Heading.d.ts +0 -0
  206. /package/{src → dist}/seo/Robots.d.ts +0 -0
  207. /package/{src → dist}/seo/Sitemap.d.ts +0 -0
  208. /package/{src → dist}/seo/Title.d.ts +0 -0
  209. /package/{src → dist}/seo/index.d.ts +0 -0
  210. /package/{src → dist}/wordpress/DefaultFiles.d.ts +0 -0
  211. /package/{src → dist}/wordpress/Generator.d.ts +0 -0
  212. /package/{src → dist}/wordpress/index.d.ts +0 -0
@@ -1,58 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const web_risk_1 = require("@google-cloud/web-risk");
16
- const Test_1 = __importDefault(require("../Test"));
17
- const logger_1 = __importDefault(require("../logger"));
18
- /**
19
- *
20
- * @see https://cloud.google.com/web-risk
21
- * @see https://safebrowsing.google.com
22
- * @see https://transparencyreport.google.com/safe-browsing/search
23
- */
24
- class GoogleWebRisk extends Test_1.default {
25
- constructor() {
26
- super(...arguments);
27
- this.name = 'GoogleWebRisk';
28
- }
29
- test(_a) {
30
- return __awaiter(this, arguments, void 0, function* ({ url }) {
31
- logger_1.default.info('Starting Google Web Risk test...');
32
- const client = new web_risk_1.WebRiskServiceClient();
33
- const request = {
34
- uri: url,
35
- threatTypes: [
36
- web_risk_1.protos.google.cloud.webrisk.v1.ThreatType.MALWARE,
37
- web_risk_1.protos.google.cloud.webrisk.v1.ThreatType.SOCIAL_ENGINEERING,
38
- web_risk_1.protos.google.cloud.webrisk.v1.ThreatType.UNWANTED_SOFTWARE,
39
- ],
40
- };
41
- const response = yield client.searchUris(request);
42
- const { threat } = response[0];
43
- if (threat !== null) {
44
- return {
45
- status: 'ERROR',
46
- title: this.name,
47
- description: `This url contains ${threat.threatTypes.join(', ').toLowerCase()}!`,
48
- };
49
- }
50
- return {
51
- status: 'SUCCESS',
52
- title: this.name,
53
- description: 'This URL is safe.',
54
- };
55
- });
56
- }
57
- }
58
- exports.default = GoogleWebRisk;
@@ -1,62 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const Test_1 = __importDefault(require("../Test"));
16
- const request_1 = __importDefault(require("../request"));
17
- const logger_1 = __importDefault(require("../logger"));
18
- /**
19
- * HTTP Strict Transport Security
20
- *
21
- * Recommended value is at least one year (31536000).
22
- *
23
- * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security
24
- * @see https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
25
- */
26
- class HSTS extends Test_1.default {
27
- constructor() {
28
- super(...arguments);
29
- this.name = 'HSTS';
30
- this.minValue = 31536000;
31
- }
32
- test(_a) {
33
- return __awaiter(this, arguments, void 0, function* ({ url }) {
34
- logger_1.default.info('Starting HSTS test...');
35
- const response = yield request_1.default.get(url);
36
- if (!Object.prototype.hasOwnProperty.call(response.headers, 'strict-transport-security')) {
37
- return {
38
- status: 'ERROR',
39
- title: 'HSTS',
40
- description: 'The strict-transport-security header is not present!',
41
- };
42
- }
43
- const attributes = response.headers['strict-transport-security'].replace(' ', '').split(';');
44
- const maxAge = attributes.filter((attribute) => {
45
- return attribute.startsWith('max-age');
46
- }).shift().replace('max-age=', '');
47
- if (parseInt(maxAge, 10) < this.minValue) {
48
- return {
49
- status: 'ERROR',
50
- title: 'HSTS',
51
- description: `The value of strict-transport-security header is ${maxAge}. Minimum value is ${this.minValue}!`,
52
- };
53
- }
54
- return {
55
- status: 'SUCCESS',
56
- title: 'HSTS',
57
- description: `The value of strict-transport-security header is ${maxAge}.`,
58
- };
59
- });
60
- }
61
- }
62
- exports.default = HSTS;
@@ -1,73 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const Test_1 = __importDefault(require("../Test"));
16
- const request_1 = __importDefault(require("../request"));
17
- const logger_1 = __importDefault(require("../logger"));
18
- /**
19
- * Hypertext Transfer Protocol Secure
20
- *
21
- * The script first transform the url to be unsecure
22
- * and then make the request. The answer has to be
23
- * redirect to secure version.
24
- *
25
- * Some sites requires www (or requires version without wwww)
26
- * and if the request is not as desired, it first redirects
27
- * to desired version (without https) and then again redirects
28
- * to version with https. This is also wrong.
29
- *
30
- * @see https://en.wikipedia.org/wiki/HTTPS
31
- */
32
- class HTTPS extends Test_1.default {
33
- constructor() {
34
- super(...arguments);
35
- this.name = 'HTTPS';
36
- }
37
- test(_a) {
38
- return __awaiter(this, arguments, void 0, function* ({ url }) {
39
- logger_1.default.info('Starting HTTPS test...');
40
- const unsecureUrl = this.toHttp(url);
41
- const response = yield request_1.default.get(unsecureUrl, { redirect: 'manual' });
42
- if (!this.isRedirect(response)) {
43
- return {
44
- status: 'ERROR',
45
- title: 'HTTPS',
46
- description: `Request to not secure url returned ${response.statusCode}!`,
47
- };
48
- }
49
- if (!this.isRedirectSecure(response)) {
50
- return {
51
- status: 'ERROR',
52
- title: 'HTTPS',
53
- description: `Request to not secure url returned non-secure redirect url ${response.headers.location}!`,
54
- };
55
- }
56
- return {
57
- status: 'SUCCESS',
58
- title: 'HTTPS',
59
- description: `Request to not secure url responded with status code ${response.statusCode} and redirect url ${response.headers.location}.`,
60
- };
61
- });
62
- }
63
- isRedirect(response) {
64
- return Math.floor(response.statusCode / 100) === 3 && 'location' in response.headers;
65
- }
66
- isRedirectSecure(response) {
67
- return response.headers.location.startsWith('https');
68
- }
69
- toHttp(url) {
70
- return url.replace('https://', 'http://');
71
- }
72
- }
73
- exports.default = HTTPS;
@@ -1,64 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const Test_1 = __importDefault(require("../Test"));
16
- const request_1 = __importDefault(require("../request"));
17
- const logger_1 = __importDefault(require("../logger"));
18
- /**
19
- *
20
- * @see https://en.wikipedia.org/wiki/HTTP/2
21
- * @see https://en.wikipedia.org/wiki/HTTP/3
22
- */
23
- class HTTPVersion extends Test_1.default {
24
- constructor() {
25
- super(...arguments);
26
- this.name = 'HTTP Version';
27
- }
28
- test(_a) {
29
- return __awaiter(this, arguments, void 0, function* ({ url }) {
30
- logger_1.default.info('Starting HTTPVersion test...');
31
- const response = yield request_1.default.get(url);
32
- if (Object.prototype.hasOwnProperty.call(response.headers, 'upgrade')) {
33
- const attributes = response.headers['upgrade'].replace(' ', '').split(',');
34
- const h2 = attributes.indexOf('h2') > -1;
35
- if (h2) {
36
- return {
37
- status: 'WARNING',
38
- title: 'HTTP/2',
39
- description: 'The current HTTP version is 2. Can be upgraded to 3.',
40
- };
41
- }
42
- }
43
- if (Object.prototype.hasOwnProperty.call(response.headers, 'alt-svc')) {
44
- const attributes = response.headers['alt-svc'].replace(' ', '').split(',');
45
- const h3 = attributes.find(a => a.includes('h3'));
46
- if (typeof h3 !== 'undefined') {
47
- if (h3) {
48
- return {
49
- status: 'SUCCESS',
50
- title: 'HTTP/3',
51
- description: 'The value of HTTP/3 header is present.',
52
- };
53
- }
54
- }
55
- }
56
- return {
57
- status: 'ERROR',
58
- title: 'HTTP/1',
59
- description: 'The current HTTP version is 1. Should be upgraded at least to 2!',
60
- };
61
- });
62
- }
63
- }
64
- exports.default = HTTPVersion;
@@ -1,67 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const Test_1 = __importDefault(require("../Test"));
16
- const request_1 = __importDefault(require("../request"));
17
- const logger_1 = __importDefault(require("../logger"));
18
- /**
19
- *
20
- * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy
21
- */
22
- class PermissionsPolicy extends Test_1.default {
23
- constructor() {
24
- super(...arguments);
25
- this.name = 'Permissions-Policy';
26
- }
27
- test(_a) {
28
- return __awaiter(this, arguments, void 0, function* ({ url }) {
29
- logger_1.default.info('Starting PermissionsPolicy test...');
30
- const response = yield request_1.default.get(url);
31
- if (!Object.prototype.hasOwnProperty.call(response.headers, 'permissions-policy')) {
32
- return {
33
- status: 'ERROR',
34
- title: 'Permissions-Policy',
35
- description: 'Response headers does not contain permissions-policy header!',
36
- };
37
- }
38
- const permissionsArray = ['accelerometer', 'geolocation', 'midi', 'notifications', 'push', 'sync-xhr',
39
- 'microphone', 'camera', 'magnetometer', 'gyroscope', 'speaker', 'vibrate', 'fullscreen', 'payment', 'usb'];
40
- const attributesList = response.headers['permissions-policy'];
41
- const subChecks = this.checkPermissions(permissionsArray, attributesList);
42
- return {
43
- status: subChecks.some(check => check.status === 'WARNING') ? 'WARNING' : 'SUCCESS',
44
- title: 'Permissions-Policy',
45
- description: '',
46
- results: subChecks,
47
- };
48
- });
49
- }
50
- checkPermissions(permissions, attributes) {
51
- return permissions.map((permission) => {
52
- if (!attributes.includes(permission)) {
53
- return {
54
- status: 'WARNING',
55
- title: permission,
56
- description: `Permission ${permission} is missing.`,
57
- };
58
- }
59
- return {
60
- status: 'SUCCESS',
61
- title: permission,
62
- description: `Permission ${permission} is present.`,
63
- };
64
- });
65
- }
66
- }
67
- exports.default = PermissionsPolicy;
@@ -1,46 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const Test_1 = __importDefault(require("../Test"));
16
- const request_1 = __importDefault(require("../request"));
17
- const logger_1 = __importDefault(require("../logger"));
18
- /**
19
- *
20
- * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy
21
- */
22
- class ReferrerPolicy extends Test_1.default {
23
- constructor() {
24
- super(...arguments);
25
- this.name = 'Referrer-Policy';
26
- }
27
- test(_a) {
28
- return __awaiter(this, arguments, void 0, function* ({ url }) {
29
- logger_1.default.info('Starting ReferrerPolicy test...');
30
- const response = yield request_1.default.get(url);
31
- if (!Object.prototype.hasOwnProperty.call(response.headers, 'referrer-policy')) {
32
- return {
33
- status: 'WARNING',
34
- title: 'Referrer-Policy',
35
- description: 'Response headers does not contain referrer-policy header!',
36
- };
37
- }
38
- return {
39
- status: 'SUCCESS',
40
- title: 'Referrer-Policy',
41
- description: `The value of referrer-policy header is ${response.headers['referrer-policy']}.`,
42
- };
43
- });
44
- }
45
- }
46
- exports.default = ReferrerPolicy;
@@ -1,42 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const Test_1 = __importDefault(require("../Test"));
16
- const request_1 = __importDefault(require("../request"));
17
- const logger_1 = __importDefault(require("../logger"));
18
- class RobotsTXT extends Test_1.default {
19
- constructor() {
20
- super(...arguments);
21
- this.name = 'Robots.txt';
22
- }
23
- test(_a) {
24
- return __awaiter(this, arguments, void 0, function* ({ url }) {
25
- logger_1.default.info('Starting robotstxt test...');
26
- const response = yield request_1.default.get(url + '/robots.txt');
27
- if (response !== null && response.statusCode === 200) {
28
- return {
29
- status: 'SUCCESS',
30
- title: 'Robots.txt',
31
- description: 'Site does contain robots.txt',
32
- };
33
- }
34
- return {
35
- status: 'ERROR',
36
- title: 'Robots.txt',
37
- description: 'Site does not contain robots.txt',
38
- };
39
- });
40
- }
41
- }
42
- exports.default = RobotsTXT;
@@ -1,50 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const ssl_checker_1 = __importDefault(require("ssl-checker"));
16
- const Test_1 = __importDefault(require("../Test"));
17
- const logger_1 = __importDefault(require("../logger"));
18
- class SSL extends Test_1.default {
19
- constructor() {
20
- super(...arguments);
21
- this.name = 'SSL';
22
- }
23
- test(_a) {
24
- return __awaiter(this, arguments, void 0, function* ({ url }) {
25
- logger_1.default.info('Starting SSL test...');
26
- const hostname = (new URL(url)).hostname;
27
- const sslDetails = yield (0, ssl_checker_1.default)(hostname);
28
- if (!sslDetails.valid) {
29
- return {
30
- status: 'ERROR',
31
- title: this.name,
32
- description: 'SSL certificate is not valid!',
33
- };
34
- }
35
- if (sslDetails.daysRemaining <= 7) {
36
- return {
37
- status: 'WARNING',
38
- title: this.name,
39
- description: 'SSL certificate is valid for 7 or less days!',
40
- };
41
- }
42
- return {
43
- status: 'SUCCESS',
44
- title: this.name,
45
- description: `SSL certificate is valid until ${sslDetails.validTo}.`,
46
- };
47
- });
48
- }
49
- }
50
- exports.default = SSL;
@@ -1,46 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const Test_1 = __importDefault(require("../Test"));
16
- const request_1 = __importDefault(require("../request"));
17
- const logger_1 = __importDefault(require("../logger"));
18
- /**
19
- *
20
- * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
21
- */
22
- class XFrameOptions extends Test_1.default {
23
- constructor() {
24
- super(...arguments);
25
- this.name = 'X-Frame-Options';
26
- }
27
- test(_a) {
28
- return __awaiter(this, arguments, void 0, function* ({ url }) {
29
- logger_1.default.info('Starting X-Frame-Options test...');
30
- const response = yield request_1.default.get(url);
31
- if (!Object.prototype.hasOwnProperty.call(response.headers, 'x-frame-options')) {
32
- return {
33
- status: 'ERROR',
34
- title: 'X-Frame-Options',
35
- description: 'Response headers does not contain x-frame-options header!',
36
- };
37
- }
38
- return {
39
- status: 'SUCCESS',
40
- title: 'X-Frame-Options',
41
- description: `The value of x-frame-options header is ${response.headers['x-frame-options']}.`,
42
- };
43
- });
44
- }
45
- }
46
- exports.default = XFrameOptions;
@@ -1,46 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const Test_1 = __importDefault(require("../Test"));
16
- const request_1 = __importDefault(require("../request"));
17
- const logger_1 = __importDefault(require("../logger"));
18
- /**
19
- *
20
- * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection
21
- */
22
- class XXSSProtection extends Test_1.default {
23
- constructor() {
24
- super(...arguments);
25
- this.name = 'X-XSS-Protection';
26
- }
27
- test(_a) {
28
- return __awaiter(this, arguments, void 0, function* ({ url }) {
29
- logger_1.default.info('Starting X-XSS-Protection test...');
30
- const response = yield request_1.default.get(url);
31
- if (!Object.prototype.hasOwnProperty.call(response.headers, 'x-xss-protection')) {
32
- return {
33
- status: 'ERROR',
34
- title: 'X-XSS-Protection',
35
- description: 'Response headers does not contain x-xss-protection header!',
36
- };
37
- }
38
- return {
39
- status: 'SUCCESS',
40
- title: 'X-XSS-Protection',
41
- description: `The value of x-xss-protection header is ${response.headers['x-xss-protection']}.`,
42
- };
43
- });
44
- }
45
- }
46
- exports.default = XXSSProtection;
@@ -1,44 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const XFrameOptions_1 = __importDefault(require("../XFrameOptions"));
16
- const request_1 = __importDefault(require("../../request"));
17
- test('X-Frame-Options test with correct header', () => __awaiter(void 0, void 0, void 0, function* () {
18
- const pentest = new XFrameOptions_1.default();
19
- const mock = jest.spyOn(request_1.default, 'get').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
20
- return new Promise((resolve) => {
21
- resolve({
22
- headers: {
23
- 'x-frame-options': 'deny',
24
- },
25
- });
26
- });
27
- }));
28
- const result = yield pentest.run({ url: 'https://juffalow.com' });
29
- expect(result.status).toEqual('SUCCESS');
30
- mock.mockRestore();
31
- }));
32
- test('X-Frame-Options test with missing X-Frame-Options header', () => __awaiter(void 0, void 0, void 0, function* () {
33
- const pentest = new XFrameOptions_1.default();
34
- const mock = jest.spyOn(request_1.default, 'get').mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
35
- return new Promise((resolve) => {
36
- resolve({
37
- headers: {}
38
- });
39
- });
40
- }));
41
- const result = yield pentest.run({ url: 'https://juffalow.com' });
42
- expect(result.status).toEqual('ERROR');
43
- mock.mockRestore();
44
- }));