@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.
Files changed (617) hide show
  1. package/.env.example +60 -0
  2. package/.env.test.example +33 -0
  3. package/.github/workflows/ci.yml +83 -0
  4. package/.github/workflows/release.yml +246 -0
  5. package/.prettierrc.json +10 -0
  6. package/CHANGELOG.md +15 -0
  7. package/Dockerfile +57 -0
  8. package/LICENSE +190 -0
  9. package/README.md +194 -0
  10. package/dist/api/controllers/audit.controller.d.ts +21 -0
  11. package/dist/api/controllers/audit.controller.d.ts.map +1 -0
  12. package/dist/api/controllers/audit.controller.js +179 -0
  13. package/dist/api/controllers/audit.controller.js.map +1 -0
  14. package/dist/api/controllers/auth.controller.d.ts +16 -0
  15. package/dist/api/controllers/auth.controller.d.ts.map +1 -0
  16. package/dist/api/controllers/auth.controller.js +146 -0
  17. package/dist/api/controllers/auth.controller.js.map +1 -0
  18. package/dist/api/controllers/export.controller.d.ts +27 -0
  19. package/dist/api/controllers/export.controller.d.ts.map +1 -0
  20. package/dist/api/controllers/export.controller.js +80 -0
  21. package/dist/api/controllers/export.controller.js.map +1 -0
  22. package/dist/api/controllers/health.controller.d.ts +5 -0
  23. package/dist/api/controllers/health.controller.d.ts.map +1 -0
  24. package/dist/api/controllers/health.controller.js +16 -0
  25. package/dist/api/controllers/health.controller.js.map +1 -0
  26. package/dist/api/controllers/jobs.controller.d.ts +13 -0
  27. package/dist/api/controllers/jobs.controller.d.ts.map +1 -0
  28. package/dist/api/controllers/jobs.controller.js +125 -0
  29. package/dist/api/controllers/jobs.controller.js.map +1 -0
  30. package/dist/api/controllers/providers.controller.d.ts +15 -0
  31. package/dist/api/controllers/providers.controller.d.ts.map +1 -0
  32. package/dist/api/controllers/providers.controller.js +112 -0
  33. package/dist/api/controllers/providers.controller.js.map +1 -0
  34. package/dist/api/dto/AuditRequest.dto.d.ts +6 -0
  35. package/dist/api/dto/AuditRequest.dto.d.ts.map +1 -0
  36. package/dist/api/dto/AuditRequest.dto.js +3 -0
  37. package/dist/api/dto/AuditRequest.dto.js.map +1 -0
  38. package/dist/api/dto/AuditResponse.dto.d.ts +17 -0
  39. package/dist/api/dto/AuditResponse.dto.d.ts.map +1 -0
  40. package/dist/api/dto/AuditResponse.dto.js +3 -0
  41. package/dist/api/dto/AuditResponse.dto.js.map +1 -0
  42. package/dist/api/dto/TokenRequest.dto.d.ts +6 -0
  43. package/dist/api/dto/TokenRequest.dto.d.ts.map +1 -0
  44. package/dist/api/dto/TokenRequest.dto.js +3 -0
  45. package/dist/api/dto/TokenRequest.dto.js.map +1 -0
  46. package/dist/api/dto/TokenResponse.dto.d.ts +12 -0
  47. package/dist/api/dto/TokenResponse.dto.d.ts.map +1 -0
  48. package/dist/api/dto/TokenResponse.dto.js +3 -0
  49. package/dist/api/dto/TokenResponse.dto.js.map +1 -0
  50. package/dist/api/middlewares/authenticate.d.ts +12 -0
  51. package/dist/api/middlewares/authenticate.d.ts.map +1 -0
  52. package/dist/api/middlewares/authenticate.js +141 -0
  53. package/dist/api/middlewares/authenticate.js.map +1 -0
  54. package/dist/api/middlewares/errorHandler.d.ts +3 -0
  55. package/dist/api/middlewares/errorHandler.d.ts.map +1 -0
  56. package/dist/api/middlewares/errorHandler.js +30 -0
  57. package/dist/api/middlewares/errorHandler.js.map +1 -0
  58. package/dist/api/middlewares/rateLimit.d.ts +3 -0
  59. package/dist/api/middlewares/rateLimit.d.ts.map +1 -0
  60. package/dist/api/middlewares/rateLimit.js +34 -0
  61. package/dist/api/middlewares/rateLimit.js.map +1 -0
  62. package/dist/api/middlewares/validate.d.ts +4 -0
  63. package/dist/api/middlewares/validate.d.ts.map +1 -0
  64. package/dist/api/middlewares/validate.js +31 -0
  65. package/dist/api/middlewares/validate.js.map +1 -0
  66. package/dist/api/routes/audit.routes.d.ts +5 -0
  67. package/dist/api/routes/audit.routes.d.ts.map +1 -0
  68. package/dist/api/routes/audit.routes.js +24 -0
  69. package/dist/api/routes/audit.routes.js.map +1 -0
  70. package/dist/api/routes/auth.routes.d.ts +6 -0
  71. package/dist/api/routes/auth.routes.d.ts.map +1 -0
  72. package/dist/api/routes/auth.routes.js +22 -0
  73. package/dist/api/routes/auth.routes.js.map +1 -0
  74. package/dist/api/routes/export.routes.d.ts +5 -0
  75. package/dist/api/routes/export.routes.d.ts.map +1 -0
  76. package/dist/api/routes/export.routes.js +16 -0
  77. package/dist/api/routes/export.routes.js.map +1 -0
  78. package/dist/api/routes/health.routes.d.ts +4 -0
  79. package/dist/api/routes/health.routes.d.ts.map +1 -0
  80. package/dist/api/routes/health.routes.js +11 -0
  81. package/dist/api/routes/health.routes.js.map +1 -0
  82. package/dist/api/routes/index.d.ts +10 -0
  83. package/dist/api/routes/index.d.ts.map +1 -0
  84. package/dist/api/routes/index.js +20 -0
  85. package/dist/api/routes/index.js.map +1 -0
  86. package/dist/api/routes/providers.routes.d.ts +5 -0
  87. package/dist/api/routes/providers.routes.d.ts.map +1 -0
  88. package/dist/api/routes/providers.routes.js +13 -0
  89. package/dist/api/routes/providers.routes.js.map +1 -0
  90. package/dist/api/validators/audit.schemas.d.ts +60 -0
  91. package/dist/api/validators/audit.schemas.d.ts.map +1 -0
  92. package/dist/api/validators/audit.schemas.js +55 -0
  93. package/dist/api/validators/audit.schemas.js.map +1 -0
  94. package/dist/api/validators/auth.schemas.d.ts +17 -0
  95. package/dist/api/validators/auth.schemas.d.ts.map +1 -0
  96. package/dist/api/validators/auth.schemas.js +21 -0
  97. package/dist/api/validators/auth.schemas.js.map +1 -0
  98. package/dist/app.d.ts +3 -0
  99. package/dist/app.d.ts.map +1 -0
  100. package/dist/app.js +62 -0
  101. package/dist/app.js.map +1 -0
  102. package/dist/config/config.schema.d.ts +65 -0
  103. package/dist/config/config.schema.d.ts.map +1 -0
  104. package/dist/config/config.schema.js +95 -0
  105. package/dist/config/config.schema.js.map +1 -0
  106. package/dist/config/index.d.ts +4 -0
  107. package/dist/config/index.d.ts.map +1 -0
  108. package/dist/config/index.js +75 -0
  109. package/dist/config/index.js.map +1 -0
  110. package/dist/container.d.ts +47 -0
  111. package/dist/container.d.ts.map +1 -0
  112. package/dist/container.js +137 -0
  113. package/dist/container.js.map +1 -0
  114. package/dist/data/database.d.ts +13 -0
  115. package/dist/data/database.d.ts.map +1 -0
  116. package/dist/data/database.js +68 -0
  117. package/dist/data/database.js.map +1 -0
  118. package/dist/data/jobs/token-cleanup.job.d.ts +23 -0
  119. package/dist/data/jobs/token-cleanup.job.d.ts.map +1 -0
  120. package/dist/data/jobs/token-cleanup.job.js +96 -0
  121. package/dist/data/jobs/token-cleanup.job.js.map +1 -0
  122. package/dist/data/migrations/migration.runner.d.ts +13 -0
  123. package/dist/data/migrations/migration.runner.d.ts.map +1 -0
  124. package/dist/data/migrations/migration.runner.js +136 -0
  125. package/dist/data/migrations/migration.runner.js.map +1 -0
  126. package/dist/data/models/Token.model.d.ts +30 -0
  127. package/dist/data/models/Token.model.d.ts.map +1 -0
  128. package/dist/data/models/Token.model.js +3 -0
  129. package/dist/data/models/Token.model.js.map +1 -0
  130. package/dist/data/repositories/token.repository.d.ts +16 -0
  131. package/dist/data/repositories/token.repository.d.ts.map +1 -0
  132. package/dist/data/repositories/token.repository.js +97 -0
  133. package/dist/data/repositories/token.repository.js.map +1 -0
  134. package/dist/providers/azure/auth.provider.d.ts +5 -0
  135. package/dist/providers/azure/auth.provider.d.ts.map +1 -0
  136. package/dist/providers/azure/auth.provider.js +13 -0
  137. package/dist/providers/azure/auth.provider.js.map +1 -0
  138. package/dist/providers/azure/azure-errors.d.ts +40 -0
  139. package/dist/providers/azure/azure-errors.d.ts.map +1 -0
  140. package/dist/providers/azure/azure-errors.js +121 -0
  141. package/dist/providers/azure/azure-errors.js.map +1 -0
  142. package/dist/providers/azure/azure-retry.d.ts +41 -0
  143. package/dist/providers/azure/azure-retry.d.ts.map +1 -0
  144. package/dist/providers/azure/azure-retry.js +85 -0
  145. package/dist/providers/azure/azure-retry.js.map +1 -0
  146. package/dist/providers/azure/graph-client.d.ts +26 -0
  147. package/dist/providers/azure/graph-client.d.ts.map +1 -0
  148. package/dist/providers/azure/graph-client.js +146 -0
  149. package/dist/providers/azure/graph-client.js.map +1 -0
  150. package/dist/providers/azure/graph.provider.d.ts +23 -0
  151. package/dist/providers/azure/graph.provider.d.ts.map +1 -0
  152. package/dist/providers/azure/graph.provider.js +161 -0
  153. package/dist/providers/azure/graph.provider.js.map +1 -0
  154. package/dist/providers/azure/queries/app.queries.d.ts +6 -0
  155. package/dist/providers/azure/queries/app.queries.d.ts.map +1 -0
  156. package/dist/providers/azure/queries/app.queries.js +9 -0
  157. package/dist/providers/azure/queries/app.queries.js.map +1 -0
  158. package/dist/providers/azure/queries/policy.queries.d.ts +6 -0
  159. package/dist/providers/azure/queries/policy.queries.d.ts.map +1 -0
  160. package/dist/providers/azure/queries/policy.queries.js +9 -0
  161. package/dist/providers/azure/queries/policy.queries.js.map +1 -0
  162. package/dist/providers/azure/queries/user.queries.d.ts +7 -0
  163. package/dist/providers/azure/queries/user.queries.d.ts.map +1 -0
  164. package/dist/providers/azure/queries/user.queries.js +10 -0
  165. package/dist/providers/azure/queries/user.queries.js.map +1 -0
  166. package/dist/providers/interfaces/IGraphProvider.d.ts +31 -0
  167. package/dist/providers/interfaces/IGraphProvider.d.ts.map +1 -0
  168. package/dist/providers/interfaces/IGraphProvider.js +3 -0
  169. package/dist/providers/interfaces/IGraphProvider.js.map +1 -0
  170. package/dist/providers/interfaces/ILDAPProvider.d.ts +37 -0
  171. package/dist/providers/interfaces/ILDAPProvider.d.ts.map +1 -0
  172. package/dist/providers/interfaces/ILDAPProvider.js +3 -0
  173. package/dist/providers/interfaces/ILDAPProvider.js.map +1 -0
  174. package/dist/providers/ldap/acl-parser.d.ts +8 -0
  175. package/dist/providers/ldap/acl-parser.d.ts.map +1 -0
  176. package/dist/providers/ldap/acl-parser.js +157 -0
  177. package/dist/providers/ldap/acl-parser.js.map +1 -0
  178. package/dist/providers/ldap/ad-mappers.d.ts +8 -0
  179. package/dist/providers/ldap/ad-mappers.d.ts.map +1 -0
  180. package/dist/providers/ldap/ad-mappers.js +162 -0
  181. package/dist/providers/ldap/ad-mappers.js.map +1 -0
  182. package/dist/providers/ldap/ldap-client.d.ts +33 -0
  183. package/dist/providers/ldap/ldap-client.d.ts.map +1 -0
  184. package/dist/providers/ldap/ldap-client.js +195 -0
  185. package/dist/providers/ldap/ldap-client.js.map +1 -0
  186. package/dist/providers/ldap/ldap-errors.d.ts +48 -0
  187. package/dist/providers/ldap/ldap-errors.d.ts.map +1 -0
  188. package/dist/providers/ldap/ldap-errors.js +120 -0
  189. package/dist/providers/ldap/ldap-errors.js.map +1 -0
  190. package/dist/providers/ldap/ldap-retry.d.ts +14 -0
  191. package/dist/providers/ldap/ldap-retry.d.ts.map +1 -0
  192. package/dist/providers/ldap/ldap-retry.js +102 -0
  193. package/dist/providers/ldap/ldap-retry.js.map +1 -0
  194. package/dist/providers/ldap/ldap-sanitizer.d.ts +12 -0
  195. package/dist/providers/ldap/ldap-sanitizer.d.ts.map +1 -0
  196. package/dist/providers/ldap/ldap-sanitizer.js +104 -0
  197. package/dist/providers/ldap/ldap-sanitizer.js.map +1 -0
  198. package/dist/providers/ldap/ldap.provider.d.ts +21 -0
  199. package/dist/providers/ldap/ldap.provider.d.ts.map +1 -0
  200. package/dist/providers/ldap/ldap.provider.js +165 -0
  201. package/dist/providers/ldap/ldap.provider.js.map +1 -0
  202. package/dist/providers/ldap/queries/computer.queries.d.ts +6 -0
  203. package/dist/providers/ldap/queries/computer.queries.d.ts.map +1 -0
  204. package/dist/providers/ldap/queries/computer.queries.js +9 -0
  205. package/dist/providers/ldap/queries/computer.queries.js.map +1 -0
  206. package/dist/providers/ldap/queries/group.queries.d.ts +6 -0
  207. package/dist/providers/ldap/queries/group.queries.d.ts.map +1 -0
  208. package/dist/providers/ldap/queries/group.queries.js +9 -0
  209. package/dist/providers/ldap/queries/group.queries.js.map +1 -0
  210. package/dist/providers/ldap/queries/user.queries.d.ts +7 -0
  211. package/dist/providers/ldap/queries/user.queries.d.ts.map +1 -0
  212. package/dist/providers/ldap/queries/user.queries.js +10 -0
  213. package/dist/providers/ldap/queries/user.queries.js.map +1 -0
  214. package/dist/providers/smb/smb.provider.d.ts +68 -0
  215. package/dist/providers/smb/smb.provider.d.ts.map +1 -0
  216. package/dist/providers/smb/smb.provider.js +382 -0
  217. package/dist/providers/smb/smb.provider.js.map +1 -0
  218. package/dist/server.d.ts +2 -0
  219. package/dist/server.d.ts.map +1 -0
  220. package/dist/server.js +44 -0
  221. package/dist/server.js.map +1 -0
  222. package/dist/services/audit/ad-audit.service.d.ts +70 -0
  223. package/dist/services/audit/ad-audit.service.d.ts.map +1 -0
  224. package/dist/services/audit/ad-audit.service.js +1019 -0
  225. package/dist/services/audit/ad-audit.service.js.map +1 -0
  226. package/dist/services/audit/attack-graph.service.d.ts +62 -0
  227. package/dist/services/audit/attack-graph.service.d.ts.map +1 -0
  228. package/dist/services/audit/attack-graph.service.js +702 -0
  229. package/dist/services/audit/attack-graph.service.js.map +1 -0
  230. package/dist/services/audit/audit.service.d.ts +4 -0
  231. package/dist/services/audit/audit.service.d.ts.map +1 -0
  232. package/dist/services/audit/audit.service.js +10 -0
  233. package/dist/services/audit/audit.service.js.map +1 -0
  234. package/dist/services/audit/azure-audit.service.d.ts +37 -0
  235. package/dist/services/audit/azure-audit.service.d.ts.map +1 -0
  236. package/dist/services/audit/azure-audit.service.js +153 -0
  237. package/dist/services/audit/azure-audit.service.js.map +1 -0
  238. package/dist/services/audit/detectors/ad/accounts.detector.d.ts +37 -0
  239. package/dist/services/audit/detectors/ad/accounts.detector.d.ts.map +1 -0
  240. package/dist/services/audit/detectors/ad/accounts.detector.js +881 -0
  241. package/dist/services/audit/detectors/ad/accounts.detector.js.map +1 -0
  242. package/dist/services/audit/detectors/ad/adcs.detector.d.ts +21 -0
  243. package/dist/services/audit/detectors/ad/adcs.detector.d.ts.map +1 -0
  244. package/dist/services/audit/detectors/ad/adcs.detector.js +227 -0
  245. package/dist/services/audit/detectors/ad/adcs.detector.js.map +1 -0
  246. package/dist/services/audit/detectors/ad/advanced.detector.d.ts +63 -0
  247. package/dist/services/audit/detectors/ad/advanced.detector.d.ts.map +1 -0
  248. package/dist/services/audit/detectors/ad/advanced.detector.js +867 -0
  249. package/dist/services/audit/detectors/ad/advanced.detector.js.map +1 -0
  250. package/dist/services/audit/detectors/ad/attack-paths.detector.d.ts +16 -0
  251. package/dist/services/audit/detectors/ad/attack-paths.detector.d.ts.map +1 -0
  252. package/dist/services/audit/detectors/ad/attack-paths.detector.js +369 -0
  253. package/dist/services/audit/detectors/ad/attack-paths.detector.js.map +1 -0
  254. package/dist/services/audit/detectors/ad/compliance.detector.d.ts +28 -0
  255. package/dist/services/audit/detectors/ad/compliance.detector.d.ts.map +1 -0
  256. package/dist/services/audit/detectors/ad/compliance.detector.js +896 -0
  257. package/dist/services/audit/detectors/ad/compliance.detector.js.map +1 -0
  258. package/dist/services/audit/detectors/ad/computers.detector.d.ts +30 -0
  259. package/dist/services/audit/detectors/ad/computers.detector.d.ts.map +1 -0
  260. package/dist/services/audit/detectors/ad/computers.detector.js +799 -0
  261. package/dist/services/audit/detectors/ad/computers.detector.js.map +1 -0
  262. package/dist/services/audit/detectors/ad/gpo.detector.d.ts +17 -0
  263. package/dist/services/audit/detectors/ad/gpo.detector.d.ts.map +1 -0
  264. package/dist/services/audit/detectors/ad/gpo.detector.js +257 -0
  265. package/dist/services/audit/detectors/ad/gpo.detector.js.map +1 -0
  266. package/dist/services/audit/detectors/ad/groups.detector.d.ts +19 -0
  267. package/dist/services/audit/detectors/ad/groups.detector.d.ts.map +1 -0
  268. package/dist/services/audit/detectors/ad/groups.detector.js +488 -0
  269. package/dist/services/audit/detectors/ad/groups.detector.js.map +1 -0
  270. package/dist/services/audit/detectors/ad/index.d.ts +15 -0
  271. package/dist/services/audit/detectors/ad/index.d.ts.map +1 -0
  272. package/dist/services/audit/detectors/ad/index.js +51 -0
  273. package/dist/services/audit/detectors/ad/index.js.map +1 -0
  274. package/dist/services/audit/detectors/ad/kerberos.detector.d.ts +17 -0
  275. package/dist/services/audit/detectors/ad/kerberos.detector.d.ts.map +1 -0
  276. package/dist/services/audit/detectors/ad/kerberos.detector.js +293 -0
  277. package/dist/services/audit/detectors/ad/kerberos.detector.js.map +1 -0
  278. package/dist/services/audit/detectors/ad/monitoring.detector.d.ts +23 -0
  279. package/dist/services/audit/detectors/ad/monitoring.detector.d.ts.map +1 -0
  280. package/dist/services/audit/detectors/ad/monitoring.detector.js +328 -0
  281. package/dist/services/audit/detectors/ad/monitoring.detector.js.map +1 -0
  282. package/dist/services/audit/detectors/ad/network.detector.d.ts +39 -0
  283. package/dist/services/audit/detectors/ad/network.detector.d.ts.map +1 -0
  284. package/dist/services/audit/detectors/ad/network.detector.js +257 -0
  285. package/dist/services/audit/detectors/ad/network.detector.js.map +1 -0
  286. package/dist/services/audit/detectors/ad/password.detector.d.ts +14 -0
  287. package/dist/services/audit/detectors/ad/password.detector.d.ts.map +1 -0
  288. package/dist/services/audit/detectors/ad/password.detector.js +235 -0
  289. package/dist/services/audit/detectors/ad/password.detector.js.map +1 -0
  290. package/dist/services/audit/detectors/ad/permissions.detector.d.ts +20 -0
  291. package/dist/services/audit/detectors/ad/permissions.detector.d.ts.map +1 -0
  292. package/dist/services/audit/detectors/ad/permissions.detector.js +392 -0
  293. package/dist/services/audit/detectors/ad/permissions.detector.js.map +1 -0
  294. package/dist/services/audit/detectors/ad/trusts.detector.d.ts +11 -0
  295. package/dist/services/audit/detectors/ad/trusts.detector.d.ts.map +1 -0
  296. package/dist/services/audit/detectors/ad/trusts.detector.js +186 -0
  297. package/dist/services/audit/detectors/ad/trusts.detector.js.map +1 -0
  298. package/dist/services/audit/detectors/azure/app-security.detector.d.ts +11 -0
  299. package/dist/services/audit/detectors/azure/app-security.detector.d.ts.map +1 -0
  300. package/dist/services/audit/detectors/azure/app-security.detector.js +184 -0
  301. package/dist/services/audit/detectors/azure/app-security.detector.js.map +1 -0
  302. package/dist/services/audit/detectors/azure/conditional-access.detector.d.ts +10 -0
  303. package/dist/services/audit/detectors/azure/conditional-access.detector.d.ts.map +1 -0
  304. package/dist/services/audit/detectors/azure/conditional-access.detector.js +130 -0
  305. package/dist/services/audit/detectors/azure/conditional-access.detector.js.map +1 -0
  306. package/dist/services/audit/detectors/azure/privilege-security.detector.d.ts +8 -0
  307. package/dist/services/audit/detectors/azure/privilege-security.detector.d.ts.map +1 -0
  308. package/dist/services/audit/detectors/azure/privilege-security.detector.js +113 -0
  309. package/dist/services/audit/detectors/azure/privilege-security.detector.js.map +1 -0
  310. package/dist/services/audit/detectors/azure/user-security.detector.d.ts +14 -0
  311. package/dist/services/audit/detectors/azure/user-security.detector.d.ts.map +1 -0
  312. package/dist/services/audit/detectors/azure/user-security.detector.js +198 -0
  313. package/dist/services/audit/detectors/azure/user-security.detector.js.map +1 -0
  314. package/dist/services/audit/detectors/index.d.ts +2 -0
  315. package/dist/services/audit/detectors/index.d.ts.map +1 -0
  316. package/dist/services/audit/detectors/index.js +38 -0
  317. package/dist/services/audit/detectors/index.js.map +1 -0
  318. package/dist/services/audit/response-formatter.d.ts +176 -0
  319. package/dist/services/audit/response-formatter.d.ts.map +1 -0
  320. package/dist/services/audit/response-formatter.js +240 -0
  321. package/dist/services/audit/response-formatter.js.map +1 -0
  322. package/dist/services/audit/scoring.service.d.ts +15 -0
  323. package/dist/services/audit/scoring.service.d.ts.map +1 -0
  324. package/dist/services/audit/scoring.service.js +139 -0
  325. package/dist/services/audit/scoring.service.js.map +1 -0
  326. package/dist/services/auth/crypto.service.d.ts +19 -0
  327. package/dist/services/auth/crypto.service.d.ts.map +1 -0
  328. package/dist/services/auth/crypto.service.js +135 -0
  329. package/dist/services/auth/crypto.service.js.map +1 -0
  330. package/dist/services/auth/errors.d.ts +19 -0
  331. package/dist/services/auth/errors.d.ts.map +1 -0
  332. package/dist/services/auth/errors.js +46 -0
  333. package/dist/services/auth/errors.js.map +1 -0
  334. package/dist/services/auth/token.service.d.ts +41 -0
  335. package/dist/services/auth/token.service.d.ts.map +1 -0
  336. package/dist/services/auth/token.service.js +208 -0
  337. package/dist/services/auth/token.service.js.map +1 -0
  338. package/dist/services/config/config.service.d.ts +6 -0
  339. package/dist/services/config/config.service.d.ts.map +1 -0
  340. package/dist/services/config/config.service.js +64 -0
  341. package/dist/services/config/config.service.js.map +1 -0
  342. package/dist/services/export/export.service.d.ts +28 -0
  343. package/dist/services/export/export.service.d.ts.map +1 -0
  344. package/dist/services/export/export.service.js +28 -0
  345. package/dist/services/export/export.service.js.map +1 -0
  346. package/dist/services/export/formatters/csv.formatter.d.ts +8 -0
  347. package/dist/services/export/formatters/csv.formatter.d.ts.map +1 -0
  348. package/dist/services/export/formatters/csv.formatter.js +46 -0
  349. package/dist/services/export/formatters/csv.formatter.js.map +1 -0
  350. package/dist/services/export/formatters/json.formatter.d.ts +40 -0
  351. package/dist/services/export/formatters/json.formatter.d.ts.map +1 -0
  352. package/dist/services/export/formatters/json.formatter.js +58 -0
  353. package/dist/services/export/formatters/json.formatter.js.map +1 -0
  354. package/dist/services/jobs/azure-job-runner.d.ts +38 -0
  355. package/dist/services/jobs/azure-job-runner.d.ts.map +1 -0
  356. package/dist/services/jobs/azure-job-runner.js +199 -0
  357. package/dist/services/jobs/azure-job-runner.js.map +1 -0
  358. package/dist/services/jobs/index.d.ts +4 -0
  359. package/dist/services/jobs/index.d.ts.map +1 -0
  360. package/dist/services/jobs/index.js +20 -0
  361. package/dist/services/jobs/index.js.map +1 -0
  362. package/dist/services/jobs/job-runner.d.ts +64 -0
  363. package/dist/services/jobs/job-runner.d.ts.map +1 -0
  364. package/dist/services/jobs/job-runner.js +952 -0
  365. package/dist/services/jobs/job-runner.js.map +1 -0
  366. package/dist/services/jobs/job-store.d.ts +27 -0
  367. package/dist/services/jobs/job-store.d.ts.map +1 -0
  368. package/dist/services/jobs/job-store.js +261 -0
  369. package/dist/services/jobs/job-store.js.map +1 -0
  370. package/dist/services/jobs/job.types.d.ts +67 -0
  371. package/dist/services/jobs/job.types.d.ts.map +1 -0
  372. package/dist/services/jobs/job.types.js +36 -0
  373. package/dist/services/jobs/job.types.js.map +1 -0
  374. package/dist/types/ad.types.d.ts +74 -0
  375. package/dist/types/ad.types.d.ts.map +1 -0
  376. package/dist/types/ad.types.js +3 -0
  377. package/dist/types/ad.types.js.map +1 -0
  378. package/dist/types/adcs.types.d.ts +58 -0
  379. package/dist/types/adcs.types.d.ts.map +1 -0
  380. package/dist/types/adcs.types.js +38 -0
  381. package/dist/types/adcs.types.js.map +1 -0
  382. package/dist/types/attack-graph.types.d.ts +135 -0
  383. package/dist/types/attack-graph.types.d.ts.map +1 -0
  384. package/dist/types/attack-graph.types.js +58 -0
  385. package/dist/types/attack-graph.types.js.map +1 -0
  386. package/dist/types/audit.types.d.ts +34 -0
  387. package/dist/types/audit.types.d.ts.map +1 -0
  388. package/dist/types/audit.types.js +3 -0
  389. package/dist/types/audit.types.js.map +1 -0
  390. package/dist/types/azure.types.d.ts +61 -0
  391. package/dist/types/azure.types.d.ts.map +1 -0
  392. package/dist/types/azure.types.js +3 -0
  393. package/dist/types/azure.types.js.map +1 -0
  394. package/dist/types/config.types.d.ts +63 -0
  395. package/dist/types/config.types.d.ts.map +1 -0
  396. package/dist/types/config.types.js +3 -0
  397. package/dist/types/config.types.js.map +1 -0
  398. package/dist/types/error.types.d.ts +33 -0
  399. package/dist/types/error.types.d.ts.map +1 -0
  400. package/dist/types/error.types.js +70 -0
  401. package/dist/types/error.types.js.map +1 -0
  402. package/dist/types/finding.types.d.ts +133 -0
  403. package/dist/types/finding.types.d.ts.map +1 -0
  404. package/dist/types/finding.types.js +3 -0
  405. package/dist/types/finding.types.js.map +1 -0
  406. package/dist/types/gpo.types.d.ts +39 -0
  407. package/dist/types/gpo.types.d.ts.map +1 -0
  408. package/dist/types/gpo.types.js +15 -0
  409. package/dist/types/gpo.types.js.map +1 -0
  410. package/dist/types/token.types.d.ts +26 -0
  411. package/dist/types/token.types.d.ts.map +1 -0
  412. package/dist/types/token.types.js +3 -0
  413. package/dist/types/token.types.js.map +1 -0
  414. package/dist/types/trust.types.d.ts +45 -0
  415. package/dist/types/trust.types.d.ts.map +1 -0
  416. package/dist/types/trust.types.js +71 -0
  417. package/dist/types/trust.types.js.map +1 -0
  418. package/dist/utils/entity-converter.d.ts +17 -0
  419. package/dist/utils/entity-converter.d.ts.map +1 -0
  420. package/dist/utils/entity-converter.js +285 -0
  421. package/dist/utils/entity-converter.js.map +1 -0
  422. package/dist/utils/graph.util.d.ts +66 -0
  423. package/dist/utils/graph.util.d.ts.map +1 -0
  424. package/dist/utils/graph.util.js +382 -0
  425. package/dist/utils/graph.util.js.map +1 -0
  426. package/dist/utils/logger.d.ts +7 -0
  427. package/dist/utils/logger.d.ts.map +1 -0
  428. package/dist/utils/logger.js +86 -0
  429. package/dist/utils/logger.js.map +1 -0
  430. package/dist/utils/type-name-normalizer.d.ts +5 -0
  431. package/dist/utils/type-name-normalizer.d.ts.map +1 -0
  432. package/dist/utils/type-name-normalizer.js +218 -0
  433. package/dist/utils/type-name-normalizer.js.map +1 -0
  434. package/docker-compose.yml +26 -0
  435. package/docs/api/README.md +178 -0
  436. package/docs/api/openapi.yaml +1524 -0
  437. package/eslint.config.js +54 -0
  438. package/jest.config.js +38 -0
  439. package/package.json +97 -0
  440. package/scripts/fetch-ad-cert.sh +142 -0
  441. package/src/.gitkeep +0 -0
  442. package/src/api/.gitkeep +0 -0
  443. package/src/api/controllers/.gitkeep +0 -0
  444. package/src/api/controllers/audit.controller.ts +313 -0
  445. package/src/api/controllers/auth.controller.ts +258 -0
  446. package/src/api/controllers/export.controller.ts +153 -0
  447. package/src/api/controllers/health.controller.ts +16 -0
  448. package/src/api/controllers/jobs.controller.ts +187 -0
  449. package/src/api/controllers/providers.controller.ts +165 -0
  450. package/src/api/dto/.gitkeep +0 -0
  451. package/src/api/dto/AuditRequest.dto.ts +8 -0
  452. package/src/api/dto/AuditResponse.dto.ts +19 -0
  453. package/src/api/dto/TokenRequest.dto.ts +8 -0
  454. package/src/api/dto/TokenResponse.dto.ts +14 -0
  455. package/src/api/middlewares/.gitkeep +0 -0
  456. package/src/api/middlewares/authenticate.ts +203 -0
  457. package/src/api/middlewares/errorHandler.ts +54 -0
  458. package/src/api/middlewares/rateLimit.ts +35 -0
  459. package/src/api/middlewares/validate.ts +32 -0
  460. package/src/api/routes/.gitkeep +0 -0
  461. package/src/api/routes/audit.routes.ts +77 -0
  462. package/src/api/routes/auth.routes.ts +71 -0
  463. package/src/api/routes/export.routes.ts +34 -0
  464. package/src/api/routes/health.routes.ts +14 -0
  465. package/src/api/routes/index.ts +40 -0
  466. package/src/api/routes/providers.routes.ts +24 -0
  467. package/src/api/validators/.gitkeep +0 -0
  468. package/src/api/validators/audit.schemas.ts +59 -0
  469. package/src/api/validators/auth.schemas.ts +59 -0
  470. package/src/app.ts +87 -0
  471. package/src/config/.gitkeep +0 -0
  472. package/src/config/config.schema.ts +108 -0
  473. package/src/config/index.ts +82 -0
  474. package/src/container.ts +221 -0
  475. package/src/data/.gitkeep +0 -0
  476. package/src/data/database.ts +78 -0
  477. package/src/data/jobs/token-cleanup.job.ts +166 -0
  478. package/src/data/migrations/.gitkeep +0 -0
  479. package/src/data/migrations/001_initial_schema.sql +47 -0
  480. package/src/data/migrations/migration.runner.ts +125 -0
  481. package/src/data/models/.gitkeep +0 -0
  482. package/src/data/models/Token.model.ts +35 -0
  483. package/src/data/repositories/.gitkeep +0 -0
  484. package/src/data/repositories/token.repository.ts +160 -0
  485. package/src/providers/.gitkeep +0 -0
  486. package/src/providers/azure/.gitkeep +0 -0
  487. package/src/providers/azure/auth.provider.ts +14 -0
  488. package/src/providers/azure/azure-errors.ts +189 -0
  489. package/src/providers/azure/azure-retry.ts +168 -0
  490. package/src/providers/azure/graph-client.ts +315 -0
  491. package/src/providers/azure/graph.provider.ts +294 -0
  492. package/src/providers/azure/queries/app.queries.ts +9 -0
  493. package/src/providers/azure/queries/policy.queries.ts +9 -0
  494. package/src/providers/azure/queries/user.queries.ts +10 -0
  495. package/src/providers/interfaces/.gitkeep +0 -0
  496. package/src/providers/interfaces/IGraphProvider.ts +117 -0
  497. package/src/providers/interfaces/ILDAPProvider.ts +142 -0
  498. package/src/providers/ldap/.gitkeep +0 -0
  499. package/src/providers/ldap/acl-parser.ts +231 -0
  500. package/src/providers/ldap/ad-mappers.ts +280 -0
  501. package/src/providers/ldap/ldap-client.ts +259 -0
  502. package/src/providers/ldap/ldap-errors.ts +188 -0
  503. package/src/providers/ldap/ldap-retry.ts +267 -0
  504. package/src/providers/ldap/ldap-sanitizer.ts +273 -0
  505. package/src/providers/ldap/ldap.provider.ts +293 -0
  506. package/src/providers/ldap/queries/computer.queries.ts +9 -0
  507. package/src/providers/ldap/queries/group.queries.ts +9 -0
  508. package/src/providers/ldap/queries/user.queries.ts +10 -0
  509. package/src/providers/smb/smb.provider.ts +653 -0
  510. package/src/server.ts +60 -0
  511. package/src/services/.gitkeep +0 -0
  512. package/src/services/audit/.gitkeep +0 -0
  513. package/src/services/audit/ad-audit.service.ts +1481 -0
  514. package/src/services/audit/attack-graph.service.ts +1104 -0
  515. package/src/services/audit/audit.service.ts +12 -0
  516. package/src/services/audit/azure-audit.service.ts +286 -0
  517. package/src/services/audit/detectors/ad/accounts.detector.ts +1232 -0
  518. package/src/services/audit/detectors/ad/adcs.detector.ts +449 -0
  519. package/src/services/audit/detectors/ad/advanced.detector.ts +1270 -0
  520. package/src/services/audit/detectors/ad/attack-paths.detector.ts +600 -0
  521. package/src/services/audit/detectors/ad/compliance.detector.ts +1421 -0
  522. package/src/services/audit/detectors/ad/computers.detector.ts +1188 -0
  523. package/src/services/audit/detectors/ad/gpo.detector.ts +485 -0
  524. package/src/services/audit/detectors/ad/groups.detector.ts +685 -0
  525. package/src/services/audit/detectors/ad/index.ts +84 -0
  526. package/src/services/audit/detectors/ad/kerberos.detector.ts +424 -0
  527. package/src/services/audit/detectors/ad/monitoring.detector.ts +501 -0
  528. package/src/services/audit/detectors/ad/network.detector.ts +538 -0
  529. package/src/services/audit/detectors/ad/password.detector.ts +324 -0
  530. package/src/services/audit/detectors/ad/permissions.detector.ts +637 -0
  531. package/src/services/audit/detectors/ad/trusts.detector.ts +315 -0
  532. package/src/services/audit/detectors/azure/app-security.detector.ts +246 -0
  533. package/src/services/audit/detectors/azure/conditional-access.detector.ts +186 -0
  534. package/src/services/audit/detectors/azure/privilege-security.detector.ts +176 -0
  535. package/src/services/audit/detectors/azure/user-security.detector.ts +280 -0
  536. package/src/services/audit/detectors/index.ts +18 -0
  537. package/src/services/audit/response-formatter.ts +604 -0
  538. package/src/services/audit/scoring.service.ts +234 -0
  539. package/src/services/auth/.gitkeep +0 -0
  540. package/src/services/auth/crypto.service.ts +230 -0
  541. package/src/services/auth/errors.ts +47 -0
  542. package/src/services/auth/token.service.ts +420 -0
  543. package/src/services/config/.gitkeep +0 -0
  544. package/src/services/config/config.service.ts +75 -0
  545. package/src/services/export/.gitkeep +0 -0
  546. package/src/services/export/export.service.ts +99 -0
  547. package/src/services/export/formatters/csv.formatter.ts +124 -0
  548. package/src/services/export/formatters/json.formatter.ts +160 -0
  549. package/src/services/jobs/azure-job-runner.ts +312 -0
  550. package/src/services/jobs/index.ts +9 -0
  551. package/src/services/jobs/job-runner.ts +1280 -0
  552. package/src/services/jobs/job-store.ts +384 -0
  553. package/src/services/jobs/job.types.ts +182 -0
  554. package/src/types/.gitkeep +0 -0
  555. package/src/types/ad.types.ts +91 -0
  556. package/src/types/adcs.types.ts +107 -0
  557. package/src/types/attack-graph.types.ts +260 -0
  558. package/src/types/audit.types.ts +42 -0
  559. package/src/types/azure.types.ts +68 -0
  560. package/src/types/config.types.ts +79 -0
  561. package/src/types/error.types.ts +69 -0
  562. package/src/types/finding.types.ts +284 -0
  563. package/src/types/gpo.types.ts +72 -0
  564. package/src/types/smb2.d.ts +73 -0
  565. package/src/types/token.types.ts +32 -0
  566. package/src/types/trust.types.ts +140 -0
  567. package/src/utils/.gitkeep +0 -0
  568. package/src/utils/entity-converter.ts +453 -0
  569. package/src/utils/graph.util.ts +609 -0
  570. package/src/utils/logger.ts +111 -0
  571. package/src/utils/type-name-normalizer.ts +302 -0
  572. package/tests/.gitkeep +0 -0
  573. package/tests/e2e/.gitkeep +0 -0
  574. package/tests/fixtures/.gitkeep +0 -0
  575. package/tests/integration/.gitkeep +0 -0
  576. package/tests/integration/README.md +156 -0
  577. package/tests/integration/ad-audit.integration.test.ts +216 -0
  578. package/tests/integration/api/.gitkeep +0 -0
  579. package/tests/integration/api/endpoints.integration.test.ts +431 -0
  580. package/tests/integration/auth/jwt-authentication.integration.test.ts +358 -0
  581. package/tests/integration/providers/.gitkeep +0 -0
  582. package/tests/integration/providers/azure-basic.integration.test.ts +167 -0
  583. package/tests/integration/providers/ldap-basic.integration.test.ts +152 -0
  584. package/tests/integration/providers/ldap-connectivity.test.ts +44 -0
  585. package/tests/integration/providers/ldap-provider.integration.test.ts +347 -0
  586. package/tests/mocks/.gitkeep +0 -0
  587. package/tests/setup.ts +16 -0
  588. package/tests/unit/.gitkeep +0 -0
  589. package/tests/unit/api/middlewares/authenticate.test.ts +446 -0
  590. package/tests/unit/providers/.gitkeep +0 -0
  591. package/tests/unit/providers/azure/azure-errors.test.ts +193 -0
  592. package/tests/unit/providers/azure/azure-retry.test.ts +254 -0
  593. package/tests/unit/providers/azure/graph-provider.test.ts +313 -0
  594. package/tests/unit/providers/ldap/ad-mappers.test.ts +392 -0
  595. package/tests/unit/providers/ldap/ldap-provider.test.ts +376 -0
  596. package/tests/unit/providers/ldap/ldap-retry.test.ts +377 -0
  597. package/tests/unit/providers/ldap/ldap-sanitizer.test.ts +301 -0
  598. package/tests/unit/sample.test.ts +19 -0
  599. package/tests/unit/services/.gitkeep +0 -0
  600. package/tests/unit/services/audit/detectors/ad/accounts.detector.test.ts +393 -0
  601. package/tests/unit/services/audit/detectors/ad/advanced.detector.test.ts +380 -0
  602. package/tests/unit/services/audit/detectors/ad/computers.detector.test.ts +440 -0
  603. package/tests/unit/services/audit/detectors/ad/groups.detector.test.ts +276 -0
  604. package/tests/unit/services/audit/detectors/ad/kerberos.detector.test.ts +215 -0
  605. package/tests/unit/services/audit/detectors/ad/password.detector.test.ts +226 -0
  606. package/tests/unit/services/audit/detectors/ad/permissions.detector.test.ts +244 -0
  607. package/tests/unit/services/audit/detectors/azure/app-security.detector.test.ts +349 -0
  608. package/tests/unit/services/audit/detectors/azure/conditional-access.detector.test.ts +374 -0
  609. package/tests/unit/services/audit/detectors/azure/privilege-security.detector.test.ts +374 -0
  610. package/tests/unit/services/audit/detectors/azure/user-security.detector.test.ts +297 -0
  611. package/tests/unit/services/auth/crypto.service.test.ts +296 -0
  612. package/tests/unit/services/auth/token.service.test.ts +579 -0
  613. package/tests/unit/services/export/export.service.test.ts +241 -0
  614. package/tests/unit/services/export/formatters/csv.formatter.test.ts +270 -0
  615. package/tests/unit/services/export/formatters/json.formatter.test.ts +258 -0
  616. package/tests/unit/utils/.gitkeep +0 -0
  617. 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
+ }