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