pentest-tool-lite 3.8.0 → 3.9.0

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 (47) hide show
  1. package/package.json +7 -6
  2. package/src/Pentest.d.ts +1 -0
  3. package/src/Pentest.js +4 -0
  4. package/src/config.d.ts +1 -1
  5. package/src/config.js +1 -2
  6. package/src/dns/A.d.ts +7 -0
  7. package/src/dns/A.js +64 -0
  8. package/src/dns/DMARC.d.ts +6 -0
  9. package/src/dns/DMARC.js +71 -0
  10. package/src/dns/NS.d.ts +7 -0
  11. package/src/dns/NS.js +51 -0
  12. package/src/dns/RegistrationDate.d.ts +7 -0
  13. package/src/dns/RegistrationDate.js +54 -0
  14. package/src/dns/index.d.ts +6 -0
  15. package/src/dns/index.js +58 -0
  16. package/src/functions/getDuplicates.js +1 -1
  17. package/src/functions/parseHtml.js +1 -1
  18. package/src/functions/parseSitemap.js +1 -1
  19. package/src/functions/parseXml.js +1 -1
  20. package/src/html/Anchor.js +2 -2
  21. package/src/html/CSS.js +2 -2
  22. package/src/html/DuplicateId.js +2 -2
  23. package/src/html/Generator.js +2 -2
  24. package/src/html/Image.js +2 -2
  25. package/src/html/JavaScript.js +2 -2
  26. package/src/index +1 -1
  27. package/src/report/index.d.ts +1 -1
  28. package/src/security/ContentEncoding.js +2 -2
  29. package/src/security/ContentSecurityPolicy.js +2 -2
  30. package/src/security/Cookies.js +2 -2
  31. package/src/security/FingerPrint.js +2 -2
  32. package/src/security/GoogleWebRisk.js +2 -2
  33. package/src/security/HSTS.js +2 -2
  34. package/src/security/HTTPS.js +2 -2
  35. package/src/security/HTTPVersion.js +2 -2
  36. package/src/security/PermissionsPolicy.js +2 -2
  37. package/src/security/ReferrerPolicy.js +2 -2
  38. package/src/security/RobotsTXT.js +2 -2
  39. package/src/security/SSL.js +2 -2
  40. package/src/security/XFrameOptions.js +2 -2
  41. package/src/security/XXSSProtection.js +2 -2
  42. package/src/seo/Heading.js +12 -5
  43. package/src/seo/Robots.js +2 -2
  44. package/src/seo/Sitemap.js +2 -2
  45. package/src/seo/Title.js +2 -2
  46. package/src/wordpress/DefaultFiles.js +2 -2
  47. package/src/wordpress/Generator.js +2 -2
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pentest-tool-lite",
3
3
  "description": "Check your website ( or any other website ) for common vulnerabilities.",
4
- "version": "3.8.0",
4
+ "version": "3.9.0",
5
5
  "homepage": "https://pentest-tool-lite.com",
6
6
  "license": "MIT",
7
7
  "author": {
@@ -21,6 +21,7 @@
21
21
  "node-fetch": "^2.6.0",
22
22
  "ssl-checker": "^2.0.7",
23
23
  "uglify-js": "^3.6.1",
24
+ "whois": "^2.14.2",
24
25
  "xml2js": "^0.4.22"
25
26
  },
26
27
  "repository": {
@@ -37,17 +38,17 @@
37
38
  "test": "jest"
38
39
  },
39
40
  "devDependencies": {
40
- "@types/jest": "^27.0.2",
41
- "@types/node": "^18.18.4",
41
+ "@types/jest": "^29.4.0",
42
+ "@types/node": "^20.12.2",
42
43
  "@types/node-fetch": "^2.5.7",
43
44
  "@types/uglify-js": "^3.0.4",
44
45
  "@types/xml2js": "^0.4.5",
45
46
  "@typescript-eslint/eslint-plugin": "^5.1.0",
46
47
  "@typescript-eslint/parser": "^5.1.0",
47
48
  "eslint": "^8.0.1",
48
- "jest": "^27.3.1",
49
- "ts-jest": "^27.0.7",
50
- "typescript": "^4.0.2"
49
+ "jest": "^29.4.3",
50
+ "ts-jest": "^29.0.5",
51
+ "typescript": "^5.2.2"
51
52
  },
