@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,84 @@
1
+ /**
2
+ * Active Directory Vulnerability Detectors
3
+ *
4
+ * Exports all AD vulnerability detection functions
5
+ * Story 1.7: AD Vulnerability Detection Engine
6
+ *
7
+ * Total: 216 vulnerabilities across 14 categories
8
+ * - Password: 10 vulnerabilities (+3 Phase 3)
9
+ * - Kerberos: 12 vulnerabilities (+4 Phase 4)
10
+ * - Accounts: 31 vulnerabilities (+3 Phase 4)
11
+ * - Groups: 14 vulnerabilities (+3 Phase 4)
12
+ * - Computers: 28 vulnerabilities (+2 Phase 4)
13
+ * - Advanced: 35 vulnerabilities (+3 Phase 4)
14
+ * - Permissions: 15 vulnerabilities (+6 Phase 4)
15
+ * - ADCS: 11 vulnerabilities (ESC1-ESC11)
16
+ * - GPO: 9 vulnerabilities (+2 Phase 4)
17
+ * - Trusts: 7 vulnerabilities
18
+ * - Attack Paths: 10 vulnerabilities (Phase 2A)
19
+ * - Monitoring: 8 vulnerabilities (Phase 2B)
20
+ * - Compliance: 23 vulnerabilities (+8 Industry Frameworks: PCI-DSS, SOC2, GDPR, SOX, DORA, HIPAA, ISO27001)
21
+ * - Network: 12 vulnerabilities (Phase 3)
22
+ */
23
+
24
+ // Password detectors
25
+ export * from './password.detector';
26
+
27
+ // Kerberos detectors
28
+ export * from './kerberos.detector';
29
+
30
+ // Accounts detectors
31
+ export * from './accounts.detector';
32
+
33
+ // Groups detectors
34
+ export * from './groups.detector';
35
+
36
+ // Computers detectors
37
+ export * from './computers.detector';
38
+
39
+ // Advanced detectors (excluding ESC functions which are in adcs.detector)
40
+ export {
41
+ detectShadowCredentials,
42
+ detectRbcdAbuse,
43
+ detectLapsNotDeployed,
44
+ detectLapsPasswordReadable,
45
+ detectLapsLegacyAttribute,
46
+ detectLapsPasswordSet,
47
+ detectLapsPasswordLeaked,
48
+ detectDuplicateSpn,
49
+ detectWeakPasswordPolicy,
50
+ detectWeakKerberosPolicy,
51
+ detectMachineAccountQuotaAbuse,
52
+ detectDelegationPrivilege,
53
+ detectAdcsWeakPermissions,
54
+ detectDangerousLogonScripts,
55
+ detectForeignSecurityPrincipals,
56
+ detectReplicationRights,
57
+ detectDcsyncCapable,
58
+ detectNtlmRelayOpportunity,
59
+ detectAdvancedVulnerabilities,
60
+ } from './advanced.detector';
61
+
62
+ // Permissions detectors
63
+ export * from './permissions.detector';
64
+
65
+ // ADCS detectors (ESC1-ESC8) - replaces legacy ESC functions from advanced.detector
66
+ export * from './adcs.detector';
67
+
68
+ // GPO detectors
69
+ export * from './gpo.detector';
70
+
71
+ // Trusts detectors
72
+ export * from './trusts.detector';
73
+
74
+ // Attack Paths detectors (Phase 2A)
75
+ export * from './attack-paths.detector';
76
+
77
+ // Monitoring detectors (Phase 2B)
78
+ export * from './monitoring.detector';
79
+
80
+ // Compliance detectors (Phase 3)
81
+ export * from './compliance.detector';
82
+
83
+ // Network detectors (Phase 3)
84
+ export * from './network.detector';
@@ -0,0 +1,424 @@
1
+ /**
2
+ * Kerberos Security Vulnerability Detector
3
+ *
4
+ * Detects Kerberos-related vulnerabilities in AD.
5
+ * Story 1.7: AD Vulnerability Detection Engine
6
+ *
7
+ * Vulnerabilities detected (12):
8
+ * - ASREP_ROASTING_RISK (Critical)
9
+ * - UNCONSTRAINED_DELEGATION (Critical)
10
+ * - GOLDEN_TICKET_RISK (Critical)
11
+ * - KERBEROASTING_RISK (High)
12
+ * - CONSTRAINED_DELEGATION (High)
13
+ * - WEAK_ENCRYPTION_DES (High)
14
+ * - WEAK_ENCRYPTION_RC4 (Medium)
15
+ * - WEAK_ENCRYPTION_FLAG (Medium)
16
+ * - KERBEROS_AES_DISABLED (High) - Phase 4
17
+ * - KERBEROS_RC4_FALLBACK (Medium) - Phase 4
18
+ * - KERBEROS_TICKET_LIFETIME_LONG (Medium) - Phase 4
19
+ * - KERBEROS_RENEWABLE_TICKET_LONG (Low) - Phase 4
20
+ */
21
+
22
+ import { ADUser } from '../../../../types/ad.types';
23
+ import { Finding } from '../../../../types/finding.types';
24
+ import { toAffectedUserEntities } from '../../../../utils/entity-converter';
25
+
26
+ /**
27
+ * Check for ASREP roasting risk (no Kerberos pre-authentication)
28
+ * UAC flag 0x400000 = DONT_REQ_PREAUTH
29
+ */
30
+ export function detectAsrepRoastingRisk(users: ADUser[], includeDetails: boolean): Finding {
31
+ const affected = users.filter((u) => {
32
+ if (!u.userAccountControl) return false;
33
+ return (u.userAccountControl & 0x400000) !== 0;
34
+ });
35
+
36
+ return {
37
+ type: 'ASREP_ROASTING_RISK',
38
+ severity: 'critical',
39
+ category: 'kerberos',
40
+ title: 'AS-REP Roasting Risk',
41
+ description: 'User accounts without Kerberos pre-authentication required (UAC 0x400000). Vulnerable to AS-REP roasting attacks.',
42
+ count: affected.length,
43
+ affectedEntities: includeDetails ? toAffectedUserEntities(affected) : undefined,
44
+ };
45
+ }
46
+
47
+ /**
48
+ * Check for unconstrained delegation
49
+ * UAC flag 0x80000 = TRUSTED_FOR_DELEGATION
50
+ */
51
+ export function detectUnconstrainedDelegation(users: ADUser[], includeDetails: boolean): Finding {
52
+ const affected = users.filter((u) => {
53
+ if (!u.userAccountControl) return false;
54
+ return (u.userAccountControl & 0x80000) !== 0;
55
+ });
56
+
57
+ return {
58
+ type: 'UNCONSTRAINED_DELEGATION',
59
+ severity: 'critical',
60
+ category: 'kerberos',
61
+ title: 'Unconstrained Delegation',
62
+ description: 'User accounts with unconstrained Kerberos delegation enabled (UAC 0x80000). Can impersonate any user.',
63
+ count: affected.length,
64
+ affectedEntities: includeDetails ? toAffectedUserEntities(affected) : undefined,
65
+ };
66
+ }
67
+
68
+ /**
69
+ * Check for Golden Ticket risk (krbtgt password old)
70
+ */
71
+ export function detectGoldenTicketRisk(users: ADUser[], includeDetails: boolean): Finding {
72
+ const krbtgtAccount = users.find((u) => u.sAMAccountName === 'krbtgt');
73
+
74
+ if (!krbtgtAccount || !krbtgtAccount.passwordLastSet) {
75
+ return {
76
+ type: 'GOLDEN_TICKET_RISK',
77
+ severity: 'critical',
78
+ category: 'kerberos',
79
+ title: 'Golden Ticket Risk',
80
+ description: 'krbtgt account password unchanged for 180+ days or password date unavailable. Enables persistent Golden Ticket attacks.',
81
+ count: 0,
82
+ };
83
+ }
84
+
85
+ const now = Date.now();
86
+ const sixMonthsAgo = now - 180 * 24 * 60 * 60 * 1000;
87
+ const passwordAge = krbtgtAccount.passwordLastSet.getTime();
88
+ const isOld = passwordAge < sixMonthsAgo;
89
+
90
+ return {
91
+ type: 'GOLDEN_TICKET_RISK',
92
+ severity: 'critical',
93
+ category: 'kerberos',
94
+ title: 'Golden Ticket Risk',
95
+ description: `krbtgt account password unchanged for 180+ days. Enables persistent Golden Ticket attacks.`,
96
+ count: isOld ? 1 : 0,
97
+ affectedEntities: includeDetails && isOld ? [krbtgtAccount.dn] : undefined,
98
+ };
99
+ }
100
+
101
+ /**
102
+ * Check for Kerberoasting risk (user with SPN)
103
+ */
104
+ export function detectKerberoastingRisk(users: ADUser[], includeDetails: boolean): Finding {
105
+ const affected = users.filter((u) => {
106
+ const spns = (u as any)['servicePrincipalName'];
107
+ return spns && Array.isArray(spns) && spns.length > 0;
108
+ });
109
+
110
+ return {
111
+ type: 'KERBEROASTING_RISK',
112
+ severity: 'high',
113
+ category: 'kerberos',
114
+ title: 'Kerberoasting Risk',
115
+ description: 'User accounts with Service Principal Names (SPNs). Vulnerable to Kerberoasting attacks to crack service account passwords.',
116
+ count: affected.length,
117
+ affectedEntities: includeDetails ? toAffectedUserEntities(affected) : undefined,
118
+ };
119
+ }
120
+
121
+ /**
122
+ * Check for constrained delegation
123
+ * UAC flag 0x1000000 = TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION
124
+ */
125
+ export function detectConstrainedDelegation(users: ADUser[], includeDetails: boolean): Finding {
126
+ const affected = users.filter((u) => {
127
+ if (!u.userAccountControl) return false;
128
+ return (u.userAccountControl & 0x1000000) !== 0;
129
+ });
130
+
131
+ return {
132
+ type: 'CONSTRAINED_DELEGATION',
133
+ severity: 'high',
134
+ category: 'kerberos',
135
+ title: 'Constrained Delegation',
136
+ description: 'User accounts with constrained Kerberos delegation configured (UAC 0x1000000). Can impersonate users to specific services.',
137
+ count: affected.length,
138
+ affectedEntities: includeDetails ? toAffectedUserEntities(affected) : undefined,
139
+ };
140
+ }
141
+
142
+ /**
143
+ * Check for weak DES encryption
144
+ * Checks both UAC flag 0x200000 (USE_DES_KEY_ONLY) and msDS-SupportedEncryptionTypes
145
+ * DES_CBC_CRC = 0x1, DES_CBC_MD5 = 0x2
146
+ */
147
+ export function detectWeakEncryptionDES(users: ADUser[], includeDetails: boolean): Finding {
148
+ const DES_TYPES = 0x3; // DES_CBC_CRC (0x1) | DES_CBC_MD5 (0x2)
149
+
150
+ const affected = users.filter((u) => {
151
+ // Check UAC flag USE_DES_KEY_ONLY
152
+ if (u.userAccountControl && (u.userAccountControl & 0x200000) !== 0) {
153
+ return true;
154
+ }
155
+ // Check msDS-SupportedEncryptionTypes for DES support
156
+ const encTypes = (u as any)['msDS-SupportedEncryptionTypes'];
157
+ if (typeof encTypes === 'number' && (encTypes & DES_TYPES) !== 0) {
158
+ return true;
159
+ }
160
+ return false;
161
+ });
162
+
163
+ return {
164
+ type: 'WEAK_ENCRYPTION_DES',
165
+ severity: 'high',
166
+ category: 'kerberos',
167
+ title: 'Weak DES Encryption',
168
+ description: 'User accounts with DES encryption algorithms enabled (UAC 0x200000 or msDS-SupportedEncryptionTypes). DES is cryptographically broken.',
169
+ count: affected.length,
170
+ affectedEntities: includeDetails ? toAffectedUserEntities(affected) : undefined,
171
+ };
172
+ }
173
+
174
+ /**
175
+ * Check for privileged accounts vulnerable to AS-REP Roasting
176
+ * High-value targets (Domain Admins, Enterprise Admins, etc.) without pre-auth
177
+ */
178
+ export function detectAdminAsrepRoastable(users: ADUser[], includeDetails: boolean): Finding {
179
+ const privilegedGroups = [
180
+ 'Domain Admins',
181
+ 'Enterprise Admins',
182
+ 'Schema Admins',
183
+ 'Administrators',
184
+ 'Account Operators',
185
+ 'Backup Operators',
186
+ 'Server Operators',
187
+ ];
188
+
189
+ const affected = users.filter((u) => {
190
+ // Check for DONT_REQ_PREAUTH flag
191
+ if (!u.userAccountControl || (u.userAccountControl & 0x400000) === 0) {
192
+ return false;
193
+ }
194
+ // Check if user is in a privileged group
195
+ if (!u.memberOf) return false;
196
+ return u.memberOf.some((dn) =>
197
+ privilegedGroups.some((group) => dn.toUpperCase().includes(`CN=${group.toUpperCase()}`))
198
+ );
199
+ });
200
+
201
+ return {
202
+ type: 'ADMIN_ASREP_ROASTABLE',
203
+ severity: 'critical',
204
+ category: 'kerberos',
205
+ title: 'Privileged Account AS-REP Roastable',
206
+ description:
207
+ 'Privileged accounts (Domain Admins, Enterprise Admins, etc.) without Kerberos pre-authentication. ' +
208
+ 'High-value targets for AS-REP roasting attacks - immediate domain compromise risk.',
209
+ count: affected.length,
210
+ affectedEntities: includeDetails ? toAffectedUserEntities(affected) : undefined,
211
+ details: affected.length > 0 ? {
212
+ risk: 'CRITICAL - Privileged account password hash can be obtained offline',
213
+ recommendation: 'Enable Kerberos pre-authentication immediately for all privileged accounts',
214
+ } : undefined,
215
+ };
216
+ }
217
+
218
+ /**
219
+ * Check for RC4-only encryption (no AES)
220
+ */
221
+ export function detectWeakEncryptionRC4(users: ADUser[], includeDetails: boolean): Finding {
222
+ const affected = users.filter((u) => {
223
+ const encTypes = (u as any)['msDS-SupportedEncryptionTypes'];
224
+ if (typeof encTypes !== 'number') return false;
225
+ return (encTypes & 4) !== 0 && (encTypes & 24) === 0;
226
+ });
227
+
228
+ return {
229
+ type: 'WEAK_ENCRYPTION_RC4',
230
+ severity: 'medium',
231
+ category: 'kerberos',
232
+ title: 'Weak RC4 Encryption',
233
+ description: 'User accounts supporting RC4 encryption without AES. RC4 is deprecated and vulnerable to attacks.',
234
+ count: affected.length,
235
+ affectedEntities: includeDetails ? toAffectedUserEntities(affected) : undefined,
236
+ };
237
+ }
238
+
239
+ /**
240
+ * Check for USE_DES_KEY_ONLY flag
241
+ */
242
+ export function detectWeakEncryptionFlag(users: ADUser[], includeDetails: boolean): Finding {
243
+ const affected = users.filter((u) => {
244
+ if (!u.userAccountControl) return false;
245
+ return (u.userAccountControl & 0x200000) !== 0;
246
+ });
247
+
248
+ return {
249
+ type: 'WEAK_ENCRYPTION_FLAG',
250
+ severity: 'medium',
251
+ category: 'kerberos',
252
+ title: 'Weak Encryption Flag',
253
+ description: 'User accounts with USE_DES_KEY_ONLY flag enabled (UAC 0x200000). Forces weak DES encryption.',
254
+ count: affected.length,
255
+ affectedEntities: includeDetails ? toAffectedUserEntities(affected) : undefined,
256
+ };
257
+ }
258
+
259
+ /**
260
+ * Detect accounts with AES encryption disabled
261
+ *
262
+ * Accounts without AES support are limited to weaker DES/RC4 encryption,
263
+ * making them vulnerable to offline cracking attacks.
264
+ *
265
+ * @param users - Array of AD users
266
+ * @param includeDetails - Whether to include affected entity details
267
+ * @returns Finding for KERBEROS_AES_DISABLED
268
+ */
269
+ export function detectKerberosAesDisabled(users: ADUser[], includeDetails: boolean): Finding {
270
+ // msDS-SupportedEncryptionTypes: AES128=0x8, AES256=0x10
271
+ const AES_SUPPORT = 0x18;
272
+
273
+ const affected = users.filter((u) => {
274
+ if (!u.enabled) return false;
275
+ const encTypes = (u as Record<string, unknown>)['msDS-SupportedEncryptionTypes'] as
276
+ | number
277
+ | undefined;
278
+ // If explicitly set and doesn't include AES
279
+ if (encTypes !== undefined && (encTypes & AES_SUPPORT) === 0) {
280
+ return true;
281
+ }
282
+ // If UAC indicates DES-only (0x200000 = USE_DES_KEY_ONLY)
283
+ if (u.userAccountControl && (u.userAccountControl & 0x200000) !== 0) {
284
+ return true;
285
+ }
286
+ return false;
287
+ });
288
+
289
+ return {
290
+ type: 'KERBEROS_AES_DISABLED',
291
+ severity: 'high',
292
+ category: 'kerberos',
293
+ title: 'AES Encryption Disabled',
294
+ description:
295
+ 'User accounts with AES Kerberos encryption disabled. ' +
296
+ 'Forces use of weaker DES/RC4 encryption vulnerable to offline attacks.',
297
+ count: affected.length,
298
+ affectedEntities: includeDetails ? toAffectedUserEntities(affected) : undefined,
299
+ };
300
+ }
301
+
302
+ /**
303
+ * Detect accounts with RC4 fallback enabled
304
+ *
305
+ * While AES may be supported, RC4 fallback allows downgrade attacks.
306
+ *
307
+ * @param users - Array of AD users
308
+ * @param includeDetails - Whether to include affected entity details
309
+ * @returns Finding for KERBEROS_RC4_FALLBACK
310
+ */
311
+ export function detectKerberosRc4Fallback(users: ADUser[], includeDetails: boolean): Finding {
312
+ // RC4_HMAC_MD5 = 0x4
313
+ const RC4_SUPPORT = 0x4;
314
+ const AES_SUPPORT = 0x18;
315
+
316
+ const affected = users.filter((u) => {
317
+ if (!u.enabled) return false;
318
+ const encTypes = (u as Record<string, unknown>)['msDS-SupportedEncryptionTypes'] as
319
+ | number
320
+ | undefined;
321
+ if (encTypes === undefined) return false;
322
+ // Has both AES and RC4 - RC4 should be disabled
323
+ const hasAes = (encTypes & AES_SUPPORT) !== 0;
324
+ const hasRc4 = (encTypes & RC4_SUPPORT) !== 0;
325
+ return hasAes && hasRc4;
326
+ });
327
+
328
+ return {
329
+ type: 'KERBEROS_RC4_FALLBACK',
330
+ severity: 'medium',
331
+ category: 'kerberos',
332
+ title: 'RC4 Fallback Enabled',
333
+ description:
334
+ 'User accounts support both AES and RC4 encryption. ' +
335
+ 'RC4 fallback enables downgrade attacks even when AES is available.',
336
+ count: affected.length,
337
+ affectedEntities: includeDetails ? toAffectedUserEntities(affected) : undefined,
338
+ details: {
339
+ recommendation: 'Disable RC4 support when AES is available.',
340
+ },
341
+ };
342
+ }
343
+
344
+ /**
345
+ * Detect long Kerberos ticket lifetime (domain level)
346
+ *
347
+ * Very long ticket lifetimes increase the window for ticket theft attacks.
348
+ *
349
+ * @param _users - Array of AD users (not used, domain-level check)
350
+ * @param _includeDetails - Whether to include affected entity details
351
+ * @returns Finding for KERBEROS_TICKET_LIFETIME_LONG
352
+ */
353
+ export function detectKerberosTicketLifetimeLong(
354
+ _users: ADUser[],
355
+ _includeDetails: boolean
356
+ ): Finding {
357
+ // This detection would need domain Kerberos policy data
358
+ // For now, return a placeholder that reminds to check
359
+ return {
360
+ type: 'KERBEROS_TICKET_LIFETIME_LONG',
361
+ severity: 'medium',
362
+ category: 'kerberos',
363
+ title: 'Kerberos Ticket Lifetime Review',
364
+ description:
365
+ 'Kerberos ticket lifetime should be reviewed. ' +
366
+ 'Default of 10 hours is reasonable; longer lifetimes increase attack window.',
367
+ count: 0, // Would be 1 if ticket lifetime > 10 hours detected
368
+ details: {
369
+ recommendation: 'TGT lifetime should not exceed 10 hours. Service tickets should not exceed 600 minutes.',
370
+ checkCommand: 'gpresult /r or check Default Domain Policy',
371
+ },
372
+ };
373
+ }
374
+
375
+ /**
376
+ * Detect long renewable ticket lifetime
377
+ *
378
+ * Very long renewable ticket lifetimes allow persistent access.
379
+ *
380
+ * @param _users - Array of AD users (not used, domain-level check)
381
+ * @param _includeDetails - Whether to include affected entity details
382
+ * @returns Finding for KERBEROS_RENEWABLE_TICKET_LONG
383
+ */
384
+ export function detectKerberosRenewableTicketLong(
385
+ _users: ADUser[],
386
+ _includeDetails: boolean
387
+ ): Finding {
388
+ // This detection would need domain Kerberos policy data
389
+ return {
390
+ type: 'KERBEROS_RENEWABLE_TICKET_LONG',
391
+ severity: 'low',
392
+ category: 'kerberos',
393
+ title: 'Kerberos Renewable Ticket Lifetime Review',
394
+ description:
395
+ 'Renewable ticket lifetime should be reviewed. ' +
396
+ 'Default of 7 days is reasonable; longer allows persistent access with stolen tickets.',
397
+ count: 0, // Would be 1 if renewable lifetime > 7 days detected
398
+ details: {
399
+ recommendation: 'Renewable TGT lifetime should not exceed 7 days.',
400
+ },
401
+ };
402
+ }
403
+
404
+ /**
405
+ * Detect all Kerberos-related vulnerabilities
406
+ */
407
+ export function detectKerberosVulnerabilities(users: ADUser[], includeDetails: boolean): Finding[] {
408
+ return [
409
+ detectAsrepRoastingRisk(users, includeDetails),
410
+ detectAdminAsrepRoastable(users, includeDetails), // NEW: Privileged accounts with ASREP risk
411
+ detectUnconstrainedDelegation(users, includeDetails),
412
+ detectGoldenTicketRisk(users, includeDetails),
413
+ detectKerberoastingRisk(users, includeDetails),
414
+ detectConstrainedDelegation(users, includeDetails),
415
+ detectWeakEncryptionDES(users, includeDetails),
416
+ detectWeakEncryptionRC4(users, includeDetails),
417
+ detectWeakEncryptionFlag(users, includeDetails),
418
+ // Phase 4: Advanced Kerberos detections
419
+ detectKerberosAesDisabled(users, includeDetails),
420
+ detectKerberosRc4Fallback(users, includeDetails),
421
+ detectKerberosTicketLifetimeLong(users, includeDetails),
422
+ detectKerberosRenewableTicketLong(users, includeDetails),
423
+ ].filter((finding) => finding.count > 0);
424
+ }