@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,501 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monitoring and Security Supervision Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects security monitoring gaps and supervision weaknesses in Active Directory.
|
|
5
|
+
* Phase 2B: Monitoring Detection
|
|
6
|
+
*
|
|
7
|
+
* Vulnerabilities detected (8):
|
|
8
|
+
* HIGH (4):
|
|
9
|
+
* - AUDIT_LOGON_EVENTS_DISABLED: Logon events not audited
|
|
10
|
+
* - AUDIT_ACCOUNT_MGMT_DISABLED: Account management not audited
|
|
11
|
+
* - AUDIT_POLICY_CHANGE_DISABLED: Policy changes not audited
|
|
12
|
+
* - ADMIN_AUDIT_BYPASS: Admins can bypass audit
|
|
13
|
+
*
|
|
14
|
+
* MEDIUM (4):
|
|
15
|
+
* - AUDIT_PRIVILEGE_USE_DISABLED: Privilege use not audited
|
|
16
|
+
* - NO_HONEYPOT_ACCOUNTS: No decoy accounts detected
|
|
17
|
+
* - SECURITY_LOG_SIZE_SMALL: Security log size insufficient
|
|
18
|
+
* - NO_PROTECTED_USERS_MONITORING: Protected Users group not used
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { ADUser, ADGroup, ADDomain } from '../../../../types/ad.types';
|
|
22
|
+
import { Finding } from '../../../../types/finding.types';
|
|
23
|
+
import { toAffectedUserEntities } from '../../../../utils/entity-converter';
|
|
24
|
+
import { GpoSecuritySettings } from '../../../../providers/smb/smb.provider';
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Extended GPO settings for monitoring analysis
|
|
28
|
+
*/
|
|
29
|
+
export interface MonitoringGpoSettings extends GpoSecuritySettings {
|
|
30
|
+
/** Event log maximum size settings (in KB) */
|
|
31
|
+
eventLogSettings?: {
|
|
32
|
+
securityLogMaxSize?: number;
|
|
33
|
+
systemLogMaxSize?: number;
|
|
34
|
+
applicationLogMaxSize?: number;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Detect if logon events are not being audited
|
|
40
|
+
* Checks for "Account Logon" and "Logon/Logoff" audit categories
|
|
41
|
+
*/
|
|
42
|
+
export function detectAuditLogonEventsDisabled(
|
|
43
|
+
gpoSettings: GpoSecuritySettings | null,
|
|
44
|
+
domain: ADDomain | null,
|
|
45
|
+
includeDetails: boolean
|
|
46
|
+
): Finding {
|
|
47
|
+
if (gpoSettings?.auditPolicies && gpoSettings.auditPolicies.length > 0) {
|
|
48
|
+
const auditPolicies = gpoSettings.auditPolicies;
|
|
49
|
+
|
|
50
|
+
// Check for logon-related audit categories
|
|
51
|
+
const logonCategories = ['Account Logon', 'Logon/Logoff', 'Logon'];
|
|
52
|
+
const hasLogonAudit = auditPolicies.some(
|
|
53
|
+
(p) => logonCategories.some((cat) => p.category.includes(cat)) && (p.success || p.failure)
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
type: 'AUDIT_LOGON_EVENTS_DISABLED',
|
|
58
|
+
severity: 'high',
|
|
59
|
+
category: 'monitoring',
|
|
60
|
+
title: 'Logon Events Not Audited',
|
|
61
|
+
description:
|
|
62
|
+
'Logon events are not being audited. Failed and successful authentication attempts will not be logged, hindering intrusion detection.',
|
|
63
|
+
count: hasLogonAudit ? 0 : 1,
|
|
64
|
+
affectedEntities: includeDetails && !hasLogonAudit && domain ? [domain.dn] : undefined,
|
|
65
|
+
details: !hasLogonAudit
|
|
66
|
+
? {
|
|
67
|
+
recommendation:
|
|
68
|
+
'Enable "Audit Logon Events" and "Audit Account Logon Events" for both Success and Failure.',
|
|
69
|
+
missingCategories: logonCategories,
|
|
70
|
+
attacksUndetected: [
|
|
71
|
+
'Brute force attacks',
|
|
72
|
+
'Password spraying',
|
|
73
|
+
'Pass-the-hash',
|
|
74
|
+
'Kerberos ticket attacks',
|
|
75
|
+
],
|
|
76
|
+
}
|
|
77
|
+
: undefined,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
type: 'AUDIT_LOGON_EVENTS_DISABLED',
|
|
83
|
+
severity: 'high',
|
|
84
|
+
category: 'monitoring',
|
|
85
|
+
title: 'Logon Audit Configuration Unknown',
|
|
86
|
+
description: 'Unable to determine logon audit configuration. Manual review recommended.',
|
|
87
|
+
count: 0,
|
|
88
|
+
details: {
|
|
89
|
+
note: 'GPO audit settings not available. Check Advanced Audit Policy Configuration manually.',
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Detect if account management events are not being audited
|
|
96
|
+
*/
|
|
97
|
+
export function detectAuditAccountMgmtDisabled(
|
|
98
|
+
gpoSettings: GpoSecuritySettings | null,
|
|
99
|
+
domain: ADDomain | null,
|
|
100
|
+
includeDetails: boolean
|
|
101
|
+
): Finding {
|
|
102
|
+
if (gpoSettings?.auditPolicies && gpoSettings.auditPolicies.length > 0) {
|
|
103
|
+
const auditPolicies = gpoSettings.auditPolicies;
|
|
104
|
+
|
|
105
|
+
const hasAccountMgmtAudit = auditPolicies.some(
|
|
106
|
+
(p) => p.category.includes('Account Management') && (p.success || p.failure)
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
return {
|
|
110
|
+
type: 'AUDIT_ACCOUNT_MGMT_DISABLED',
|
|
111
|
+
severity: 'high',
|
|
112
|
+
category: 'monitoring',
|
|
113
|
+
title: 'Account Management Not Audited',
|
|
114
|
+
description:
|
|
115
|
+
'Account management events are not being audited. User/group creation, modification, and deletion will not be logged.',
|
|
116
|
+
count: hasAccountMgmtAudit ? 0 : 1,
|
|
117
|
+
affectedEntities: includeDetails && !hasAccountMgmtAudit && domain ? [domain.dn] : undefined,
|
|
118
|
+
details: !hasAccountMgmtAudit
|
|
119
|
+
? {
|
|
120
|
+
recommendation: 'Enable "Audit Account Management" for both Success and Failure.',
|
|
121
|
+
attacksUndetected: [
|
|
122
|
+
'Unauthorized account creation',
|
|
123
|
+
'Privilege escalation via group membership',
|
|
124
|
+
'Backdoor accounts',
|
|
125
|
+
'Account takeover',
|
|
126
|
+
],
|
|
127
|
+
}
|
|
128
|
+
: undefined,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return {
|
|
133
|
+
type: 'AUDIT_ACCOUNT_MGMT_DISABLED',
|
|
134
|
+
severity: 'high',
|
|
135
|
+
category: 'monitoring',
|
|
136
|
+
title: 'Account Management Audit Configuration Unknown',
|
|
137
|
+
description: 'Unable to determine account management audit configuration.',
|
|
138
|
+
count: 0,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Detect if policy change events are not being audited
|
|
144
|
+
*/
|
|
145
|
+
export function detectAuditPolicyChangeDisabled(
|
|
146
|
+
gpoSettings: GpoSecuritySettings | null,
|
|
147
|
+
domain: ADDomain | null,
|
|
148
|
+
includeDetails: boolean
|
|
149
|
+
): Finding {
|
|
150
|
+
if (gpoSettings?.auditPolicies && gpoSettings.auditPolicies.length > 0) {
|
|
151
|
+
const auditPolicies = gpoSettings.auditPolicies;
|
|
152
|
+
|
|
153
|
+
const hasPolicyChangeAudit = auditPolicies.some(
|
|
154
|
+
(p) => p.category.includes('Policy Change') && (p.success || p.failure)
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
return {
|
|
158
|
+
type: 'AUDIT_POLICY_CHANGE_DISABLED',
|
|
159
|
+
severity: 'high',
|
|
160
|
+
category: 'monitoring',
|
|
161
|
+
title: 'Policy Changes Not Audited',
|
|
162
|
+
description:
|
|
163
|
+
'Policy change events are not being audited. GPO modifications and security policy changes will not be logged.',
|
|
164
|
+
count: hasPolicyChangeAudit ? 0 : 1,
|
|
165
|
+
affectedEntities: includeDetails && !hasPolicyChangeAudit && domain ? [domain.dn] : undefined,
|
|
166
|
+
details: !hasPolicyChangeAudit
|
|
167
|
+
? {
|
|
168
|
+
recommendation: 'Enable "Audit Policy Change" for both Success and Failure.',
|
|
169
|
+
attacksUndetected: [
|
|
170
|
+
'GPO poisoning',
|
|
171
|
+
'Security policy weakening',
|
|
172
|
+
'Audit policy tampering',
|
|
173
|
+
'Firewall rule modifications',
|
|
174
|
+
],
|
|
175
|
+
}
|
|
176
|
+
: undefined,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return {
|
|
181
|
+
type: 'AUDIT_POLICY_CHANGE_DISABLED',
|
|
182
|
+
severity: 'high',
|
|
183
|
+
category: 'monitoring',
|
|
184
|
+
title: 'Policy Change Audit Configuration Unknown',
|
|
185
|
+
description: 'Unable to determine policy change audit configuration.',
|
|
186
|
+
count: 0,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Detect if privilege use is not being audited
|
|
192
|
+
*/
|
|
193
|
+
export function detectAuditPrivilegeUseDisabled(
|
|
194
|
+
gpoSettings: GpoSecuritySettings | null,
|
|
195
|
+
domain: ADDomain | null,
|
|
196
|
+
includeDetails: boolean
|
|
197
|
+
): Finding {
|
|
198
|
+
if (gpoSettings?.auditPolicies && gpoSettings.auditPolicies.length > 0) {
|
|
199
|
+
const auditPolicies = gpoSettings.auditPolicies;
|
|
200
|
+
|
|
201
|
+
const hasPrivilegeUseAudit = auditPolicies.some(
|
|
202
|
+
(p) => p.category.includes('Privilege Use') && (p.success || p.failure)
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
return {
|
|
206
|
+
type: 'AUDIT_PRIVILEGE_USE_DISABLED',
|
|
207
|
+
severity: 'medium',
|
|
208
|
+
category: 'monitoring',
|
|
209
|
+
title: 'Privilege Use Not Audited',
|
|
210
|
+
description:
|
|
211
|
+
'Privilege use events are not being audited. Sensitive privilege usage will not be logged.',
|
|
212
|
+
count: hasPrivilegeUseAudit ? 0 : 1,
|
|
213
|
+
affectedEntities: includeDetails && !hasPrivilegeUseAudit && domain ? [domain.dn] : undefined,
|
|
214
|
+
details: !hasPrivilegeUseAudit
|
|
215
|
+
? {
|
|
216
|
+
recommendation: 'Enable "Audit Privilege Use" for Failure events at minimum.',
|
|
217
|
+
attacksUndetected: [
|
|
218
|
+
'Privilege abuse',
|
|
219
|
+
'SeDebugPrivilege exploitation',
|
|
220
|
+
'Token manipulation',
|
|
221
|
+
'Impersonation attacks',
|
|
222
|
+
],
|
|
223
|
+
}
|
|
224
|
+
: undefined,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return {
|
|
229
|
+
type: 'AUDIT_PRIVILEGE_USE_DISABLED',
|
|
230
|
+
severity: 'medium',
|
|
231
|
+
category: 'monitoring',
|
|
232
|
+
title: 'Privilege Use Audit Configuration Unknown',
|
|
233
|
+
description: 'Unable to determine privilege use audit configuration.',
|
|
234
|
+
count: 0,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Detect absence of honeypot/decoy accounts
|
|
240
|
+
* Honeypots help detect attackers early during enumeration
|
|
241
|
+
*/
|
|
242
|
+
export function detectNoHoneypotAccounts(users: ADUser[], _includeDetails: boolean): Finding {
|
|
243
|
+
const honeypotPatterns = ['honeypot', 'decoy', 'trap', 'canary', 'bait', 'fake'];
|
|
244
|
+
const attractivePatterns = ['svc_', 'admin_backup', 'admin_old', 'sa_', 'sqlsvc', 'backup_admin'];
|
|
245
|
+
|
|
246
|
+
// Find explicit honeypot accounts
|
|
247
|
+
const honeypots = users.filter((u) => {
|
|
248
|
+
const rawDesc = u.description;
|
|
249
|
+
const desc = (typeof rawDesc === 'string' ? rawDesc : '').toLowerCase();
|
|
250
|
+
const name = (u.sAMAccountName || '').toLowerCase();
|
|
251
|
+
return honeypotPatterns.some((p) => desc.includes(p) || name.includes(p));
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
// Find potential bait accounts (attractive names, never used)
|
|
255
|
+
const potentialBaits = users.filter((u) => {
|
|
256
|
+
const name = (u.sAMAccountName || '').toLowerCase();
|
|
257
|
+
const hasAttractiveNaming = attractivePatterns.some((p) => name.includes(p));
|
|
258
|
+
const neverLoggedIn = !u.lastLogon;
|
|
259
|
+
const isEnabled = u.enabled;
|
|
260
|
+
return hasAttractiveNaming && neverLoggedIn && isEnabled;
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
const hasHoneypots = honeypots.length > 0 || potentialBaits.length >= 2;
|
|
264
|
+
|
|
265
|
+
return {
|
|
266
|
+
type: 'NO_HONEYPOT_ACCOUNTS',
|
|
267
|
+
severity: 'medium',
|
|
268
|
+
category: 'monitoring',
|
|
269
|
+
title: 'No Honeypot/Decoy Accounts Detected',
|
|
270
|
+
description:
|
|
271
|
+
'No honeypot or decoy accounts detected in the directory. These accounts help detect attackers during enumeration phase.',
|
|
272
|
+
count: hasHoneypots ? 0 : 1,
|
|
273
|
+
affectedEntities: undefined, // No affected entities - this is a missing control
|
|
274
|
+
details: hasHoneypots
|
|
275
|
+
? {
|
|
276
|
+
honeypotCount: honeypots.length,
|
|
277
|
+
potentialBaitCount: potentialBaits.length,
|
|
278
|
+
status: 'Honeypot accounts detected',
|
|
279
|
+
}
|
|
280
|
+
: {
|
|
281
|
+
recommendation:
|
|
282
|
+
'Create honeypot accounts with attractive names (e.g., svc_backup, admin_old) and monitor for any usage.',
|
|
283
|
+
benefits: [
|
|
284
|
+
'Early detection of attacker enumeration',
|
|
285
|
+
'Detect credential stuffing attempts',
|
|
286
|
+
'Alert on lateral movement',
|
|
287
|
+
],
|
|
288
|
+
implementationGuide:
|
|
289
|
+
'Create accounts with attractive names but no real permissions. Alert on any authentication attempt.',
|
|
290
|
+
},
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Detect if admins can bypass audit
|
|
296
|
+
* Checks for accounts with SeAuditPrivilege or audit bypass capabilities
|
|
297
|
+
*/
|
|
298
|
+
export function detectAdminAuditBypass(
|
|
299
|
+
users: ADUser[],
|
|
300
|
+
_domain: ADDomain | null,
|
|
301
|
+
includeDetails: boolean
|
|
302
|
+
): Finding {
|
|
303
|
+
// Find users with adminCount=1 who are not in Protected Users
|
|
304
|
+
// These admins may have the ability to manipulate audit logs
|
|
305
|
+
const adminUsers = users.filter((u) => u.adminCount === 1 && u.enabled);
|
|
306
|
+
|
|
307
|
+
// Check for users not in Protected Users group
|
|
308
|
+
const protectedUsersPattern = /protected users/i;
|
|
309
|
+
const adminsNotProtected = adminUsers.filter((u) => {
|
|
310
|
+
const memberOf = u['memberOf'] as string[] | undefined;
|
|
311
|
+
if (!memberOf) return true;
|
|
312
|
+
return !memberOf.some((g) => protectedUsersPattern.test(g));
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
// Check for specific concerning patterns
|
|
316
|
+
const auditBypassRisk = adminsNotProtected.filter((u) => {
|
|
317
|
+
// Admins with old passwords are higher risk (may be compromised)
|
|
318
|
+
const pwdAge = u.pwdLastSet ? Date.now() - new Date(u.pwdLastSet).getTime() : Infinity;
|
|
319
|
+
const pwdAgeMonths = pwdAge / (1000 * 60 * 60 * 24 * 30);
|
|
320
|
+
return pwdAgeMonths > 6; // Password older than 6 months
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
const hasRisk = auditBypassRisk.length > 0;
|
|
324
|
+
|
|
325
|
+
return {
|
|
326
|
+
type: 'ADMIN_AUDIT_BYPASS',
|
|
327
|
+
severity: 'high',
|
|
328
|
+
category: 'monitoring',
|
|
329
|
+
title: 'Administrators Can Bypass Audit',
|
|
330
|
+
description:
|
|
331
|
+
'Privileged accounts not in Protected Users group with old passwords may bypass audit controls.',
|
|
332
|
+
count: auditBypassRisk.length,
|
|
333
|
+
affectedEntities: includeDetails ? toAffectedUserEntities(auditBypassRisk) : undefined,
|
|
334
|
+
details: hasRisk
|
|
335
|
+
? {
|
|
336
|
+
totalAdmins: adminUsers.length,
|
|
337
|
+
adminsNotProtected: adminsNotProtected.length,
|
|
338
|
+
adminsWithOldPasswords: auditBypassRisk.length,
|
|
339
|
+
recommendation:
|
|
340
|
+
'Add admin accounts to Protected Users group and enforce regular password rotation.',
|
|
341
|
+
risks: [
|
|
342
|
+
'Admins can clear security logs',
|
|
343
|
+
'Compromised admin credentials may evade detection',
|
|
344
|
+
'Audit policies may be disabled by compromised admin',
|
|
345
|
+
],
|
|
346
|
+
}
|
|
347
|
+
: undefined,
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Detect if security log size is too small
|
|
353
|
+
* Small logs mean events are overwritten quickly, losing forensic data
|
|
354
|
+
*/
|
|
355
|
+
export function detectSecurityLogSizeSmall(
|
|
356
|
+
gpoSettings: MonitoringGpoSettings | null,
|
|
357
|
+
domain: ADDomain | null,
|
|
358
|
+
includeDetails: boolean
|
|
359
|
+
): Finding {
|
|
360
|
+
const MINIMUM_LOG_SIZE_KB = 128 * 1024; // 128 MB minimum recommended
|
|
361
|
+
|
|
362
|
+
if (gpoSettings?.eventLogSettings?.securityLogMaxSize !== undefined) {
|
|
363
|
+
const logSize = gpoSettings.eventLogSettings.securityLogMaxSize;
|
|
364
|
+
const isTooSmall = logSize < MINIMUM_LOG_SIZE_KB;
|
|
365
|
+
|
|
366
|
+
return {
|
|
367
|
+
type: 'SECURITY_LOG_SIZE_SMALL',
|
|
368
|
+
severity: 'medium',
|
|
369
|
+
category: 'monitoring',
|
|
370
|
+
title: 'Security Log Size Insufficient',
|
|
371
|
+
description: `Security event log maximum size is ${Math.round(logSize / 1024)} MB. Small logs cause events to be overwritten quickly, losing forensic data.`,
|
|
372
|
+
count: isTooSmall ? 1 : 0,
|
|
373
|
+
affectedEntities: includeDetails && isTooSmall && domain ? [domain.dn] : undefined,
|
|
374
|
+
details: isTooSmall
|
|
375
|
+
? {
|
|
376
|
+
currentSizeKB: logSize,
|
|
377
|
+
currentSizeMB: Math.round(logSize / 1024),
|
|
378
|
+
recommendedSizeKB: MINIMUM_LOG_SIZE_KB,
|
|
379
|
+
recommendedSizeMB: Math.round(MINIMUM_LOG_SIZE_KB / 1024),
|
|
380
|
+
recommendation: 'Increase Security log maximum size to at least 128 MB via GPO.',
|
|
381
|
+
risks: [
|
|
382
|
+
'Critical events may be lost due to log rotation',
|
|
383
|
+
'Incident response hampered by missing events',
|
|
384
|
+
'Compliance violations for log retention requirements',
|
|
385
|
+
],
|
|
386
|
+
}
|
|
387
|
+
: undefined,
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
// Return informational finding if we can't determine log size
|
|
392
|
+
// Don't count as a vulnerability since we can't verify
|
|
393
|
+
return {
|
|
394
|
+
type: 'SECURITY_LOG_SIZE_SMALL',
|
|
395
|
+
severity: 'medium',
|
|
396
|
+
category: 'monitoring',
|
|
397
|
+
title: 'Security Log Size Configuration Unknown',
|
|
398
|
+
description: 'Unable to determine security event log size configuration.',
|
|
399
|
+
count: 0,
|
|
400
|
+
details: {
|
|
401
|
+
note: 'GPO event log settings not available. Verify Security log maximum size manually.',
|
|
402
|
+
recommendedSizeMB: Math.round(MINIMUM_LOG_SIZE_KB / 1024),
|
|
403
|
+
},
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Detect if Protected Users group is not being used
|
|
409
|
+
* Protected Users provides additional protections for privileged accounts
|
|
410
|
+
*/
|
|
411
|
+
export function detectNoProtectedUsersMonitoring(
|
|
412
|
+
users: ADUser[],
|
|
413
|
+
groups: ADGroup[],
|
|
414
|
+
includeDetails: boolean
|
|
415
|
+
): Finding {
|
|
416
|
+
// Find the Protected Users group
|
|
417
|
+
const protectedUsersGroup = groups.find((g) => {
|
|
418
|
+
const name = (g.sAMAccountName || g.displayName || '').toLowerCase();
|
|
419
|
+
return name === 'protected users' || g.dn.toLowerCase().includes('cn=protected users');
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
// Get privileged users who should be in Protected Users
|
|
423
|
+
const privilegedUsers = users.filter((u) => u.adminCount === 1 && u.enabled);
|
|
424
|
+
|
|
425
|
+
// Check which privileged users are NOT in Protected Users
|
|
426
|
+
const notInProtectedUsers = privilegedUsers.filter((u) => {
|
|
427
|
+
const memberOf = u['memberOf'] as string[] | undefined;
|
|
428
|
+
if (!memberOf) return true;
|
|
429
|
+
|
|
430
|
+
// Check if any membership is Protected Users
|
|
431
|
+
return !memberOf.some(
|
|
432
|
+
(g) =>
|
|
433
|
+
g.toLowerCase().includes('cn=protected users') ||
|
|
434
|
+
(protectedUsersGroup && g.toLowerCase() === protectedUsersGroup.dn.toLowerCase())
|
|
435
|
+
);
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
// If no Protected Users group found or it's empty
|
|
439
|
+
const groupExists = protectedUsersGroup !== undefined;
|
|
440
|
+
const groupMemberCount = protectedUsersGroup?.member?.length ?? 0;
|
|
441
|
+
|
|
442
|
+
return {
|
|
443
|
+
type: 'NO_PROTECTED_USERS_MONITORING',
|
|
444
|
+
severity: 'medium',
|
|
445
|
+
category: 'monitoring',
|
|
446
|
+
title: 'Protected Users Group Not Utilized',
|
|
447
|
+
description:
|
|
448
|
+
'Privileged accounts are not members of the Protected Users group. This group provides additional protections against credential theft.',
|
|
449
|
+
count: notInProtectedUsers.length,
|
|
450
|
+
affectedEntities: includeDetails ? toAffectedUserEntities(notInProtectedUsers) : undefined,
|
|
451
|
+
details: {
|
|
452
|
+
groupExists,
|
|
453
|
+
currentMembers: groupMemberCount,
|
|
454
|
+
totalPrivilegedAccounts: privilegedUsers.length,
|
|
455
|
+
notInGroup: notInProtectedUsers.length,
|
|
456
|
+
protections: [
|
|
457
|
+
'NTLM authentication disabled',
|
|
458
|
+
'Kerberos DES/RC4 encryption disabled',
|
|
459
|
+
'Kerberos TGT lifetime reduced to 4 hours',
|
|
460
|
+
'Credential delegation disabled',
|
|
461
|
+
'Cached credentials not stored',
|
|
462
|
+
],
|
|
463
|
+
recommendation:
|
|
464
|
+
'Add all privileged/admin accounts to Protected Users group for enhanced credential protection.',
|
|
465
|
+
},
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* Monitoring detector options
|
|
471
|
+
*/
|
|
472
|
+
export interface MonitoringDetectorOptions {
|
|
473
|
+
/** GPO security settings including event log settings */
|
|
474
|
+
gpoSettings?: MonitoringGpoSettings | null;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* Detect all monitoring vulnerabilities
|
|
479
|
+
*/
|
|
480
|
+
export function detectMonitoringVulnerabilities(
|
|
481
|
+
users: ADUser[],
|
|
482
|
+
groups: ADGroup[],
|
|
483
|
+
domain: ADDomain | null,
|
|
484
|
+
includeDetails: boolean,
|
|
485
|
+
options: MonitoringDetectorOptions = {}
|
|
486
|
+
): Finding[] {
|
|
487
|
+
const { gpoSettings = null } = options;
|
|
488
|
+
|
|
489
|
+
return [
|
|
490
|
+
// High severity - Audit gaps
|
|
491
|
+
detectAuditLogonEventsDisabled(gpoSettings, domain, includeDetails),
|
|
492
|
+
detectAuditAccountMgmtDisabled(gpoSettings, domain, includeDetails),
|
|
493
|
+
detectAuditPolicyChangeDisabled(gpoSettings, domain, includeDetails),
|
|
494
|
+
detectAdminAuditBypass(users, domain, includeDetails),
|
|
495
|
+
// Medium severity
|
|
496
|
+
detectAuditPrivilegeUseDisabled(gpoSettings, domain, includeDetails),
|
|
497
|
+
detectNoHoneypotAccounts(users, includeDetails),
|
|
498
|
+
detectSecurityLogSizeSmall(gpoSettings, domain, includeDetails),
|
|
499
|
+
detectNoProtectedUsersMonitoring(users, groups, includeDetails),
|
|
500
|
+
].filter((finding) => finding.count > 0);
|
|
501
|
+
}
|