52
53
  "keywords": [
53
54
  "pentest-tool",
package/src/Pentest.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { Result } from './Test';
2
2
  interface PentestResult {
3
3
  security: Result;
4
+ dns: Result;
4
5
  html: Result;
5
6
  seo: Result;
6
7
  wordpress: Result;
package/src/Pentest.js CHANGED
@@ -13,22 +13,26 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  const security_1 = __importDefault(require("./security"));
16
+ const dns_1 = __importDefault(require("./dns"));
16
17
  const html_1 = __importDefault(require("./html"));
17
18
  const seo_1 = __importDefault(require("./seo"));
18
19
  const wordpress_1 = __importDefault(require("./wordpress"));
19
20
  class Pentest {
20
21
  run(url) {
21
22
  return __awaiter(this, void 0, void 0, function* () {
23
+ const general = new dns_1.default();
22
24
  const security = new security_1.default();
23
25
  const html = new html_1.default();
24
26
  const seo = new seo_1.default();
25
27
  const wordPress = new wordpress_1.default();
28
+ const generalResult = yield general.run({ url });
26
29
  const securityResult = yield security.run({ url });
27
30
  const htmlResult = yield html.run({ url });
28
31
  const seoResult = yield seo.run({ url });
29
32
  const wordPressResult = yield wordPress.run({ url });
30
33
  return {
31
34
  security: securityResult,
35
+ dns: generalResult,
32
36
  html: htmlResult,
33
37
  seo: seoResult,
34
38
  wordpress: wordPressResult,
package/src/config.d.ts CHANGED
@@ -2,7 +2,7 @@ declare const config: {
2
2
  exclude: any[];
3
3
  grep: any[];
4
4
  logger: {
5
- level: "NONE" | "DEBUG" | "INFO" | "VERBOSE" | "WARNING" | "ERROR";
5
+ level: "DEBUG" | "INFO" | "VERBOSE" | "WARNING" | "ERROR" | "NONE";
6
6
  };
7
7
  report: {
8
8
  format: "CMD" | "JSON";
package/src/config.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mergeConfig = void 0;
3
+ exports.mergeConfig = mergeConfig;
4
4
  const config = {
5
5
  exclude: [],
6
6
  grep: [],
@@ -39,5 +39,4 @@ const config = {
39
39
  function mergeConfig(c) {
40
40
  Object.assign(config, c);
41
41
  }
42
- exports.mergeConfig = mergeConfig;
43
42
  exports.default = config;
package/src/dns/A.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import Test, { TestParameters, Result } from '../Test';
2
+ declare class A extends Test {
3
+ name: string;
4
+ test({ url }: TestParameters): Promise<Result>;
5
+ protected getOrganization(ip: string): Promise<string>;
6
+ }
7
+ export default A;
package/src/dns/A.js ADDED
@@ -0,0 +1,64 @@
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 dns_1 = __importDefault(require("dns"));
16
+ const whois_1 = __importDefault(require("whois"));
17
+ const Test_1 = __importDefault(require("../Test"));
18
+ const logger_1 = __importDefault(require("../logger"));
19
+ class A extends Test_1.default {
20
+ constructor() {
21
+ super(...arguments);
22
+ this.name = 'A';
23
+ }
24
+ test(_a) {
25
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
26
+ logger_1.default.info(`Starting ${this.constructor.name} test...`);
27
+ const response = yield new Promise((resolve, reject) => {
28
+ dns_1.default.lookup((new URL(url).hostname), { all: true }, (err, addresses) => {
29
+ if (err) {
30
+ reject(err);
31
+ }
32
+ resolve(addresses);
33
+ });
34
+ });
35
+ const addresses = yield Promise.all(response.map((address) => __awaiter(this, void 0, void 0, function* () {
36
+ const organization = yield this.getOrganization(address.address);
37
+ return `${address.address} - ${organization}`;
38
+ })));
39
+ return {
40
+ status: 'SUCCESS',
41
+ title: this.constructor.name,
42
+ description: addresses.join('\n'),
43
+ };
44
+ });
45
+ }
46
+ getOrganization(ip) {
47
+ return __awaiter(this, void 0, void 0, function* () {
48
+ const organization = yield new Promise((resolve, reject) => {
49
+ whois_1.default.lookup(ip, function (err, data) {
50
+ if (err) {
51
+ reject(err);
52
+ }
53
+ const organization = data.split('\n')
54
+ .filter((line) => line.includes('OrgName'))
55
+ .map((line) => line.split(':')[1].trim())
56
+ .pop();
57
+ resolve(organization);
58
+ });
59
+ });
60
+ return organization;
61
+ });
62
+ }
63
+ }
64
+ exports.default = A;
@@ -0,0 +1,6 @@
1
+ import Test, { TestParameters, Result } from '../Test';
2
+ declare class DMARC extends Test {
3
+ name: string;
4
+ test({ url }: TestParameters): Promise<Result>;
5
+ }
6
+ export default DMARC;
@@ -0,0 +1,71 @@
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 dns_1 = __importDefault(require("dns"));
16
+ const Test_1 = __importDefault(require("../Test"));
17
+ const logger_1 = __importDefault(require("../logger"));
18
+ class DMARC extends Test_1.default {
19
+ constructor() {
20
+ super(...arguments);
21
+ this.name = 'DMARC';
22
+ }
23
+ test(_a) {
24
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
25
+ logger_1.default.info(`Starting ${this.constructor.name} test...`);
26
+ const response = yield new Promise((resolve, reject) => {
27
+ dns_1.default.resolveTxt(`_dmarc.${(new URL(url).hostname)}`, (err, records) => {
28
+ if (err) {
29
+ reject(err);
30
+ }
31
+ resolve(records);
32
+ });
33
+ });
34
+ if (response.length === 0) {
35
+ return {
36
+ status: 'WARNING',
37
+ title: this.constructor.name,
38
+ description: 'No DMARC record found for this domain.',
39
+ };
40
+ }
41
+ const record = response.shift().shift();
42
+ if (record.includes('p=none')) {
43
+ return {
44
+ status: 'ERROR',
45
+ title: this.constructor.name,
46
+ description: 'Email that fails DMARC Compliance tests will be delivered to the recipient\'s inbox.',
47
+ };
48
+ }
49
+ if (record.includes('p=quarantine')) {
50
+ return {
51
+ status: 'WARNING',
52
+ title: this.constructor.name,
53
+ description: 'Email that fails DMARC Compliance tests will be marked as spam.',
54
+ };
55
+ }
56
+ if (record.includes('p=reject')) {
57
+ return {
58
+ status: 'SUCCESS',
59
+ title: this.constructor.name,
60
+ description: 'Email that fails DMARC Compliance tests will be rejected.',
61
+ };
62
+ }
63
+ return {
64
+ status: 'ERROR',
65
+ title: this.constructor.name,
66
+ description: 'Invalid DMARC policy found!',
67
+ };
68
+ });
69
+ }
70
+ }
71
+ exports.default = DMARC;
@@ -0,0 +1,7 @@
1
+ import Test, { TestParameters, Result } from '../Test';
2
+ declare class NS extends Test {
3
+ name: string;
4
+ test({ url }: TestParameters): Promise<Result>;
5
+ protected getNameServers(domain: string): Promise<string[]>;
6
+ }
7
+ export default NS;
package/src/dns/NS.js ADDED
@@ -0,0 +1,51 @@
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 whois_1 = __importDefault(require("whois"));
16
+ const Test_1 = __importDefault(require("../Test"));
17
+ const logger_1 = __importDefault(require("../logger"));
18
+ class NS extends Test_1.default {
19
+ constructor() {
20
+ super(...arguments);
21
+ this.name = 'NS';
22
+ }
23
+ test(_a) {
24
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
25
+ logger_1.default.info(`Starting ${this.constructor.name} test...`);
26
+ const nameServers = yield this.getNameServers((new URL(url).hostname));
27
+ return {
28
+ status: 'SUCCESS',
29
+ title: this.constructor.name,
30
+ description: nameServers.join('\n'),
31
+ };
32
+ });
33
+ }
34
+ getNameServers(domain) {
35
+ return __awaiter(this, void 0, void 0, function* () {
36
+ const nameServers = yield new Promise((resolve, reject) => {
37
+ whois_1.default.lookup(domain, function (err, data) {
38
+ if (err) {
39
+ reject(err);
40
+ }
41
+ const nameServers = data.split('\n')
42
+ .filter((line) => line.includes('Name Server'))
43
+ .map((line) => line.split(':')[1].trim());
44
+ resolve(nameServers);
45
+ });
46
+ });
47
+ return nameServers;
48
+ });
49
+ }
50
+ }
51
+ exports.default = NS;
@@ -0,0 +1,7 @@
1
+ import Test, { TestParameters, Result } from '../Test';
2
+ declare class RegistrationDate extends Test {
3
+ name: string;
4
+ test({ url }: TestParameters): Promise<Result>;
5
+ protected getRegistrationDate(domain: string): Promise<string>;
6
+ }
7
+ export default RegistrationDate;
@@ -0,0 +1,54 @@
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 whois_1 = __importDefault(require("whois"));
16
+ const Test_1 = __importDefault(require("../Test"));
17
+ const logger_1 = __importDefault(require("../logger"));
18
+ class RegistrationDate extends Test_1.default {
19
+ constructor() {
20
+ super(...arguments);
21
+ this.name = 'RegistrationDate';
22
+ }
23
+ test(_a) {
24
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
25
+ logger_1.default.info(`Starting ${this.constructor.name} test...`);
26
+ const registrationDate = yield this.getRegistrationDate((new URL(url).hostname));
27
+ const diffInMs = (new Date(registrationDate)).getTime() - (new Date()).getTime();
28
+ const diffInDays = diffInMs / (1000 * 60 * 60 * 24);
29
+ return {
30
+ status: diffInDays < 7 ? 'ERROR' : diffInDays < 30 ? 'WARNING' : 'SUCCESS',
31
+ title: this.constructor.name,
32
+ description: `Approximately ${Math.floor(diffInDays)} days until domain expires.`,
33
+ };
34
+ });
35
+ }
36
+ getRegistrationDate(domain) {
37
+ return __awaiter(this, void 0, void 0, function* () {
38
+ const date = yield new Promise((resolve, reject) => {
39
+ whois_1.default.lookup(domain, function (err, data) {
40
+ if (err) {
41
+ reject(err);
42
+ }
43
+ const d = data.split('\n')
44
+ .filter((line) => line.includes('Expiration Date'))
45
+ .map((line) => line.split(': ')[1].trim())
46
+ .shift();
47
+ resolve(d);
48
+ });
49
+ });
50
+ return date;
51
+ });
52
+ }
53
+ }
54
+ exports.default = RegistrationDate;
@@ -0,0 +1,6 @@
1
+ import Test, { TestParameters, Result } from '../Test';
2
+ export default class DNS extends Test {
3
+ name: string;
4
+ constructor();
5
+ test(params: TestParameters): Promise<Result>;
6
+ }
@@ -0,0 +1,58 @@
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 A_1 = __importDefault(require("./A"));
17
+ const NS_1 = __importDefault(require("./NS"));
18
+ const DMARC_1 = __importDefault(require("./DMARC"));
19
+ const RegistrationDate_1 = __importDefault(require("./RegistrationDate"));
20
+ class DNS extends Test_1.default {
21
+ constructor() {
22
+ super();
23
+ this.name = 'DNS';
24
+ this.tests = [
25
+ new RegistrationDate_1.default(),
26
+ new NS_1.default(),
27
+ new A_1.default(),
28
+ new DMARC_1.default(),
29
+ ];
30
+ }
31
+ test(params) {
32
+ return __awaiter(this, void 0, void 0, function* () {
33
+ const tests = this.getTests();
34
+ const results = [];
35
+ for (const test of tests) {
36
+ let result = null;
37
+ try {
38
+ result = yield test.run(params);
39
+ }
40
+ catch (error) {
41
+ result = {
42
+ status: 'ERROR',
43
+ title: test.name,
44
+ description: 'Test failed or cannot be run!',
45
+ };
46
+ }
47
+ results.push(result);
48
+ }
49
+ return {
50
+ status: this.getStatus(results.map(result => result.status)),
51
+ title: this.name,
52
+ description: '',
53
+ results,
54
+ };
55
+ });
56
+ }
57
+ }
58
+ exports.default = DNS;
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = default_1;
3
4
  const htmlparser2_1 = require("htmlparser2");
4
5
  function default_1(result) {
5
6
  return new Promise((resolve) => {
@@ -20,4 +21,3 @@ function default_1(result) {
20
21
  parser.end();
21
22
  });
22
23
  }
23
- exports.default = default_1;
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = default_1;
6
7
  const domhandler_1 = __importDefault(require("domhandler"));
7
8
  const htmlparser2_1 = require("htmlparser2");
8
9
  function default_1(result) {
@@ -18,4 +19,3 @@ function default_1(result) {
18
19
  parser.end();
19
20
  });
20
21
  }
21
- exports.default = default_1;
@@ -12,6 +12,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.default = default_1;
15
16
  const parseXml_1 = __importDefault(require("./parseXml"));
16
17
  function default_1(sitemap) {
17
18
  return __awaiter(this, void 0, void 0, function* () {
@@ -19,4 +20,3 @@ function default_1(sitemap) {
19
20
  return data.urlset.url.map((url) => url.loc[0]);
20
21
  });
21
22
  }
22
- exports.default = default_1;
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = default_1;
6
7
  const xml2js_1 = __importDefault(require("xml2js"));
7
8
  function default_1(result) {
8
9
  return new Promise((resolve, reject) => {
@@ -14,4 +15,3 @@ function default_1(result) {
14
15
  });
15
16
  });
16
17
  }
17
- exports.default = default_1;
@@ -21,8 +21,8 @@ class Anchor extends Test_1.default {
21
21
  super(...arguments);
22
22
  this.name = 'Anchor';
23
23
  }
24
- test({ url }) {
25
- return __awaiter(this, void 0, void 0, function* () {
24
+ test(_a) {
25
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
26
26
  logger_1.default.info(`Starting ${this.constructor.name} test...`);
27
27
  const response = yield request_1.default.get(url);
28
28
  const html = yield (0, functions_1.parseHtml)(response);
package/src/html/CSS.js CHANGED
@@ -22,8 +22,8 @@ class CSS extends Test_1.default {
22
22
  super(...arguments);
23
23
  this.name = 'CSS';
24
24
  }
25
- test({ url }) {
26
- return __awaiter(this, void 0, void 0, function* () {
25
+ test(_a) {
26
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
27
27
  logger_1.default.info(`Starting ${this.constructor.name} test...`);
28
28
  const response = yield request_1.default.get(url);
29
29
  const html = yield (0, functions_1.parseHtml)(response);
@@ -21,8 +21,8 @@ class DuplicateId extends Test_1.default {
21
21
  super(...arguments);
22
22
  this.name = 'Duplicate ID';
23
23
  }
24
- test({ url }) {
25
- return __awaiter(this, void 0, void 0, function* () {
24
+ test(_a) {
25
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
26
26
  logger_1.default.info('Starting DuplicateId test...');
27
27
  const response = yield request_1.default.get(url);
28
28
  const duplicates = yield (0, functions_1.getDuplicates)(response);
@@ -21,8 +21,8 @@ class Generator extends Test_1.default {
21
21
  super(...arguments);
22
22
  this.name = 'Generator';
23
23
  }
24
- test({ url }) {
25
- return __awaiter(this, void 0, void 0, function* () {
24
+ test(_a) {
25
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
26
26
  logger_1.default.info('Starting DuplicateId test...');
27
27
  const response = yield request_1.default.get(url);
28
28
  const html = yield (0, functions_1.parseHtml)(response);
package/src/html/Image.js CHANGED
@@ -21,8 +21,8 @@ class Image extends Test_1.default {
21
21
  super(...arguments);
22
22
  this.name = 'Image';
23
23
  }
24
- test({ url }) {
25
- return __awaiter(this, void 0, void 0, function* () {
24
+ test(_a) {
25
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
26
26
  logger_1.default.info('Starting Image test...');
27
27
  const response = yield request_1.default.get(url);
28
28
  const html = yield (0, functions_1.parseHtml)(response);
@@ -22,8 +22,8 @@ class JavaScript extends Test_1.default {
22
22
  super(...arguments);
23
23
  this.name = 'JavaScript';
24
24
  }
25
- test({ url }) {
26
- return __awaiter(this, void 0, void 0, function* () {
25
+ test(_a) {
26
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
27
27
  logger_1.default.info(`Starting ${this.constructor.name} test...`);
28
28
  const response = yield request_1.default.get(url);
29
29
  const html = yield (0, functions_1.parseHtml)(response);
package/src/index CHANGED
@@ -70,7 +70,7 @@ program
70
70
  const pentest = new Pentest_1.default();
71
71
  const results = yield pentest.run(url);
72
72
  const report = report_1.default.get(config_1.default.report.format);
73
- report.write([results.security, results.html, results.seo, results.wordpress]);
73
+ report.write([results.security, results.dns, results.html, results.seo, results.wordpress]);
74
74
  }));
75
75
  program
76
76
  .command('sitemap <URL>')
@@ -1,5 +1,5 @@
1
1
  import Report from './Report';
2
2
  declare const _default: {
3
- get: (format: 'CMD' | 'JSON') => Report;
3
+ get: (format: "CMD" | "JSON") => Report;
4
4
  };
5
5
  export default _default;
@@ -24,8 +24,8 @@ class ContentEncoding extends Test_1.default {
24
24
  super(...arguments);
25
25
  this.name = 'Content-Encoding';
26
26
  }
27
- test({ url }) {
28
- return __awaiter(this, void 0, void 0, function* () {
27
+ test(_a) {
28
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
29
29
  logger_1.default.info('Starting content-encoding test...');
30
30
  const response = yield request_1.default.get(url);
31
31
  if (!Object.prototype.hasOwnProperty.call(response.headers, 'content-encoding')) {
@@ -24,8 +24,8 @@ class ContentSecurityPolicy extends Test_1.default {
24
24
  super(...arguments);
25
25
  this.name = 'Content-Security-Policy';
26
26
  }
27
- test({ url }) {
28
- return __awaiter(this, void 0, void 0, function* () {
27
+ test(_a) {
28
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
29
29
  logger_1.default.info('Starting ContentSecurityPolicy test...');
30
30
  const response = yield request_1.default.get(url);
31
31
  if (!Object.prototype.hasOwnProperty.call(response.headers, 'content-security-policy')) {
@@ -20,8 +20,8 @@ class Cookies extends Test_1.default {
20
20
  super(...arguments);
21
21
  this.name = 'Cookies';
22
22
  }
23
- test({ url }) {
24
- return __awaiter(this, void 0, void 0, function* () {
23
+ test(_a) {
24
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
25
25
  logger_1.default.info('Starting Cookies test...');
26
26
  const response = yield request_1.default.get(url);
27
27
  let subChecks = [];
@@ -26,8 +26,8 @@ class FingerPrint extends Test_1.default {
26
26
  this.name = 'FingerPrint';
27
27
  this.knownHeaders = ['x-powered-by', 'x-generator', 'server'];
28
28
  }
29
- test({ url }) {
30
- return __awaiter(this, void 0, void 0, function* () {
29
+ test(_a) {
30
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
31
31
  logger_1.default.info('Starting FingerPrint test...');
32
32
  const response = yield request_1.default.get(url);
33
33
  if (this.hasFingerPrintHeader(response.headers)) {
@@ -26,8 +26,8 @@ class GoogleWebRisk extends Test_1.default {
26
26
  super(...arguments);
27
27
  this.name = 'GoogleWebRisk';
28
28
  }
29
- test({ url }) {
30
- return __awaiter(this, void 0, void 0, function* () {
29
+ test(_a) {
30
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
31
31
  logger_1.default.info('Starting Google Web Risk test...');
32
32
  const client = new web_risk_1.WebRiskServiceClient();
33
33
  const request = {
@@ -29,8 +29,8 @@ class HSTS extends Test_1.default {
29
29
  this.name = 'HSTS';
30
30
  this.minValue = 31536000;
31
31
  }
32
- test({ url }) {
33
- return __awaiter(this, void 0, void 0, function* () {
32
+ test(_a) {
33
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
34
34
  logger_1.default.info('Starting HSTS test...');
35
35
  const response = yield request_1.default.get(url);
36
36
  if (!Object.prototype.hasOwnProperty.call(response.headers, 'strict-transport-security')) {
@@ -34,8 +34,8 @@ class HTTPS extends Test_1.default {
34
34
  super(...arguments);
35
35
  this.name = 'HTTPS';
36
36
  }
37
- test({ url }) {
38
- return __awaiter(this, void 0, void 0, function* () {
37
+ test(_a) {
38
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
39
39
  logger_1.default.info('Starting HTTPS test...');
40
40
  const unsecureUrl = this.toHttp(url);
41
41
  const response = yield request_1.default.get(unsecureUrl, { redirect: 'manual' });
@@ -25,8 +25,8 @@ class HTTPVersion extends Test_1.default {
25
25
  super(...arguments);
26
26
  this.name = 'HTTP Version';
27
27
  }
28
- test({ url }) {
29
- return __awaiter(this, void 0, void 0, function* () {
28
+ test(_a) {
29
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
30
30
  logger_1.default.info('Starting HTTPVersion test...');
31
31
  const response = yield request_1.default.get(url);
32
32
  if (Object.prototype.hasOwnProperty.call(response.headers, 'upgrade')) {
@@ -24,8 +24,8 @@ class PermissionsPolicy extends Test_1.default {
24
24
  super(...arguments);
25
25
  this.name = 'Permissions-Policy';
26
26
  }
27
- test({ url }) {
28
- return __awaiter(this, void 0, void 0, function* () {
27
+ test(_a) {
28
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
29
29
  logger_1.default.info('Starting PermissionsPolicy test...');
30
30
  const response = yield request_1.default.get(url);
31
31
  if (!Object.prototype.hasOwnProperty.call(response.headers, 'permissions-policy')) {
@@ -24,8 +24,8 @@ class ReferrerPolicy extends Test_1.default {
24
24
  super(...arguments);
25
25
  this.name = 'Referrer-Policy';
26
26
  }
27
- test({ url }) {
28
- return __awaiter(this, void 0, void 0, function* () {
27
+ test(_a) {
28
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
29
29
  logger_1.default.info('Starting ReferrerPolicy test...');
30
30
  const response = yield request_1.default.get(url);
31
31
  if (!Object.prototype.hasOwnProperty.call(response.headers, 'referrer-policy')) {
@@ -20,8 +20,8 @@ class RobotsTXT extends Test_1.default {
20
20
  super(...arguments);
21
21
  this.name = 'Robots.txt';
22
22
  }
23
- test({ url }) {
24
- return __awaiter(this, void 0, void 0, function* () {
23
+ test(_a) {
24
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
25
25
  logger_1.default.info('Starting robotstxt test...');
26
26
  const response = yield request_1.default.get(url + '/robots.txt');
27
27
  if (response !== null && response.statusCode === 200) {
@@ -20,8 +20,8 @@ class SSL extends Test_1.default {
20
20
  super(...arguments);
21
21
  this.name = 'SSL';
22
22
  }
23
- test({ url }) {
24
- return __awaiter(this, void 0, void 0, function* () {
23
+ test(_a) {
24
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
25
25
  logger_1.default.info('Starting SSL test...');
26
26
  const hostname = (new URL(url)).hostname;
27
27
  const sslDetails = yield (0, ssl_checker_1.default)(hostname);
@@ -24,8 +24,8 @@ class XFrameOptions extends Test_1.default {
24
24
  super(...arguments);
25
25
  this.name = 'X-Frame-Options';
26
26
  }
27
- test({ url }) {
28
- return __awaiter(this, void 0, void 0, function* () {
27
+ test(_a) {
28
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
29
29
  logger_1.default.info('Starting X-Frame-Options test...');
30
30
  const response = yield request_1.default.get(url);
31
31
  if (!Object.prototype.hasOwnProperty.call(response.headers, 'x-frame-options')) {
@@ -24,8 +24,8 @@ class XXSSProtection extends Test_1.default {
24
24
  super(...arguments);
25
25
  this.name = 'X-XSS-Protection';
26
26
  }
27
- test({ url }) {
28
- return __awaiter(this, void 0, void 0, function* () {
27
+ test(_a) {
28
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
29
29
  logger_1.default.info('Starting X-XSS-Protection test...');
30
30
  const response = yield request_1.default.get(url);
31
31
  if (!Object.prototype.hasOwnProperty.call(response.headers, 'x-xss-protection')) {
@@ -21,8 +21,8 @@ class Heading extends Test_1.default {
21
21
  super(...arguments);
22
22
  this.name = 'Heading';
23
23
  }
24
- test({ url }) {
25
- return __awaiter(this, void 0, void 0, function* () {
24
+ test(_a) {
25
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
26
26
  logger_1.default.info(`Starting ${this.constructor.name} test...`);
27
27
  const response = yield request_1.default.get(url);
28
28
  const html = yield (0, functions_1.parseHtml)(response);
@@ -38,6 +38,13 @@ class Heading extends Test_1.default {
38
38
  }
39
39
  checkHeading(title) {
40
40
  const results = [];
41
+ if (typeof title === 'undefined') {
42
+ return [{
43
+ status: 'ERROR',
44
+ title: 'H1 tag',
45
+ description: 'HTML should contain H1 tag.',
46
+ }];
47
+ }
41
48
  results.push({
42
49
  status: typeof title !== undefined && title.length > 0 ? 'SUCCESS' : 'WARNING',
43
50
  title: 'H1 tag',
@@ -45,12 +52,12 @@ class Heading extends Test_1.default {
45
52
  results.push({
46
53
  status: Array.isArray(title) ? 'ERROR' : 'SUCCESS',
47
54
  title: 'Duplicate H1 tag',
48
- description: `HTML should contain just one title tag.`,
55
+ description: `HTML should contain just one H1 tag.`,
49
56
  });
50
57
  results.push({
51
58
  status: title.length <= 60 ? 'SUCCESS' : 'WARNING',
52
- title: 'Title length',
53
- description: `Title length should be under 60 characters and it is ${title.length}.`,
59
+ title: 'H1 length',
60
+ description: `H1 length should be under 60 characters and it is ${title.length}.`,
54
61
  });
55
62
  return results;
56
63
  }
package/src/seo/Robots.js CHANGED
@@ -20,8 +20,8 @@ class Robots extends Test_1.default {
20
20
  super(...arguments);
21
21
  this.name = 'Robots';
22
22
  }
23
- test({ url }) {
24
- return __awaiter(this, void 0, void 0, function* () {
23
+ test(_a) {
24
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
25
25
  logger_1.default.info(`Starting ${this.constructor.name} test...`);
26
26
  const response = yield request_1.default.get(`${url}/robots.txt`);
27
27
  return {
@@ -21,8 +21,8 @@ class Sitemap extends Test_1.default {
21
21
  super(...arguments);
22
22
  this.name = 'Sitemap';
23
23
  }
24
- test({ url }) {
25
- return __awaiter(this, void 0, void 0, function* () {
24
+ test(_a) {
25
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
26
26
  logger_1.default.info(`Starting ${this.constructor.name} test...`);
27
27
  const robotsResponse = yield request_1.default.get(`${url}/robots.txt`);
28
28
  let sitemapUrl = `${url}/sitemap.xml`;
package/src/seo/Title.js CHANGED
@@ -21,8 +21,8 @@ class Title extends Test_1.default {
21
21
  super(...arguments);
22
22
  this.name = 'Title';
23
23
  }
24
- test({ url }) {
25
- return __awaiter(this, void 0, void 0, function* () {
24
+ test(_a) {
25
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
26
26
  logger_1.default.info(`Starting ${this.constructor.name} test...`);
27
27
  const response = yield request_1.default.get(url);
28
28
  const html = yield (0, functions_1.parseHtml)(response);
@@ -27,8 +27,8 @@ class DefaultFiles extends Test_1.default {
27
27
  'wp-admin/upgrade.php',
28
28
  ];
29
29
  }
30
- test({ url }) {
31
- return __awaiter(this, void 0, void 0, function* () {
30
+ test(_a) {
31
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
32
32
  logger_1.default.info('Starting default files test...');
33
33
  let results = [];
34
34
  results = yield this.checkFiles(url);
@@ -21,8 +21,8 @@ class Generator extends Test_1.default {
21
21
  super(...arguments);
22
22
  this.name = 'Generator';
23
23
  }
24
- test({ url }) {
25
- return __awaiter(this, void 0, void 0, function* () {
24
+ test(_a) {
25
+ return __awaiter(this, arguments, void 0, function* ({ url }) {
26
26
  logger_1.default.info('Starting default files test...');
27
27
  const results = [];
28
28
  results.push(yield this.checkHTML(url));