@etcsec-com/etc-collector 1.4.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.
- package/.env.example +60 -0
- package/.env.test.example +33 -0
- package/.github/workflows/ci.yml +83 -0
- package/.github/workflows/release.yml +246 -0
- package/.prettierrc.json +10 -0
- package/CHANGELOG.md +15 -0
- package/Dockerfile +57 -0
- package/LICENSE +190 -0
- package/README.md +194 -0
- package/dist/api/controllers/audit.controller.d.ts +21 -0
- package/dist/api/controllers/audit.controller.d.ts.map +1 -0
- package/dist/api/controllers/audit.controller.js +179 -0
- package/dist/api/controllers/audit.controller.js.map +1 -0
- package/dist/api/controllers/auth.controller.d.ts +16 -0
- package/dist/api/controllers/auth.controller.d.ts.map +1 -0
- package/dist/api/controllers/auth.controller.js +146 -0
- package/dist/api/controllers/auth.controller.js.map +1 -0
- package/dist/api/controllers/export.controller.d.ts +27 -0
- package/dist/api/controllers/export.controller.d.ts.map +1 -0
- package/dist/api/controllers/export.controller.js +80 -0
- package/dist/api/controllers/export.controller.js.map +1 -0
- package/dist/api/controllers/health.controller.d.ts +5 -0
- package/dist/api/controllers/health.controller.d.ts.map +1 -0
- package/dist/api/controllers/health.controller.js +16 -0
- package/dist/api/controllers/health.controller.js.map +1 -0
- package/dist/api/controllers/jobs.controller.d.ts +13 -0
- package/dist/api/controllers/jobs.controller.d.ts.map +1 -0
- package/dist/api/controllers/jobs.controller.js +125 -0
- package/dist/api/controllers/jobs.controller.js.map +1 -0
- package/dist/api/controllers/providers.controller.d.ts +15 -0
- package/dist/api/controllers/providers.controller.d.ts.map +1 -0
- package/dist/api/controllers/providers.controller.js +112 -0
- package/dist/api/controllers/providers.controller.js.map +1 -0
- package/dist/api/dto/AuditRequest.dto.d.ts +6 -0
- package/dist/api/dto/AuditRequest.dto.d.ts.map +1 -0
- package/dist/api/dto/AuditRequest.dto.js +3 -0
- package/dist/api/dto/AuditRequest.dto.js.map +1 -0
- package/dist/api/dto/AuditResponse.dto.d.ts +17 -0
- package/dist/api/dto/AuditResponse.dto.d.ts.map +1 -0
- package/dist/api/dto/AuditResponse.dto.js +3 -0
- package/dist/api/dto/AuditResponse.dto.js.map +1 -0
- package/dist/api/dto/TokenRequest.dto.d.ts +6 -0
- package/dist/api/dto/TokenRequest.dto.d.ts.map +1 -0
- package/dist/api/dto/TokenRequest.dto.js +3 -0
- package/dist/api/dto/TokenRequest.dto.js.map +1 -0
- package/dist/api/dto/TokenResponse.dto.d.ts +12 -0
- package/dist/api/dto/TokenResponse.dto.d.ts.map +1 -0
- package/dist/api/dto/TokenResponse.dto.js +3 -0
- package/dist/api/dto/TokenResponse.dto.js.map +1 -0
- package/dist/api/middlewares/authenticate.d.ts +12 -0
- package/dist/api/middlewares/authenticate.d.ts.map +1 -0
- package/dist/api/middlewares/authenticate.js +141 -0
- package/dist/api/middlewares/authenticate.js.map +1 -0
- package/dist/api/middlewares/errorHandler.d.ts +3 -0
- package/dist/api/middlewares/errorHandler.d.ts.map +1 -0
- package/dist/api/middlewares/errorHandler.js +30 -0
- package/dist/api/middlewares/errorHandler.js.map +1 -0
- package/dist/api/middlewares/rateLimit.d.ts +3 -0
- package/dist/api/middlewares/rateLimit.d.ts.map +1 -0
- package/dist/api/middlewares/rateLimit.js +34 -0
- package/dist/api/middlewares/rateLimit.js.map +1 -0
- package/dist/api/middlewares/validate.d.ts +4 -0
- package/dist/api/middlewares/validate.d.ts.map +1 -0
- package/dist/api/middlewares/validate.js +31 -0
- package/dist/api/middlewares/validate.js.map +1 -0
- package/dist/api/routes/audit.routes.d.ts +5 -0
- package/dist/api/routes/audit.routes.d.ts.map +1 -0
- package/dist/api/routes/audit.routes.js +24 -0
- package/dist/api/routes/audit.routes.js.map +1 -0
- package/dist/api/routes/auth.routes.d.ts +6 -0
- package/dist/api/routes/auth.routes.d.ts.map +1 -0
- package/dist/api/routes/auth.routes.js +22 -0
- package/dist/api/routes/auth.routes.js.map +1 -0
- package/dist/api/routes/export.routes.d.ts +5 -0
- package/dist/api/routes/export.routes.d.ts.map +1 -0
- package/dist/api/routes/export.routes.js +16 -0
- package/dist/api/routes/export.routes.js.map +1 -0
- package/dist/api/routes/health.routes.d.ts +4 -0
- package/dist/api/routes/health.routes.d.ts.map +1 -0
- package/dist/api/routes/health.routes.js +11 -0
- package/dist/api/routes/health.routes.js.map +1 -0
- package/dist/api/routes/index.d.ts +10 -0
- package/dist/api/routes/index.d.ts.map +1 -0
- package/dist/api/routes/index.js +20 -0
- package/dist/api/routes/index.js.map +1 -0
- package/dist/api/routes/providers.routes.d.ts +5 -0
- package/dist/api/routes/providers.routes.d.ts.map +1 -0
- package/dist/api/routes/providers.routes.js +13 -0
- package/dist/api/routes/providers.routes.js.map +1 -0
- package/dist/api/validators/audit.schemas.d.ts +60 -0
- package/dist/api/validators/audit.schemas.d.ts.map +1 -0
- package/dist/api/validators/audit.schemas.js +55 -0
- package/dist/api/validators/audit.schemas.js.map +1 -0
- package/dist/api/validators/auth.schemas.d.ts +17 -0
- package/dist/api/validators/auth.schemas.d.ts.map +1 -0
- package/dist/api/validators/auth.schemas.js +21 -0
- package/dist/api/validators/auth.schemas.js.map +1 -0
- package/dist/app.d.ts +3 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +62 -0
- package/dist/app.js.map +1 -0
- package/dist/config/config.schema.d.ts +65 -0
- package/dist/config/config.schema.d.ts.map +1 -0
- package/dist/config/config.schema.js +95 -0
- package/dist/config/config.schema.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +75 -0
- package/dist/config/index.js.map +1 -0
- package/dist/container.d.ts +47 -0
- package/dist/container.d.ts.map +1 -0
- package/dist/container.js +137 -0
- package/dist/container.js.map +1 -0
- package/dist/data/database.d.ts +13 -0
- package/dist/data/database.d.ts.map +1 -0
- package/dist/data/database.js +68 -0
- package/dist/data/database.js.map +1 -0
- package/dist/data/jobs/token-cleanup.job.d.ts +23 -0
- package/dist/data/jobs/token-cleanup.job.d.ts.map +1 -0
- package/dist/data/jobs/token-cleanup.job.js +96 -0
- package/dist/data/jobs/token-cleanup.job.js.map +1 -0
- package/dist/data/migrations/migration.runner.d.ts +13 -0
- package/dist/data/migrations/migration.runner.d.ts.map +1 -0
- package/dist/data/migrations/migration.runner.js +136 -0
- package/dist/data/migrations/migration.runner.js.map +1 -0
- package/dist/data/models/Token.model.d.ts +30 -0
- package/dist/data/models/Token.model.d.ts.map +1 -0
- package/dist/data/models/Token.model.js +3 -0
- package/dist/data/models/Token.model.js.map +1 -0
- package/dist/data/repositories/token.repository.d.ts +16 -0
- package/dist/data/repositories/token.repository.d.ts.map +1 -0
- package/dist/data/repositories/token.repository.js +97 -0
- package/dist/data/repositories/token.repository.js.map +1 -0
- package/dist/providers/azure/auth.provider.d.ts +5 -0
- package/dist/providers/azure/auth.provider.d.ts.map +1 -0
- package/dist/providers/azure/auth.provider.js +13 -0
- package/dist/providers/azure/auth.provider.js.map +1 -0
- package/dist/providers/azure/azure-errors.d.ts +40 -0
- package/dist/providers/azure/azure-errors.d.ts.map +1 -0
- package/dist/providers/azure/azure-errors.js +121 -0
- package/dist/providers/azure/azure-errors.js.map +1 -0
- package/dist/providers/azure/azure-retry.d.ts +41 -0
- package/dist/providers/azure/azure-retry.d.ts.map +1 -0
- package/dist/providers/azure/azure-retry.js +85 -0
- package/dist/providers/azure/azure-retry.js.map +1 -0
- package/dist/providers/azure/graph-client.d.ts +26 -0
- package/dist/providers/azure/graph-client.d.ts.map +1 -0
- package/dist/providers/azure/graph-client.js +146 -0
- package/dist/providers/azure/graph-client.js.map +1 -0
- package/dist/providers/azure/graph.provider.d.ts +23 -0
- package/dist/providers/azure/graph.provider.d.ts.map +1 -0
- package/dist/providers/azure/graph.provider.js +161 -0
- package/dist/providers/azure/graph.provider.js.map +1 -0
- package/dist/providers/azure/queries/app.queries.d.ts +6 -0
- package/dist/providers/azure/queries/app.queries.d.ts.map +1 -0
- package/dist/providers/azure/queries/app.queries.js +9 -0
- package/dist/providers/azure/queries/app.queries.js.map +1 -0
- package/dist/providers/azure/queries/policy.queries.d.ts +6 -0
- package/dist/providers/azure/queries/policy.queries.d.ts.map +1 -0
- package/dist/providers/azure/queries/policy.queries.js +9 -0
- package/dist/providers/azure/queries/policy.queries.js.map +1 -0
- package/dist/providers/azure/queries/user.queries.d.ts +7 -0
- package/dist/providers/azure/queries/user.queries.d.ts.map +1 -0
- package/dist/providers/azure/queries/user.queries.js +10 -0
- package/dist/providers/azure/queries/user.queries.js.map +1 -0
- package/dist/providers/interfaces/IGraphProvider.d.ts +31 -0
- package/dist/providers/interfaces/IGraphProvider.d.ts.map +1 -0
- package/dist/providers/interfaces/IGraphProvider.js +3 -0
- package/dist/providers/interfaces/IGraphProvider.js.map +1 -0
- package/dist/providers/interfaces/ILDAPProvider.d.ts +37 -0
- package/dist/providers/interfaces/ILDAPProvider.d.ts.map +1 -0
- package/dist/providers/interfaces/ILDAPProvider.js +3 -0
- package/dist/providers/interfaces/ILDAPProvider.js.map +1 -0
- package/dist/providers/ldap/acl-parser.d.ts +8 -0
- package/dist/providers/ldap/acl-parser.d.ts.map +1 -0
- package/dist/providers/ldap/acl-parser.js +157 -0
- package/dist/providers/ldap/acl-parser.js.map +1 -0
- package/dist/providers/ldap/ad-mappers.d.ts +8 -0
- package/dist/providers/ldap/ad-mappers.d.ts.map +1 -0
- package/dist/providers/ldap/ad-mappers.js +162 -0
- package/dist/providers/ldap/ad-mappers.js.map +1 -0
- package/dist/providers/ldap/ldap-client.d.ts +33 -0
- package/dist/providers/ldap/ldap-client.d.ts.map +1 -0
- package/dist/providers/ldap/ldap-client.js +195 -0
- package/dist/providers/ldap/ldap-client.js.map +1 -0
- package/dist/providers/ldap/ldap-errors.d.ts +48 -0
- package/dist/providers/ldap/ldap-errors.d.ts.map +1 -0
- package/dist/providers/ldap/ldap-errors.js +120 -0
- package/dist/providers/ldap/ldap-errors.js.map +1 -0
- package/dist/providers/ldap/ldap-retry.d.ts +14 -0
- package/dist/providers/ldap/ldap-retry.d.ts.map +1 -0
- package/dist/providers/ldap/ldap-retry.js +102 -0
- package/dist/providers/ldap/ldap-retry.js.map +1 -0
- package/dist/providers/ldap/ldap-sanitizer.d.ts +12 -0
- package/dist/providers/ldap/ldap-sanitizer.d.ts.map +1 -0
- package/dist/providers/ldap/ldap-sanitizer.js +104 -0
- package/dist/providers/ldap/ldap-sanitizer.js.map +1 -0
- package/dist/providers/ldap/ldap.provider.d.ts +21 -0
- package/dist/providers/ldap/ldap.provider.d.ts.map +1 -0
- package/dist/providers/ldap/ldap.provider.js +165 -0
- package/dist/providers/ldap/ldap.provider.js.map +1 -0
- package/dist/providers/ldap/queries/computer.queries.d.ts +6 -0
- package/dist/providers/ldap/queries/computer.queries.d.ts.map +1 -0
- package/dist/providers/ldap/queries/computer.queries.js +9 -0
- package/dist/providers/ldap/queries/computer.queries.js.map +1 -0
- package/dist/providers/ldap/queries/group.queries.d.ts +6 -0
- package/dist/providers/ldap/queries/group.queries.d.ts.map +1 -0
- package/dist/providers/ldap/queries/group.queries.js +9 -0
- package/dist/providers/ldap/queries/group.queries.js.map +1 -0
- package/dist/providers/ldap/queries/user.queries.d.ts +7 -0
- package/dist/providers/ldap/queries/user.queries.d.ts.map +1 -0
- package/dist/providers/ldap/queries/user.queries.js +10 -0
- package/dist/providers/ldap/queries/user.queries.js.map +1 -0
- package/dist/providers/smb/smb.provider.d.ts +68 -0
- package/dist/providers/smb/smb.provider.d.ts.map +1 -0
- package/dist/providers/smb/smb.provider.js +382 -0
- package/dist/providers/smb/smb.provider.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +44 -0
- package/dist/server.js.map +1 -0
- package/dist/services/audit/ad-audit.service.d.ts +70 -0
- package/dist/services/audit/ad-audit.service.d.ts.map +1 -0
- package/dist/services/audit/ad-audit.service.js +1019 -0
- package/dist/services/audit/ad-audit.service.js.map +1 -0
- package/dist/services/audit/attack-graph.service.d.ts +62 -0
- package/dist/services/audit/attack-graph.service.d.ts.map +1 -0
- package/dist/services/audit/attack-graph.service.js +702 -0
- package/dist/services/audit/attack-graph.service.js.map +1 -0
- package/dist/services/audit/audit.service.d.ts +4 -0
- package/dist/services/audit/audit.service.d.ts.map +1 -0
- package/dist/services/audit/audit.service.js +10 -0
- package/dist/services/audit/audit.service.js.map +1 -0
- package/dist/services/audit/azure-audit.service.d.ts +37 -0
- package/dist/services/audit/azure-audit.service.d.ts.map +1 -0
- package/dist/services/audit/azure-audit.service.js +153 -0
- package/dist/services/audit/azure-audit.service.js.map +1 -0
- package/dist/services/audit/detectors/ad/accounts.detector.d.ts +37 -0
- package/dist/services/audit/detectors/ad/accounts.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/accounts.detector.js +881 -0
- package/dist/services/audit/detectors/ad/accounts.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/adcs.detector.d.ts +21 -0
- package/dist/services/audit/detectors/ad/adcs.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/adcs.detector.js +227 -0
- package/dist/services/audit/detectors/ad/adcs.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/advanced.detector.d.ts +63 -0
- package/dist/services/audit/detectors/ad/advanced.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/advanced.detector.js +867 -0
- package/dist/services/audit/detectors/ad/advanced.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/attack-paths.detector.d.ts +16 -0
- package/dist/services/audit/detectors/ad/attack-paths.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/attack-paths.detector.js +369 -0
- package/dist/services/audit/detectors/ad/attack-paths.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/compliance.detector.d.ts +28 -0
- package/dist/services/audit/detectors/ad/compliance.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/compliance.detector.js +896 -0
- package/dist/services/audit/detectors/ad/compliance.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/computers.detector.d.ts +30 -0
- package/dist/services/audit/detectors/ad/computers.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/computers.detector.js +799 -0
- package/dist/services/audit/detectors/ad/computers.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/gpo.detector.d.ts +17 -0
- package/dist/services/audit/detectors/ad/gpo.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/gpo.detector.js +257 -0
- package/dist/services/audit/detectors/ad/gpo.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/groups.detector.d.ts +19 -0
- package/dist/services/audit/detectors/ad/groups.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/groups.detector.js +488 -0
- package/dist/services/audit/detectors/ad/groups.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/index.d.ts +15 -0
- package/dist/services/audit/detectors/ad/index.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/index.js +51 -0
- package/dist/services/audit/detectors/ad/index.js.map +1 -0
- package/dist/services/audit/detectors/ad/kerberos.detector.d.ts +17 -0
- package/dist/services/audit/detectors/ad/kerberos.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/kerberos.detector.js +293 -0
- package/dist/services/audit/detectors/ad/kerberos.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/monitoring.detector.d.ts +23 -0
- package/dist/services/audit/detectors/ad/monitoring.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/monitoring.detector.js +328 -0
- package/dist/services/audit/detectors/ad/monitoring.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/network.detector.d.ts +39 -0
- package/dist/services/audit/detectors/ad/network.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/network.detector.js +257 -0
- package/dist/services/audit/detectors/ad/network.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/password.detector.d.ts +14 -0
- package/dist/services/audit/detectors/ad/password.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/password.detector.js +235 -0
- package/dist/services/audit/detectors/ad/password.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/permissions.detector.d.ts +20 -0
- package/dist/services/audit/detectors/ad/permissions.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/permissions.detector.js +392 -0
- package/dist/services/audit/detectors/ad/permissions.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/trusts.detector.d.ts +11 -0
- package/dist/services/audit/detectors/ad/trusts.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/trusts.detector.js +186 -0
- package/dist/services/audit/detectors/ad/trusts.detector.js.map +1 -0
- package/dist/services/audit/detectors/azure/app-security.detector.d.ts +11 -0
- package/dist/services/audit/detectors/azure/app-security.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/azure/app-security.detector.js +184 -0
- package/dist/services/audit/detectors/azure/app-security.detector.js.map +1 -0
- package/dist/services/audit/detectors/azure/conditional-access.detector.d.ts +10 -0
- package/dist/services/audit/detectors/azure/conditional-access.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/azure/conditional-access.detector.js +130 -0
- package/dist/services/audit/detectors/azure/conditional-access.detector.js.map +1 -0
- package/dist/services/audit/detectors/azure/privilege-security.detector.d.ts +8 -0
- package/dist/services/audit/detectors/azure/privilege-security.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/azure/privilege-security.detector.js +113 -0
- package/dist/services/audit/detectors/azure/privilege-security.detector.js.map +1 -0
- package/dist/services/audit/detectors/azure/user-security.detector.d.ts +14 -0
- package/dist/services/audit/detectors/azure/user-security.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/azure/user-security.detector.js +198 -0
- package/dist/services/audit/detectors/azure/user-security.detector.js.map +1 -0
- package/dist/services/audit/detectors/index.d.ts +2 -0
- package/dist/services/audit/detectors/index.d.ts.map +1 -0
- package/dist/services/audit/detectors/index.js +38 -0
- package/dist/services/audit/detectors/index.js.map +1 -0
- package/dist/services/audit/response-formatter.d.ts +176 -0
- package/dist/services/audit/response-formatter.d.ts.map +1 -0
- package/dist/services/audit/response-formatter.js +240 -0
- package/dist/services/audit/response-formatter.js.map +1 -0
- package/dist/services/audit/scoring.service.d.ts +15 -0
- package/dist/services/audit/scoring.service.d.ts.map +1 -0
- package/dist/services/audit/scoring.service.js +139 -0
- package/dist/services/audit/scoring.service.js.map +1 -0
- package/dist/services/auth/crypto.service.d.ts +19 -0
- package/dist/services/auth/crypto.service.d.ts.map +1 -0
- package/dist/services/auth/crypto.service.js +135 -0
- package/dist/services/auth/crypto.service.js.map +1 -0
- package/dist/services/auth/errors.d.ts +19 -0
- package/dist/services/auth/errors.d.ts.map +1 -0
- package/dist/services/auth/errors.js +46 -0
- package/dist/services/auth/errors.js.map +1 -0
- package/dist/services/auth/token.service.d.ts +41 -0
- package/dist/services/auth/token.service.d.ts.map +1 -0
- package/dist/services/auth/token.service.js +208 -0
- package/dist/services/auth/token.service.js.map +1 -0
- package/dist/services/config/config.service.d.ts +6 -0
- package/dist/services/config/config.service.d.ts.map +1 -0
- package/dist/services/config/config.service.js +64 -0
- package/dist/services/config/config.service.js.map +1 -0
- package/dist/services/export/export.service.d.ts +28 -0
- package/dist/services/export/export.service.d.ts.map +1 -0
- package/dist/services/export/export.service.js +28 -0
- package/dist/services/export/export.service.js.map +1 -0
- package/dist/services/export/formatters/csv.formatter.d.ts +8 -0
- package/dist/services/export/formatters/csv.formatter.d.ts.map +1 -0
- package/dist/services/export/formatters/csv.formatter.js +46 -0
- package/dist/services/export/formatters/csv.formatter.js.map +1 -0
- package/dist/services/export/formatters/json.formatter.d.ts +40 -0
- package/dist/services/export/formatters/json.formatter.d.ts.map +1 -0
- package/dist/services/export/formatters/json.formatter.js +58 -0
- package/dist/services/export/formatters/json.formatter.js.map +1 -0
- package/dist/services/jobs/azure-job-runner.d.ts +38 -0
- package/dist/services/jobs/azure-job-runner.d.ts.map +1 -0
- package/dist/services/jobs/azure-job-runner.js +199 -0
- package/dist/services/jobs/azure-job-runner.js.map +1 -0
- package/dist/services/jobs/index.d.ts +4 -0
- package/dist/services/jobs/index.d.ts.map +1 -0
- package/dist/services/jobs/index.js +20 -0
- package/dist/services/jobs/index.js.map +1 -0
- package/dist/services/jobs/job-runner.d.ts +64 -0
- package/dist/services/jobs/job-runner.d.ts.map +1 -0
- package/dist/services/jobs/job-runner.js +952 -0
- package/dist/services/jobs/job-runner.js.map +1 -0
- package/dist/services/jobs/job-store.d.ts +27 -0
- package/dist/services/jobs/job-store.d.ts.map +1 -0
- package/dist/services/jobs/job-store.js +261 -0
- package/dist/services/jobs/job-store.js.map +1 -0
- package/dist/services/jobs/job.types.d.ts +67 -0
- package/dist/services/jobs/job.types.d.ts.map +1 -0
- package/dist/services/jobs/job.types.js +36 -0
- package/dist/services/jobs/job.types.js.map +1 -0
- package/dist/types/ad.types.d.ts +74 -0
- package/dist/types/ad.types.d.ts.map +1 -0
- package/dist/types/ad.types.js +3 -0
- package/dist/types/ad.types.js.map +1 -0
- package/dist/types/adcs.types.d.ts +58 -0
- package/dist/types/adcs.types.d.ts.map +1 -0
- package/dist/types/adcs.types.js +38 -0
- package/dist/types/adcs.types.js.map +1 -0
- package/dist/types/attack-graph.types.d.ts +135 -0
- package/dist/types/attack-graph.types.d.ts.map +1 -0
- package/dist/types/attack-graph.types.js +58 -0
- package/dist/types/attack-graph.types.js.map +1 -0
- package/dist/types/audit.types.d.ts +34 -0
- package/dist/types/audit.types.d.ts.map +1 -0
- package/dist/types/audit.types.js +3 -0
- package/dist/types/audit.types.js.map +1 -0
- package/dist/types/azure.types.d.ts +61 -0
- package/dist/types/azure.types.d.ts.map +1 -0
- package/dist/types/azure.types.js +3 -0
- package/dist/types/azure.types.js.map +1 -0
- package/dist/types/config.types.d.ts +63 -0
- package/dist/types/config.types.d.ts.map +1 -0
- package/dist/types/config.types.js +3 -0
- package/dist/types/config.types.js.map +1 -0
- package/dist/types/error.types.d.ts +33 -0
- package/dist/types/error.types.d.ts.map +1 -0
- package/dist/types/error.types.js +70 -0
- package/dist/types/error.types.js.map +1 -0
- package/dist/types/finding.types.d.ts +133 -0
- package/dist/types/finding.types.d.ts.map +1 -0
- package/dist/types/finding.types.js +3 -0
- package/dist/types/finding.types.js.map +1 -0
- package/dist/types/gpo.types.d.ts +39 -0
- package/dist/types/gpo.types.d.ts.map +1 -0
- package/dist/types/gpo.types.js +15 -0
- package/dist/types/gpo.types.js.map +1 -0
- package/dist/types/token.types.d.ts +26 -0
- package/dist/types/token.types.d.ts.map +1 -0
- package/dist/types/token.types.js +3 -0
- package/dist/types/token.types.js.map +1 -0
- package/dist/types/trust.types.d.ts +45 -0
- package/dist/types/trust.types.d.ts.map +1 -0
- package/dist/types/trust.types.js +71 -0
- package/dist/types/trust.types.js.map +1 -0
- package/dist/utils/entity-converter.d.ts +17 -0
- package/dist/utils/entity-converter.d.ts.map +1 -0
- package/dist/utils/entity-converter.js +285 -0
- package/dist/utils/entity-converter.js.map +1 -0
- package/dist/utils/graph.util.d.ts +66 -0
- package/dist/utils/graph.util.d.ts.map +1 -0
- package/dist/utils/graph.util.js +382 -0
- package/dist/utils/graph.util.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +86 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/type-name-normalizer.d.ts +5 -0
- package/dist/utils/type-name-normalizer.d.ts.map +1 -0
- package/dist/utils/type-name-normalizer.js +218 -0
- package/dist/utils/type-name-normalizer.js.map +1 -0
- package/docker-compose.yml +26 -0
- package/docs/api/README.md +178 -0
- package/docs/api/openapi.yaml +1524 -0
- package/eslint.config.js +54 -0
- package/jest.config.js +38 -0
- package/package.json +97 -0
- package/scripts/fetch-ad-cert.sh +142 -0
- package/src/.gitkeep +0 -0
- package/src/api/.gitkeep +0 -0
- package/src/api/controllers/.gitkeep +0 -0
- package/src/api/controllers/audit.controller.ts +313 -0
- package/src/api/controllers/auth.controller.ts +258 -0
- package/src/api/controllers/export.controller.ts +153 -0
- package/src/api/controllers/health.controller.ts +16 -0
- package/src/api/controllers/jobs.controller.ts +187 -0
- package/src/api/controllers/providers.controller.ts +165 -0
- package/src/api/dto/.gitkeep +0 -0
- package/src/api/dto/AuditRequest.dto.ts +8 -0
- package/src/api/dto/AuditResponse.dto.ts +19 -0
- package/src/api/dto/TokenRequest.dto.ts +8 -0
- package/src/api/dto/TokenResponse.dto.ts +14 -0
- package/src/api/middlewares/.gitkeep +0 -0
- package/src/api/middlewares/authenticate.ts +203 -0
- package/src/api/middlewares/errorHandler.ts +54 -0
- package/src/api/middlewares/rateLimit.ts +35 -0
- package/src/api/middlewares/validate.ts +32 -0
- package/src/api/routes/.gitkeep +0 -0
- package/src/api/routes/audit.routes.ts +77 -0
- package/src/api/routes/auth.routes.ts +71 -0
- package/src/api/routes/export.routes.ts +34 -0
- package/src/api/routes/health.routes.ts +14 -0
- package/src/api/routes/index.ts +40 -0
- package/src/api/routes/providers.routes.ts +24 -0
- package/src/api/validators/.gitkeep +0 -0
- package/src/api/validators/audit.schemas.ts +59 -0
- package/src/api/validators/auth.schemas.ts +59 -0
- package/src/app.ts +87 -0
- package/src/config/.gitkeep +0 -0
- package/src/config/config.schema.ts +108 -0
- package/src/config/index.ts +82 -0
- package/src/container.ts +221 -0
- package/src/data/.gitkeep +0 -0
- package/src/data/database.ts +78 -0
- package/src/data/jobs/token-cleanup.job.ts +166 -0
- package/src/data/migrations/.gitkeep +0 -0
- package/src/data/migrations/001_initial_schema.sql +47 -0
- package/src/data/migrations/migration.runner.ts +125 -0
- package/src/data/models/.gitkeep +0 -0
- package/src/data/models/Token.model.ts +35 -0
- package/src/data/repositories/.gitkeep +0 -0
- package/src/data/repositories/token.repository.ts +160 -0
- package/src/providers/.gitkeep +0 -0
- package/src/providers/azure/.gitkeep +0 -0
- package/src/providers/azure/auth.provider.ts +14 -0
- package/src/providers/azure/azure-errors.ts +189 -0
- package/src/providers/azure/azure-retry.ts +168 -0
- package/src/providers/azure/graph-client.ts +315 -0
- package/src/providers/azure/graph.provider.ts +294 -0
- package/src/providers/azure/queries/app.queries.ts +9 -0
- package/src/providers/azure/queries/policy.queries.ts +9 -0
- package/src/providers/azure/queries/user.queries.ts +10 -0
- package/src/providers/interfaces/.gitkeep +0 -0
- package/src/providers/interfaces/IGraphProvider.ts +117 -0
- package/src/providers/interfaces/ILDAPProvider.ts +142 -0
- package/src/providers/ldap/.gitkeep +0 -0
- package/src/providers/ldap/acl-parser.ts +231 -0
- package/src/providers/ldap/ad-mappers.ts +280 -0
- package/src/providers/ldap/ldap-client.ts +259 -0
- package/src/providers/ldap/ldap-errors.ts +188 -0
- package/src/providers/ldap/ldap-retry.ts +267 -0
- package/src/providers/ldap/ldap-sanitizer.ts +273 -0
- package/src/providers/ldap/ldap.provider.ts +293 -0
- package/src/providers/ldap/queries/computer.queries.ts +9 -0
- package/src/providers/ldap/queries/group.queries.ts +9 -0
- package/src/providers/ldap/queries/user.queries.ts +10 -0
- package/src/providers/smb/smb.provider.ts +653 -0
- package/src/server.ts +60 -0
- package/src/services/.gitkeep +0 -0
- package/src/services/audit/.gitkeep +0 -0
- package/src/services/audit/ad-audit.service.ts +1481 -0
- package/src/services/audit/attack-graph.service.ts +1104 -0
- package/src/services/audit/audit.service.ts +12 -0
- package/src/services/audit/azure-audit.service.ts +286 -0
- package/src/services/audit/detectors/ad/accounts.detector.ts +1232 -0
- package/src/services/audit/detectors/ad/adcs.detector.ts +449 -0
- package/src/services/audit/detectors/ad/advanced.detector.ts +1270 -0
- package/src/services/audit/detectors/ad/attack-paths.detector.ts +600 -0
- package/src/services/audit/detectors/ad/compliance.detector.ts +1421 -0
- package/src/services/audit/detectors/ad/computers.detector.ts +1188 -0
- package/src/services/audit/detectors/ad/gpo.detector.ts +485 -0
- package/src/services/audit/detectors/ad/groups.detector.ts +685 -0
- package/src/services/audit/detectors/ad/index.ts +84 -0
- package/src/services/audit/detectors/ad/kerberos.detector.ts +424 -0
- package/src/services/audit/detectors/ad/monitoring.detector.ts +501 -0
- package/src/services/audit/detectors/ad/network.detector.ts +538 -0
- package/src/services/audit/detectors/ad/password.detector.ts +324 -0
- package/src/services/audit/detectors/ad/permissions.detector.ts +637 -0
- package/src/services/audit/detectors/ad/trusts.detector.ts +315 -0
- package/src/services/audit/detectors/azure/app-security.detector.ts +246 -0
- package/src/services/audit/detectors/azure/conditional-access.detector.ts +186 -0
- package/src/services/audit/detectors/azure/privilege-security.detector.ts +176 -0
- package/src/services/audit/detectors/azure/user-security.detector.ts +280 -0
- package/src/services/audit/detectors/index.ts +18 -0
- package/src/services/audit/response-formatter.ts +604 -0
- package/src/services/audit/scoring.service.ts +234 -0
- package/src/services/auth/.gitkeep +0 -0
- package/src/services/auth/crypto.service.ts +230 -0
- package/src/services/auth/errors.ts +47 -0
- package/src/services/auth/token.service.ts +420 -0
- package/src/services/config/.gitkeep +0 -0
- package/src/services/config/config.service.ts +75 -0
- package/src/services/export/.gitkeep +0 -0
- package/src/services/export/export.service.ts +99 -0
- package/src/services/export/formatters/csv.formatter.ts +124 -0
- package/src/services/export/formatters/json.formatter.ts +160 -0
- package/src/services/jobs/azure-job-runner.ts +312 -0
- package/src/services/jobs/index.ts +9 -0
- package/src/services/jobs/job-runner.ts +1280 -0
- package/src/services/jobs/job-store.ts +384 -0
- package/src/services/jobs/job.types.ts +182 -0
- package/src/types/.gitkeep +0 -0
- package/src/types/ad.types.ts +91 -0
- package/src/types/adcs.types.ts +107 -0
- package/src/types/attack-graph.types.ts +260 -0
- package/src/types/audit.types.ts +42 -0
- package/src/types/azure.types.ts +68 -0
- package/src/types/config.types.ts +79 -0
- package/src/types/error.types.ts +69 -0
- package/src/types/finding.types.ts +284 -0
- package/src/types/gpo.types.ts +72 -0
- package/src/types/smb2.d.ts +73 -0
- package/src/types/token.types.ts +32 -0
- package/src/types/trust.types.ts +140 -0
- package/src/utils/.gitkeep +0 -0
- package/src/utils/entity-converter.ts +453 -0
- package/src/utils/graph.util.ts +609 -0
- package/src/utils/logger.ts +111 -0
- package/src/utils/type-name-normalizer.ts +302 -0
- package/tests/.gitkeep +0 -0
- package/tests/e2e/.gitkeep +0 -0
- package/tests/fixtures/.gitkeep +0 -0
- package/tests/integration/.gitkeep +0 -0
- package/tests/integration/README.md +156 -0
- package/tests/integration/ad-audit.integration.test.ts +216 -0
- package/tests/integration/api/.gitkeep +0 -0
- package/tests/integration/api/endpoints.integration.test.ts +431 -0
- package/tests/integration/auth/jwt-authentication.integration.test.ts +358 -0
- package/tests/integration/providers/.gitkeep +0 -0
- package/tests/integration/providers/azure-basic.integration.test.ts +167 -0
- package/tests/integration/providers/ldap-basic.integration.test.ts +152 -0
- package/tests/integration/providers/ldap-connectivity.test.ts +44 -0
- package/tests/integration/providers/ldap-provider.integration.test.ts +347 -0
- package/tests/mocks/.gitkeep +0 -0
- package/tests/setup.ts +16 -0
- package/tests/unit/.gitkeep +0 -0
- package/tests/unit/api/middlewares/authenticate.test.ts +446 -0
- package/tests/unit/providers/.gitkeep +0 -0
- package/tests/unit/providers/azure/azure-errors.test.ts +193 -0
- package/tests/unit/providers/azure/azure-retry.test.ts +254 -0
- package/tests/unit/providers/azure/graph-provider.test.ts +313 -0
- package/tests/unit/providers/ldap/ad-mappers.test.ts +392 -0
- package/tests/unit/providers/ldap/ldap-provider.test.ts +376 -0
- package/tests/unit/providers/ldap/ldap-retry.test.ts +377 -0
- package/tests/unit/providers/ldap/ldap-sanitizer.test.ts +301 -0
- package/tests/unit/sample.test.ts +19 -0
- package/tests/unit/services/.gitkeep +0 -0
- package/tests/unit/services/audit/detectors/ad/accounts.detector.test.ts +393 -0
- package/tests/unit/services/audit/detectors/ad/advanced.detector.test.ts +380 -0
- package/tests/unit/services/audit/detectors/ad/computers.detector.test.ts +440 -0
- package/tests/unit/services/audit/detectors/ad/groups.detector.test.ts +276 -0
- package/tests/unit/services/audit/detectors/ad/kerberos.detector.test.ts +215 -0
- package/tests/unit/services/audit/detectors/ad/password.detector.test.ts +226 -0
- package/tests/unit/services/audit/detectors/ad/permissions.detector.test.ts +244 -0
- package/tests/unit/services/audit/detectors/azure/app-security.detector.test.ts +349 -0
- package/tests/unit/services/audit/detectors/azure/conditional-access.detector.test.ts +374 -0
- package/tests/unit/services/audit/detectors/azure/privilege-security.detector.test.ts +374 -0
- package/tests/unit/services/audit/detectors/azure/user-security.detector.test.ts +297 -0
- package/tests/unit/services/auth/crypto.service.test.ts +296 -0
- package/tests/unit/services/auth/token.service.test.ts +579 -0
- package/tests/unit/services/export/export.service.test.ts +241 -0
- package/tests/unit/services/export/formatters/csv.formatter.test.ts +270 -0
- package/tests/unit/services/export/formatters/json.formatter.test.ts +258 -0
- package/tests/unit/utils/.gitkeep +0 -0
- package/tsconfig.json +50 -0
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network Infrastructure Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects network-related security issues in Active Directory:
|
|
5
|
+
* - DNS misconfigurations
|
|
6
|
+
* - Site topology issues
|
|
7
|
+
* - SYSVOL/DFSR problems
|
|
8
|
+
* - Domain Controller health issues
|
|
9
|
+
*
|
|
10
|
+
* Story 1.7: AD Vulnerability Detection Engine
|
|
11
|
+
* Phase 3: Network Infrastructure (12 vulnerabilities)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { ADComputer, ADDomain } from '../../../../types/ad.types';
|
|
15
|
+
import { Finding } from '../../../../types/finding.types';
|
|
16
|
+
import { toAffectedComputerEntities } from '../../../../utils/entity-converter';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* DNS Zone information (simplified)
|
|
20
|
+
*/
|
|
21
|
+
interface DnsZone {
|
|
22
|
+
name: string;
|
|
23
|
+
dn: string;
|
|
24
|
+
zoneType?: number; // 0=cache, 1=primary, 2=secondary, 3=stub, 4=forwarder
|
|
25
|
+
dynamicUpdate?: number; // 0=none, 1=nonsecure, 2=secure, 3=nonsecureAndSecure
|
|
26
|
+
secureSecondaries?: number; // 0=noTransfer, 1=transferToZoneServers, 2=transferToAnyServer
|
|
27
|
+
[key: string]: unknown;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* AD Site information
|
|
32
|
+
*/
|
|
33
|
+
interface ADSite {
|
|
34
|
+
name: string;
|
|
35
|
+
dn: string;
|
|
36
|
+
subnets?: string[];
|
|
37
|
+
servers?: string[];
|
|
38
|
+
[key: string]: unknown;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* AD Subnet information
|
|
43
|
+
*/
|
|
44
|
+
interface ADSubnet {
|
|
45
|
+
name: string;
|
|
46
|
+
dn: string;
|
|
47
|
+
site?: string;
|
|
48
|
+
location?: string;
|
|
49
|
+
[key: string]: unknown;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Detect unrestricted DNS zone transfers
|
|
54
|
+
*
|
|
55
|
+
* DNS zone transfers allowing any server can expose internal DNS data to attackers.
|
|
56
|
+
*
|
|
57
|
+
* @param dnsZones - Array of DNS zones (if available)
|
|
58
|
+
* @param _includeDetails - Whether to include affected entity details
|
|
59
|
+
* @returns Finding for DNS_ZONE_TRANSFER_UNRESTRICTED
|
|
60
|
+
*/
|
|
61
|
+
export function detectDnsZoneTransferUnrestricted(
|
|
62
|
+
dnsZones: DnsZone[],
|
|
63
|
+
_includeDetails: boolean
|
|
64
|
+
): Finding {
|
|
65
|
+
const affected = dnsZones.filter(
|
|
66
|
+
(zone) =>
|
|
67
|
+
zone.secureSecondaries === 2 || // transferToAnyServer
|
|
68
|
+
zone.secureSecondaries === undefined // Not configured (default may be insecure)
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
type: 'DNS_ZONE_TRANSFER_UNRESTRICTED',
|
|
73
|
+
severity: 'high',
|
|
74
|
+
category: 'network',
|
|
75
|
+
title: 'DNS Zone Transfer Unrestricted',
|
|
76
|
+
description:
|
|
77
|
+
'DNS zones allowing zone transfers to any server. Attackers can enumerate DNS records to map internal network topology.',
|
|
78
|
+
count: affected.length,
|
|
79
|
+
affectedEntities: affected.map((z) => z.name),
|
|
80
|
+
details: {
|
|
81
|
+
zones: affected.map((z) => ({
|
|
82
|
+
name: z.name,
|
|
83
|
+
dn: z.dn,
|
|
84
|
+
secureSecondaries: z.secureSecondaries,
|
|
85
|
+
})),
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Detect insecure DNS dynamic updates
|
|
92
|
+
*
|
|
93
|
+
* DNS zones allowing non-secure dynamic updates enable DNS poisoning attacks.
|
|
94
|
+
*
|
|
95
|
+
* @param dnsZones - Array of DNS zones (if available)
|
|
96
|
+
* @param _includeDetails - Whether to include affected entity details
|
|
97
|
+
* @returns Finding for DNS_DYNAMIC_UPDATE_INSECURE
|
|
98
|
+
*/
|
|
99
|
+
export function detectDnsDynamicUpdateInsecure(
|
|
100
|
+
dnsZones: DnsZone[],
|
|
101
|
+
_includeDetails: boolean
|
|
102
|
+
): Finding {
|
|
103
|
+
const affected = dnsZones.filter(
|
|
104
|
+
(zone) =>
|
|
105
|
+
zone.dynamicUpdate === 1 || // nonsecure
|
|
106
|
+
zone.dynamicUpdate === 3 // nonsecureAndSecure
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
return {
|
|
110
|
+
type: 'DNS_DYNAMIC_UPDATE_INSECURE',
|
|
111
|
+
severity: 'high',
|
|
112
|
+
category: 'network',
|
|
113
|
+
title: 'DNS Dynamic Update Insecure',
|
|
114
|
+
description:
|
|
115
|
+
'DNS zones allowing non-secure dynamic updates. Attackers can inject malicious DNS records without authentication.',
|
|
116
|
+
count: affected.length,
|
|
117
|
+
affectedEntities: affected.map((z) => z.name),
|
|
118
|
+
details: {
|
|
119
|
+
zones: affected.map((z) => ({
|
|
120
|
+
name: z.name,
|
|
121
|
+
dn: z.dn,
|
|
122
|
+
dynamicUpdate: z.dynamicUpdate,
|
|
123
|
+
})),
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Detect DNS wildcard records
|
|
130
|
+
*
|
|
131
|
+
* Wildcard DNS records can be abused for MITM attacks and credential capture.
|
|
132
|
+
*
|
|
133
|
+
* @param dnsZones - Array of DNS zones with records (if available)
|
|
134
|
+
* @param _includeDetails - Whether to include affected entity details
|
|
135
|
+
* @returns Finding for DNS_WILDCARD_RECORDS
|
|
136
|
+
*/
|
|
137
|
+
export function detectDnsWildcardRecords(
|
|
138
|
+
_dnsZones: DnsZone[],
|
|
139
|
+
_includeDetails: boolean
|
|
140
|
+
): Finding {
|
|
141
|
+
// This detection would require querying DNS records within zones
|
|
142
|
+
// For now, return empty finding as placeholder
|
|
143
|
+
const affected: DnsZone[] = [];
|
|
144
|
+
|
|
145
|
+
return {
|
|
146
|
+
type: 'DNS_WILDCARD_RECORDS',
|
|
147
|
+
severity: 'medium',
|
|
148
|
+
category: 'network',
|
|
149
|
+
title: 'DNS Wildcard Records Detected',
|
|
150
|
+
description:
|
|
151
|
+
'Wildcard DNS records (*.domain) can be exploited for MITM attacks. Review and remove unnecessary wildcards.',
|
|
152
|
+
count: affected.length,
|
|
153
|
+
affectedEntities: affected.map((z) => z.name),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Detect DNSSEC not enabled
|
|
159
|
+
*
|
|
160
|
+
* Without DNSSEC, DNS responses can be spoofed.
|
|
161
|
+
*
|
|
162
|
+
* @param domain - Domain information
|
|
163
|
+
* @param _includeDetails - Whether to include affected entity details
|
|
164
|
+
* @returns Finding for DNSSEC_NOT_ENABLED
|
|
165
|
+
*/
|
|
166
|
+
export function detectDnssecNotEnabled(
|
|
167
|
+
domain: ADDomain | null,
|
|
168
|
+
_includeDetails: boolean
|
|
169
|
+
): Finding {
|
|
170
|
+
// Check if domain has DNSSEC trust anchors configured
|
|
171
|
+
// This would typically check for dnsroot LDAP object or DNS server config
|
|
172
|
+
const dnssecEnabled = domain && domain['msDS-TrustForestTrustInfo'] !== undefined;
|
|
173
|
+
|
|
174
|
+
return {
|
|
175
|
+
type: 'DNSSEC_NOT_ENABLED',
|
|
176
|
+
severity: 'medium',
|
|
177
|
+
category: 'network',
|
|
178
|
+
title: 'DNSSEC Not Enabled',
|
|
179
|
+
description:
|
|
180
|
+
'DNSSEC is not enabled for the domain. DNS responses can be spoofed, enabling cache poisoning and MITM attacks.',
|
|
181
|
+
count: dnssecEnabled ? 0 : 1,
|
|
182
|
+
details: {
|
|
183
|
+
recommendation: 'Enable DNSSEC signing on Active Directory-integrated DNS zones.',
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Detect NTP not properly configured
|
|
190
|
+
*
|
|
191
|
+
* Improper time synchronization can cause Kerberos authentication failures and security issues.
|
|
192
|
+
*
|
|
193
|
+
* @param domainControllers - Array of domain controllers
|
|
194
|
+
* @param includeDetails - Whether to include affected entity details
|
|
195
|
+
* @returns Finding for NTP_NOT_CONFIGURED
|
|
196
|
+
*/
|
|
197
|
+
export function detectNtpNotConfigured(
|
|
198
|
+
domainControllers: ADComputer[],
|
|
199
|
+
includeDetails: boolean
|
|
200
|
+
): Finding {
|
|
201
|
+
// PDC Emulator should be the authoritative time source
|
|
202
|
+
// Check if DCs have proper time config (would need registry data)
|
|
203
|
+
// For now, check if there are multiple DCs (time sync is critical with multiple DCs)
|
|
204
|
+
const hasSingleDc = domainControllers.length <= 1;
|
|
205
|
+
|
|
206
|
+
return {
|
|
207
|
+
type: 'NTP_NOT_CONFIGURED',
|
|
208
|
+
severity: 'medium',
|
|
209
|
+
category: 'network',
|
|
210
|
+
title: 'NTP Configuration Review Needed',
|
|
211
|
+
description:
|
|
212
|
+
'Time synchronization configuration should be reviewed. The PDC Emulator must be configured as the authoritative time source to prevent Kerberos authentication issues.',
|
|
213
|
+
count: hasSingleDc ? 0 : 1,
|
|
214
|
+
affectedEntities: includeDetails
|
|
215
|
+
? toAffectedComputerEntities(domainControllers)
|
|
216
|
+
: undefined,
|
|
217
|
+
details: {
|
|
218
|
+
dcCount: domainControllers.length,
|
|
219
|
+
recommendation:
|
|
220
|
+
'Configure PDC Emulator as authoritative time source. Other DCs should sync from PDC.',
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Detect site topology issues
|
|
227
|
+
*
|
|
228
|
+
* Sites without subnets or DCs can cause authentication performance issues.
|
|
229
|
+
*
|
|
230
|
+
* @param sites - Array of AD sites
|
|
231
|
+
* @param _includeDetails - Whether to include affected entity details
|
|
232
|
+
* @returns Finding for SITE_TOPOLOGY_ISSUES
|
|
233
|
+
*/
|
|
234
|
+
export function detectSiteTopologyIssues(
|
|
235
|
+
sites: ADSite[],
|
|
236
|
+
_includeDetails: boolean
|
|
237
|
+
): Finding {
|
|
238
|
+
// Sites without servers (DCs) are problematic
|
|
239
|
+
const sitesWithoutDc = sites.filter(
|
|
240
|
+
(site) => !site.servers || site.servers.length === 0
|
|
241
|
+
);
|
|
242
|
+
|
|
243
|
+
return {
|
|
244
|
+
type: 'SITE_TOPOLOGY_ISSUES',
|
|
245
|
+
severity: 'medium',
|
|
246
|
+
category: 'network',
|
|
247
|
+
title: 'AD Site Topology Issues',
|
|
248
|
+
description:
|
|
249
|
+
'Sites without domain controllers cause clients to authenticate against remote DCs, increasing latency and WAN traffic.',
|
|
250
|
+
count: sitesWithoutDc.length,
|
|
251
|
+
affectedEntities: sitesWithoutDc.map((s) => s.name),
|
|
252
|
+
details: {
|
|
253
|
+
sitesWithoutDc: sitesWithoutDc.map((s) => s.name),
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Detect missing subnets
|
|
260
|
+
*
|
|
261
|
+
* Subnets without site assignments cause suboptimal DC selection.
|
|
262
|
+
*
|
|
263
|
+
* @param sites - Array of AD sites
|
|
264
|
+
* @param subnets - Array of AD subnets
|
|
265
|
+
* @param _includeDetails - Whether to include affected entity details
|
|
266
|
+
* @returns Finding for SUBNET_MISSING
|
|
267
|
+
*/
|
|
268
|
+
export function detectSubnetMissing(
|
|
269
|
+
sites: ADSite[],
|
|
270
|
+
subnets: ADSubnet[],
|
|
271
|
+
_includeDetails: boolean
|
|
272
|
+
): Finding {
|
|
273
|
+
// Check for sites without subnets
|
|
274
|
+
const sitesWithoutSubnets = sites.filter((site) => {
|
|
275
|
+
const siteSubnets = subnets.filter((sub) => sub.site === site.dn);
|
|
276
|
+
return siteSubnets.length === 0;
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
return {
|
|
280
|
+
type: 'SUBNET_MISSING',
|
|
281
|
+
severity: 'low',
|
|
282
|
+
category: 'network',
|
|
283
|
+
title: 'AD Sites Missing Subnets',
|
|
284
|
+
description:
|
|
285
|
+
'Sites without subnet definitions. Clients in undefined subnets will select DCs randomly, potentially crossing WAN links.',
|
|
286
|
+
count: sitesWithoutSubnets.length,
|
|
287
|
+
affectedEntities: sitesWithoutSubnets.map((s) => s.name),
|
|
288
|
+
details: {
|
|
289
|
+
totalSites: sites.length,
|
|
290
|
+
totalSubnets: subnets.length,
|
|
291
|
+
sitesWithoutSubnets: sitesWithoutSubnets.map((s) => s.name),
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Detect SYSVOL/NETLOGON permission issues
|
|
298
|
+
*
|
|
299
|
+
* Weak permissions on SYSVOL/NETLOGON shares enable GPO manipulation.
|
|
300
|
+
*
|
|
301
|
+
* @param _domain - Domain information
|
|
302
|
+
* @param _includeDetails - Whether to include affected entity details
|
|
303
|
+
* @returns Finding for SYSVOL_NETLOGON_PERMISSIONS
|
|
304
|
+
*/
|
|
305
|
+
export function detectSysvolNetlogonPermissions(
|
|
306
|
+
_domain: ADDomain | null,
|
|
307
|
+
_includeDetails: boolean
|
|
308
|
+
): Finding {
|
|
309
|
+
// This would require reading SYSVOL share permissions via SMB
|
|
310
|
+
// Placeholder for now
|
|
311
|
+
return {
|
|
312
|
+
type: 'SYSVOL_NETLOGON_PERMISSIONS',
|
|
313
|
+
severity: 'high',
|
|
314
|
+
category: 'network',
|
|
315
|
+
title: 'SYSVOL/NETLOGON Permissions Review',
|
|
316
|
+
description:
|
|
317
|
+
'SYSVOL and NETLOGON share permissions should be audited. Weak permissions allow attackers to modify logon scripts and GPOs.',
|
|
318
|
+
count: 0, // Will be populated when SMB permission reading is implemented
|
|
319
|
+
details: {
|
|
320
|
+
recommendation:
|
|
321
|
+
'Review SYSVOL and NETLOGON share permissions. Only Domain Admins should have write access.',
|
|
322
|
+
},
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Detect DFSR not configured (legacy FRS in use)
|
|
328
|
+
*
|
|
329
|
+
* FRS is deprecated and should be migrated to DFSR.
|
|
330
|
+
*
|
|
331
|
+
* @param domain - Domain information
|
|
332
|
+
* @param _includeDetails - Whether to include affected entity details
|
|
333
|
+
* @returns Finding for DFSR_NOT_CONFIGURED
|
|
334
|
+
*/
|
|
335
|
+
export function detectDfsrNotConfigured(
|
|
336
|
+
domain: ADDomain | null,
|
|
337
|
+
_includeDetails: boolean
|
|
338
|
+
): Finding {
|
|
339
|
+
// Check domain functional level - DFSR requires 2008+ functional level
|
|
340
|
+
const domainLevel = domain?.domainFunctionalLevel ?? 0;
|
|
341
|
+
// Levels: 0=2000, 2=2003, 3=2008, 4=2008R2, 5=2012, 6=2012R2, 7=2016
|
|
342
|
+
|
|
343
|
+
// If level is 2003 or lower, might still be using FRS
|
|
344
|
+
const potentialFrsUse = domainLevel <= 2;
|
|
345
|
+
|
|
346
|
+
return {
|
|
347
|
+
type: 'DFSR_NOT_CONFIGURED',
|
|
348
|
+
severity: potentialFrsUse ? 'medium' : 'low',
|
|
349
|
+
category: 'network',
|
|
350
|
+
title: 'DFSR Migration Status',
|
|
351
|
+
description:
|
|
352
|
+
'FRS (File Replication Service) is deprecated. SYSVOL should be replicated using DFSR (DFS Replication) for better reliability.',
|
|
353
|
+
count: potentialFrsUse ? 1 : 0,
|
|
354
|
+
details: {
|
|
355
|
+
domainFunctionalLevel: domainLevel,
|
|
356
|
+
domainFunctionalLevelName: getDomainLevelName(domainLevel),
|
|
357
|
+
potentialFrsUse,
|
|
358
|
+
recommendation: potentialFrsUse
|
|
359
|
+
? 'Migrate SYSVOL replication from FRS to DFSR using dfsrmig.exe'
|
|
360
|
+
: 'Verify DFSR health with dcdiag /e /test:dfsrevent',
|
|
361
|
+
},
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Detect old domain controller backups
|
|
367
|
+
*
|
|
368
|
+
* DCs without recent backups risk data loss.
|
|
369
|
+
*
|
|
370
|
+
* @param domainControllers - Array of domain controllers
|
|
371
|
+
* @param includeDetails - Whether to include affected entity details
|
|
372
|
+
* @returns Finding for DC_BACKUP_OLD
|
|
373
|
+
*/
|
|
374
|
+
export function detectDcBackupOld(
|
|
375
|
+
domainControllers: ADComputer[],
|
|
376
|
+
includeDetails: boolean
|
|
377
|
+
): Finding {
|
|
378
|
+
// Check lastLogonTimestamp and pwdLastSet as proxy for DC health
|
|
379
|
+
const now = new Date();
|
|
380
|
+
const thirtyDaysAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);
|
|
381
|
+
|
|
382
|
+
const possiblyUnbackedUp = domainControllers.filter((dc) => {
|
|
383
|
+
// If DC hasn't replicated password recently, it might indicate backup issues
|
|
384
|
+
const pwdLastSet = dc.passwordLastSet;
|
|
385
|
+
return pwdLastSet && pwdLastSet < thirtyDaysAgo;
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
return {
|
|
389
|
+
type: 'DC_BACKUP_OLD',
|
|
390
|
+
severity: 'medium',
|
|
391
|
+
category: 'network',
|
|
392
|
+
title: 'Domain Controller Backup Review',
|
|
393
|
+
description:
|
|
394
|
+
'Domain controllers should be backed up regularly. Tombstone lifetime is 180 days - DCs offline longer than this cannot rejoin.',
|
|
395
|
+
count: possiblyUnbackedUp.length,
|
|
396
|
+
affectedEntities: includeDetails
|
|
397
|
+
? toAffectedComputerEntities(possiblyUnbackedUp)
|
|
398
|
+
: undefined,
|
|
399
|
+
details: {
|
|
400
|
+
recommendation:
|
|
401
|
+
'Verify Windows Server Backup or third-party backup solution is configured on all DCs.',
|
|
402
|
+
},
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Detect domain controllers with potential disk space issues
|
|
408
|
+
*
|
|
409
|
+
* Low disk space on DCs can cause replication failures and service outages.
|
|
410
|
+
*
|
|
411
|
+
* @param domainControllers - Array of domain controllers
|
|
412
|
+
* @param _includeDetails - Whether to include affected entity details
|
|
413
|
+
* @returns Finding for DC_DISK_SPACE_LOW
|
|
414
|
+
*/
|
|
415
|
+
export function detectDcDiskSpaceLow(
|
|
416
|
+
domainControllers: ADComputer[],
|
|
417
|
+
_includeDetails: boolean
|
|
418
|
+
): Finding {
|
|
419
|
+
// This would require WMI/CIM queries to check disk space
|
|
420
|
+
// Placeholder detection
|
|
421
|
+
return {
|
|
422
|
+
type: 'DC_DISK_SPACE_LOW',
|
|
423
|
+
severity: 'medium',
|
|
424
|
+
category: 'network',
|
|
425
|
+
title: 'DC Disk Space Monitoring',
|
|
426
|
+
description:
|
|
427
|
+
'Domain controller disk space should be monitored. Low disk space can cause AD database corruption and replication failures.',
|
|
428
|
+
count: 0, // Would be populated with actual disk space checks
|
|
429
|
+
details: {
|
|
430
|
+
dcCount: domainControllers.length,
|
|
431
|
+
recommendation:
|
|
432
|
+
'Monitor DC disk space. NTDS.dit location should have at least 20% free space.',
|
|
433
|
+
},
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* Detect domain controller time sync issues
|
|
439
|
+
*
|
|
440
|
+
* Time synchronization issues cause Kerberos failures.
|
|
441
|
+
*
|
|
442
|
+
* @param domainControllers - Array of domain controllers
|
|
443
|
+
* @param includeDetails - Whether to include affected entity details
|
|
444
|
+
* @returns Finding for DC_TIME_SYNC_ISSUE
|
|
445
|
+
*/
|
|
446
|
+
export function detectDcTimeSyncIssue(
|
|
447
|
+
domainControllers: ADComputer[],
|
|
448
|
+
includeDetails: boolean
|
|
449
|
+
): Finding {
|
|
450
|
+
// Check if any DC has very old lastLogon (might indicate it's offline/out of sync)
|
|
451
|
+
const now = new Date();
|
|
452
|
+
const sevenDaysAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
|
|
453
|
+
|
|
454
|
+
const possibleTimeSyncIssues = domainControllers.filter((dc) => {
|
|
455
|
+
const lastLogon = dc.lastLogon;
|
|
456
|
+
return lastLogon && lastLogon < sevenDaysAgo;
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
return {
|
|
460
|
+
type: 'DC_TIME_SYNC_ISSUE',
|
|
461
|
+
severity: 'high',
|
|
462
|
+
category: 'network',
|
|
463
|
+
title: 'DC Time Synchronization Review',
|
|
464
|
+
description:
|
|
465
|
+
'Domain controllers with potential time sync issues detected. Kerberos requires time difference < 5 minutes.',
|
|
466
|
+
count: possibleTimeSyncIssues.length,
|
|
467
|
+
affectedEntities: includeDetails
|
|
468
|
+
? toAffectedComputerEntities(possibleTimeSyncIssues)
|
|
469
|
+
: undefined,
|
|
470
|
+
details: {
|
|
471
|
+
possibleIssues: possibleTimeSyncIssues.map((dc) => dc.sAMAccountName),
|
|
472
|
+
recommendation:
|
|
473
|
+
'Run "w32tm /query /status" on each DC to verify time configuration.',
|
|
474
|
+
},
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* Helper function to get domain functional level name
|
|
480
|
+
*/
|
|
481
|
+
function getDomainLevelName(level: number): string {
|
|
482
|
+
const levels: Record<number, string> = {
|
|
483
|
+
0: 'Windows 2000',
|
|
484
|
+
1: 'Windows Server 2003 Interim',
|
|
485
|
+
2: 'Windows Server 2003',
|
|
486
|
+
3: 'Windows Server 2008',
|
|
487
|
+
4: 'Windows Server 2008 R2',
|
|
488
|
+
5: 'Windows Server 2012',
|
|
489
|
+
6: 'Windows Server 2012 R2',
|
|
490
|
+
7: 'Windows Server 2016',
|
|
491
|
+
};
|
|
492
|
+
return levels[level] || `Unknown (${level})`;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
/**
|
|
496
|
+
* Detect all network-related vulnerabilities
|
|
497
|
+
*
|
|
498
|
+
* @param computers - Array of AD computers
|
|
499
|
+
* @param domain - Domain information
|
|
500
|
+
* @param domainControllers - Array of domain controllers
|
|
501
|
+
* @param dnsZones - Array of DNS zones (if available)
|
|
502
|
+
* @param sites - Array of AD sites (if available)
|
|
503
|
+
* @param subnets - Array of AD subnets (if available)
|
|
504
|
+
* @param includeDetails - Whether to include affected entity details
|
|
505
|
+
* @returns Array of findings
|
|
506
|
+
*/
|
|
507
|
+
export function detectNetworkVulnerabilities(
|
|
508
|
+
_computers: ADComputer[],
|
|
509
|
+
domain: ADDomain | null,
|
|
510
|
+
domainControllers: ADComputer[],
|
|
511
|
+
dnsZones: DnsZone[] = [],
|
|
512
|
+
sites: ADSite[] = [],
|
|
513
|
+
subnets: ADSubnet[] = [],
|
|
514
|
+
includeDetails: boolean
|
|
515
|
+
): Finding[] {
|
|
516
|
+
const findings: Finding[] = [];
|
|
517
|
+
|
|
518
|
+
// DNS detections
|
|
519
|
+
findings.push(detectDnsZoneTransferUnrestricted(dnsZones, includeDetails));
|
|
520
|
+
findings.push(detectDnsDynamicUpdateInsecure(dnsZones, includeDetails));
|
|
521
|
+
findings.push(detectDnsWildcardRecords(dnsZones, includeDetails));
|
|
522
|
+
findings.push(detectDnssecNotEnabled(domain, includeDetails));
|
|
523
|
+
|
|
524
|
+
// Infrastructure detections
|
|
525
|
+
findings.push(detectNtpNotConfigured(domainControllers, includeDetails));
|
|
526
|
+
findings.push(detectSiteTopologyIssues(sites, includeDetails));
|
|
527
|
+
findings.push(detectSubnetMissing(sites, subnets, includeDetails));
|
|
528
|
+
findings.push(detectSysvolNetlogonPermissions(domain, includeDetails));
|
|
529
|
+
|
|
530
|
+
// DFSR/DC health detections
|
|
531
|
+
findings.push(detectDfsrNotConfigured(domain, includeDetails));
|
|
532
|
+
findings.push(detectDcBackupOld(domainControllers, includeDetails));
|
|
533
|
+
findings.push(detectDcDiskSpaceLow(domainControllers, includeDetails));
|
|
534
|
+
findings.push(detectDcTimeSyncIssue(domainControllers, includeDetails));
|
|
535
|
+
|
|
536
|
+
// Filter out findings with count=0
|
|
537
|
+
return findings.filter((f) => f.count > 0);
|
|
538
|
+
}
|