redposture 5.25__py3-none-any.whl

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 (307) hide show
  1. redposture-5.25.dist-info/METADATA +636 -0
  2. redposture-5.25.dist-info/RECORD +307 -0
  3. redposture-5.25.dist-info/WHEEL +4 -0
  4. redposture-5.25.dist-info/entry_points.txt +2 -0
  5. redposture-5.25.dist-info/licenses/LICENSE +21 -0
  6. redposture_core/__init__.py +12 -0
  7. redposture_core/audit_config.py +86 -0
  8. redposture_core/audit_models.py +315 -0
  9. redposture_core/auth_detection.py +172 -0
  10. redposture_core/cli.py +218 -0
  11. redposture_core/cli_args.py +677 -0
  12. redposture_core/cli_modules/__init__.py +1 -0
  13. redposture_core/cli_modules/airflow.py +95 -0
  14. redposture_core/cli_modules/clickhouse.py +218 -0
  15. redposture_core/cli_modules/consul.py +235 -0
  16. redposture_core/cli_modules/datastores.py +377 -0
  17. redposture_core/cli_modules/docker_engine.py +77 -0
  18. redposture_core/cli_modules/elastic.py +122 -0
  19. redposture_core/cli_modules/exporters.py +332 -0
  20. redposture_core/cli_modules/gitlab.py +91 -0
  21. redposture_core/cli_modules/grafana.py +120 -0
  22. redposture_core/cli_modules/grpc.py +189 -0
  23. redposture_core/cli_modules/jenkins.py +74 -0
  24. redposture_core/cli_modules/keeper.py +74 -0
  25. redposture_core/cli_modules/keycloak.py +69 -0
  26. redposture_core/cli_modules/kubeapi.py +128 -0
  27. redposture_core/cli_modules/minio.py +129 -0
  28. redposture_core/cli_modules/mongodb.py +187 -0
  29. redposture_core/cli_modules/oci_registry.py +68 -0
  30. redposture_core/cli_modules/oracle.py +224 -0
  31. redposture_core/cli_modules/postgres.py +218 -0
  32. redposture_core/cli_modules/proxmox.py +119 -0
  33. redposture_core/cli_modules/qdrant.py +109 -0
  34. redposture_core/cli_modules/rabbitmq.py +58 -0
  35. redposture_core/cli_modules/spray.py +59 -0
  36. redposture_core/cli_modules/zookeeper.py +181 -0
  37. redposture_core/clients/__init__.py +1 -0
  38. redposture_core/clients/airflow_api.py +147 -0
  39. redposture_core/clients/docker_engine.py +390 -0
  40. redposture_core/clients/grpc.py +2185 -0
  41. redposture_core/clients/http_api.py +1027 -0
  42. redposture_core/clients/http_redirects.py +117 -0
  43. redposture_core/clients/http_session.py +402 -0
  44. redposture_core/clients/kafka.py +2796 -0
  45. redposture_core/clients/minio_api.py +265 -0
  46. redposture_core/clients/mongodb.py +348 -0
  47. redposture_core/clients/oracle.py +1345 -0
  48. redposture_core/clients/rabbitmq_api.py +150 -0
  49. redposture_core/clients/s3_sigv4.py +114 -0
  50. redposture_core/clients/scoped_http.py +56 -0
  51. redposture_core/clients/tls_cache.py +119 -0
  52. redposture_core/clients/transport.py +114 -0
  53. redposture_core/clients/zookeeper.py +1615 -0
  54. redposture_core/console.py +195 -0
  55. redposture_core/constants.py +619 -0
  56. redposture_core/cve.py +780 -0
  57. redposture_core/data/cve_catalog.json +5648 -0
  58. redposture_core/discovery_options.py +47 -0
  59. redposture_core/discovery_rendering.py +107 -0
  60. redposture_core/exporters/__init__.py +27 -0
  61. redposture_core/exporters/artifacts.py +118 -0
  62. redposture_core/exporters/collect.py +563 -0
  63. redposture_core/exporters/detection.py +48 -0
  64. redposture_core/exporters/discover.py +460 -0
  65. redposture_core/exporters/discovery_logic.py +264 -0
  66. redposture_core/exporters/http_client.py +301 -0
  67. redposture_core/exporters/http_pool.py +270 -0
  68. redposture_core/exporters/output.py +173 -0
  69. redposture_core/exporters/postprocess.py +83 -0
  70. redposture_core/exporters/trigger.py +649 -0
  71. redposture_core/exporters/workflows.py +190 -0
  72. redposture_core/listener_runtime.py +291 -0
  73. redposture_core/logger.py +474 -0
  74. redposture_core/module_registry.py +573 -0
  75. redposture_core/modules/__init__.py +0 -0
  76. redposture_core/modules/airflow/__init__.py +1 -0
  77. redposture_core/modules/airflow/actions.py +834 -0
  78. redposture_core/modules/airflow/discover.py +623 -0
  79. redposture_core/modules/airflow/policy.py +29 -0
  80. redposture_core/modules/airflow/render.py +297 -0
  81. redposture_core/modules/airflow/stage.py +108 -0
  82. redposture_core/modules/airflow/types.py +54 -0
  83. redposture_core/modules/clickhouse/__init__.py +5 -0
  84. redposture_core/modules/clickhouse/actions.py +3826 -0
  85. redposture_core/modules/clickhouse/discover/__init__.py +5 -0
  86. redposture_core/modules/clickhouse/discover/checkpoint.py +122 -0
  87. redposture_core/modules/clickhouse/discover/engine.py +510 -0
  88. redposture_core/modules/clickhouse/discover/inventory.py +193 -0
  89. redposture_core/modules/clickhouse/discover/models.py +72 -0
  90. redposture_core/modules/clickhouse/discover/reader.py +92 -0
  91. redposture_core/modules/clickhouse/policy.py +122 -0
  92. redposture_core/modules/clickhouse/render.py +40 -0
  93. redposture_core/modules/clickhouse/stage.py +550 -0
  94. redposture_core/modules/clickhouse/types.py +5 -0
  95. redposture_core/modules/consul/__init__.py +5 -0
  96. redposture_core/modules/consul/actions.py +4167 -0
  97. redposture_core/modules/consul/policy.py +97 -0
  98. redposture_core/modules/consul/render.py +34 -0
  99. redposture_core/modules/consul/stage.py +281 -0
  100. redposture_core/modules/consul/types.py +5 -0
  101. redposture_core/modules/docker/__init__.py +5 -0
  102. redposture_core/modules/docker/actions.py +886 -0
  103. redposture_core/modules/docker/policy.py +25 -0
  104. redposture_core/modules/docker/render.py +31 -0
  105. redposture_core/modules/docker/stage.py +58 -0
  106. redposture_core/modules/docker/types.py +5 -0
  107. redposture_core/modules/docker_registry/__init__.py +1 -0
  108. redposture_core/modules/docker_registry/actions.py +3 -0
  109. redposture_core/modules/docker_registry/policy.py +3 -0
  110. redposture_core/modules/docker_registry/render.py +3 -0
  111. redposture_core/modules/docker_registry/stage.py +18 -0
  112. redposture_core/modules/docker_registry/types.py +3 -0
  113. redposture_core/modules/elastic/__init__.py +5 -0
  114. redposture_core/modules/elastic/actions.py +5366 -0
  115. redposture_core/modules/elastic/discover.py +2770 -0
  116. redposture_core/modules/elastic/http_session.py +337 -0
  117. redposture_core/modules/elastic/policy.py +17 -0
  118. redposture_core/modules/elastic/render.py +21 -0
  119. redposture_core/modules/elastic/stage.py +326 -0
  120. redposture_core/modules/elastic/types.py +5 -0
  121. redposture_core/modules/etcd/__init__.py +5 -0
  122. redposture_core/modules/etcd/actions.py +1573 -0
  123. redposture_core/modules/etcd/policy.py +14 -0
  124. redposture_core/modules/etcd/render.py +23 -0
  125. redposture_core/modules/etcd/stage.py +75 -0
  126. redposture_core/modules/etcd/types.py +5 -0
  127. redposture_core/modules/gitlab/__init__.py +5 -0
  128. redposture_core/modules/gitlab/actions.py +1870 -0
  129. redposture_core/modules/gitlab/policy.py +14 -0
  130. redposture_core/modules/gitlab/render.py +137 -0
  131. redposture_core/modules/gitlab/stage.py +327 -0
  132. redposture_core/modules/gitlab/types.py +5 -0
  133. redposture_core/modules/grafana/__init__.py +5 -0
  134. redposture_core/modules/grafana/actions.py +1808 -0
  135. redposture_core/modules/grafana/policy.py +14 -0
  136. redposture_core/modules/grafana/render.py +23 -0
  137. redposture_core/modules/grafana/stage.py +163 -0
  138. redposture_core/modules/grafana/types.py +5 -0
  139. redposture_core/modules/grpc/__init__.py +5 -0
  140. redposture_core/modules/grpc/actions.py +2359 -0
  141. redposture_core/modules/grpc/policy.py +47 -0
  142. redposture_core/modules/grpc/render.py +23 -0
  143. redposture_core/modules/grpc/stage.py +349 -0
  144. redposture_core/modules/grpc/types.py +5 -0
  145. redposture_core/modules/harbor/__init__.py +1 -0
  146. redposture_core/modules/harbor/actions.py +3 -0
  147. redposture_core/modules/harbor/policy.py +3 -0
  148. redposture_core/modules/harbor/render.py +3 -0
  149. redposture_core/modules/harbor/stage.py +18 -0
  150. redposture_core/modules/harbor/types.py +3 -0
  151. redposture_core/modules/jenkins/__init__.py +1 -0
  152. redposture_core/modules/jenkins/actions.py +439 -0
  153. redposture_core/modules/jenkins/policy.py +37 -0
  154. redposture_core/modules/jenkins/render.py +204 -0
  155. redposture_core/modules/jenkins/stage.py +129 -0
  156. redposture_core/modules/jenkins/types.py +9 -0
  157. redposture_core/modules/kafka/__init__.py +5 -0
  158. redposture_core/modules/kafka/actions.py +2370 -0
  159. redposture_core/modules/kafka/policy.py +72 -0
  160. redposture_core/modules/kafka/render.py +131 -0
  161. redposture_core/modules/kafka/stage.py +271 -0
  162. redposture_core/modules/kafka/types.py +5 -0
  163. redposture_core/modules/kafka/ui.py +354 -0
  164. redposture_core/modules/keeper/__init__.py +5 -0
  165. redposture_core/modules/keeper/actions.py +157 -0
  166. redposture_core/modules/keeper/ddl.py +355 -0
  167. redposture_core/modules/keeper/interactive.py +202 -0
  168. redposture_core/modules/keeper/policy.py +28 -0
  169. redposture_core/modules/keeper/render.py +125 -0
  170. redposture_core/modules/keeper/stage.py +342 -0
  171. redposture_core/modules/keeper/types.py +12 -0
  172. redposture_core/modules/keycloak/__init__.py +1 -0
  173. redposture_core/modules/keycloak/actions.py +539 -0
  174. redposture_core/modules/keycloak/policy.py +40 -0
  175. redposture_core/modules/keycloak/render.py +178 -0
  176. redposture_core/modules/keycloak/stage.py +87 -0
  177. redposture_core/modules/keycloak/types.py +9 -0
  178. redposture_core/modules/kubeapi/__init__.py +5 -0
  179. redposture_core/modules/kubeapi/actions.py +3224 -0
  180. redposture_core/modules/kubeapi/http_session.py +231 -0
  181. redposture_core/modules/kubeapi/policy.py +22 -0
  182. redposture_core/modules/kubeapi/render.py +27 -0
  183. redposture_core/modules/kubeapi/stage.py +192 -0
  184. redposture_core/modules/kubeapi/types.py +5 -0
  185. redposture_core/modules/minio/__init__.py +1 -0
  186. redposture_core/modules/minio/actions.py +1027 -0
  187. redposture_core/modules/minio/discover.py +324 -0
  188. redposture_core/modules/minio/enumerate.py +162 -0
  189. redposture_core/modules/minio/policy.py +40 -0
  190. redposture_core/modules/minio/render.py +422 -0
  191. redposture_core/modules/minio/stage.py +106 -0
  192. redposture_core/modules/minio/types.py +44 -0
  193. redposture_core/modules/mongodb/__init__.py +5 -0
  194. redposture_core/modules/mongodb/actions.py +1497 -0
  195. redposture_core/modules/mongodb/policy.py +61 -0
  196. redposture_core/modules/mongodb/render.py +33 -0
  197. redposture_core/modules/mongodb/stage.py +196 -0
  198. redposture_core/modules/mongodb/types.py +5 -0
  199. redposture_core/modules/nexus/__init__.py +1 -0
  200. redposture_core/modules/nexus/actions.py +3 -0
  201. redposture_core/modules/nexus/policy.py +3 -0
  202. redposture_core/modules/nexus/render.py +3 -0
  203. redposture_core/modules/nexus/stage.py +18 -0
  204. redposture_core/modules/nexus/types.py +3 -0
  205. redposture_core/modules/oracle/__init__.py +5 -0
  206. redposture_core/modules/oracle/actions.py +2176 -0
  207. redposture_core/modules/oracle/policy.py +29 -0
  208. redposture_core/modules/oracle/render.py +21 -0
  209. redposture_core/modules/oracle/stage.py +118 -0
  210. redposture_core/modules/oracle/types.py +5 -0
  211. redposture_core/modules/postgres/__init__.py +5 -0
  212. redposture_core/modules/postgres/actions.py +3273 -0
  213. redposture_core/modules/postgres/policy.py +75 -0
  214. redposture_core/modules/postgres/render.py +37 -0
  215. redposture_core/modules/postgres/stage.py +880 -0
  216. redposture_core/modules/postgres/types.py +5 -0
  217. redposture_core/modules/proxmox/__init__.py +5 -0
  218. redposture_core/modules/proxmox/actions.py +2298 -0
  219. redposture_core/modules/proxmox/policy.py +26 -0
  220. redposture_core/modules/proxmox/render.py +62 -0
  221. redposture_core/modules/proxmox/stage.py +714 -0
  222. redposture_core/modules/proxmox/types.py +5 -0
  223. redposture_core/modules/qdrant/__init__.py +5 -0
  224. redposture_core/modules/qdrant/actions.py +1828 -0
  225. redposture_core/modules/qdrant/policy.py +39 -0
  226. redposture_core/modules/qdrant/render.py +19 -0
  227. redposture_core/modules/qdrant/stage.py +181 -0
  228. redposture_core/modules/qdrant/types.py +5 -0
  229. redposture_core/modules/rabbitmq/__init__.py +1 -0
  230. redposture_core/modules/rabbitmq/actions.py +378 -0
  231. redposture_core/modules/rabbitmq/policy.py +22 -0
  232. redposture_core/modules/rabbitmq/render.py +294 -0
  233. redposture_core/modules/rabbitmq/stage.py +110 -0
  234. redposture_core/modules/rabbitmq/types.py +5 -0
  235. redposture_core/modules/redis/__init__.py +5 -0
  236. redposture_core/modules/redis/actions.py +1712 -0
  237. redposture_core/modules/redis/policy.py +20 -0
  238. redposture_core/modules/redis/render.py +23 -0
  239. redposture_core/modules/redis/stage.py +115 -0
  240. redposture_core/modules/redis/types.py +5 -0
  241. redposture_core/modules/registry/__init__.py +5 -0
  242. redposture_core/modules/registry/actions.py +4138 -0
  243. redposture_core/modules/registry/policy.py +41 -0
  244. redposture_core/modules/registry/product_render.py +210 -0
  245. redposture_core/modules/registry/render.py +19 -0
  246. redposture_core/modules/registry/stage.py +219 -0
  247. redposture_core/modules/registry/types.py +5 -0
  248. redposture_core/modules/zookeeper/__init__.py +5 -0
  249. redposture_core/modules/zookeeper/actions.py +3533 -0
  250. redposture_core/modules/zookeeper/engine.py +357 -0
  251. redposture_core/modules/zookeeper/policy.py +28 -0
  252. redposture_core/modules/zookeeper/render.py +29 -0
  253. redposture_core/modules/zookeeper/stage.py +206 -0
  254. redposture_core/modules/zookeeper/types.py +82 -0
  255. redposture_core/network_proxy.py +410 -0
  256. redposture_core/profiles.py +202 -0
  257. redposture_core/progress.py +373 -0
  258. redposture_core/proto/__init__.py +7 -0
  259. redposture_core/proto/grpc_health.proto +23 -0
  260. redposture_core/proto/grpc_health_pb2.py +42 -0
  261. redposture_core/proto/grpc_reflection.proto +58 -0
  262. redposture_core/proto/grpc_reflection_pb2.py +52 -0
  263. redposture_core/rendering.py +493 -0
  264. redposture_core/scanner.py +314 -0
  265. redposture_core/scheduler.py +566 -0
  266. redposture_core/secret_detection.py +263 -0
  267. redposture_core/servers.py +1126 -0
  268. redposture_core/shell_capture.py +289 -0
  269. redposture_core/show_limits.py +88 -0
  270. redposture_core/spray_render.py +19 -0
  271. redposture_core/stage_clickhouse.py +63 -0
  272. redposture_core/stage_collect.py +1004 -0
  273. redposture_core/stage_consul.py +63 -0
  274. redposture_core/stage_docker.py +63 -0
  275. redposture_core/stage_elastic.py +63 -0
  276. redposture_core/stage_etcd.py +63 -0
  277. redposture_core/stage_gitlab.py +63 -0
  278. redposture_core/stage_grafana.py +63 -0
  279. redposture_core/stage_grpc.py +63 -0
  280. redposture_core/stage_kafka.py +63 -0
  281. redposture_core/stage_keeper.py +61 -0
  282. redposture_core/stage_kubeapi.py +63 -0
  283. redposture_core/stage_mongodb.py +63 -0
  284. redposture_core/stage_oracle.py +63 -0
  285. redposture_core/stage_postgres.py +63 -0
  286. redposture_core/stage_proxmox.py +63 -0
  287. redposture_core/stage_qdrant.py +63 -0
  288. redposture_core/stage_redis.py +63 -0
  289. redposture_core/stage_registry.py +63 -0
  290. redposture_core/stage_runtime.py +3720 -0
  291. redposture_core/stage_scan.py +515 -0
  292. redposture_core/stage_selfcert.py +75 -0
  293. redposture_core/stage_spray.py +1001 -0
  294. redposture_core/stage_trigger.py +1344 -0
  295. redposture_core/stage_validate.py +21 -0
  296. redposture_core/stage_zookeeper.py +63 -0
  297. redposture_core/targeting.py +1264 -0
  298. redposture_core/transport_contract.py +36 -0
  299. redposture_core/utils.py +394 -0
  300. redposture_core/validate/__init__.py +5 -0
  301. redposture_core/validate/artifacts.py +138 -0
  302. redposture_core/validate/context.py +420 -0
  303. redposture_core/validate/engine.py +829 -0
  304. redposture_core/validate/parsers.py +1465 -0
  305. redposture_core/validate/render.py +441 -0
  306. redposture_core/validate/scoring.py +247 -0
  307. redposture_core/zookeeper_defaults.py +73 -0
@@ -0,0 +1,636 @@
1
+ Metadata-Version: 2.5
2
+ Name: redposture
3
+ Version: 5.25
4
+ Summary: Security toolkit for listener emulation, endpoint discovery/trigger/collect, and Redis/Postgres/MongoDB/Docker/Oracle/ClickHouse/etcd/Docker Registry/Harbor/Nexus/Grafana/Keycloak/Jenkins/GitLab/Kafka/ZooKeeper/Keeper/Elasticsearch/gRPC/MinIO auditing
5
+ Project-URL: Homepage, https://github.com/MelForze/Redposture
6
+ Project-URL: Repository, https://github.com/MelForze/Redposture
7
+ Project-URL: Issues, https://github.com/MelForze/Redposture/issues
8
+ Author: RedPosture contributors
9
+ License: MIT License
10
+
11
+ Copyright (c) 2026 RedPosture contributors
12
+
13
+ Permission is hereby granted, free of charge, to any person obtaining a copy
14
+ of this software and associated documentation files (the "Software"), to deal
15
+ in the Software without restriction, including without limitation the rights
16
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17
+ copies of the Software, and to permit persons to whom the Software is
18
+ furnished to do so, subject to the following conditions:
19
+
20
+ The above copyright notice and this permission notice shall be included in all
21
+ copies or substantial portions of the Software.
22
+
23
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29
+ SOFTWARE.
30
+ License-File: LICENSE
31
+ Keywords: cli,observability,prometheus,recon,redteam,security
32
+ Classifier: Development Status :: 3 - Alpha
33
+ Classifier: Intended Audience :: Information Technology
34
+ Classifier: License :: OSI Approved :: MIT License
35
+ Classifier: Operating System :: OS Independent
36
+ Classifier: Programming Language :: Python :: 3
37
+ Classifier: Programming Language :: Python :: 3 :: Only
38
+ Classifier: Programming Language :: Python :: 3.12
39
+ Classifier: Programming Language :: Python :: 3.13
40
+ Classifier: Programming Language :: Python :: 3.14
41
+ Classifier: Topic :: Security
42
+ Classifier: Topic :: System :: Networking
43
+ Requires-Python: >=3.12
44
+ Requires-Dist: clickhouse-connect>=0.8.0
45
+ Requires-Dist: clickhouse-driver>=0.2.9
46
+ Requires-Dist: grpcio-tools<1.81.0,>=1.74.0
47
+ Requires-Dist: h2>=4.1.0
48
+ Requires-Dist: oracledb<4,>=2.4
49
+ Requires-Dist: protobuf<7.0.0,>=6.31.1
50
+ Requires-Dist: pymongo<5,>=4.7
51
+ Provides-Extra: dev
52
+ Requires-Dist: hypothesis>=6.112.0; extra == 'dev'
53
+ Requires-Dist: mypy>=1.11.0; extra == 'dev'
54
+ Requires-Dist: pre-commit>=3.5.0; extra == 'dev'
55
+ Requires-Dist: pytest-cov>=5.0.0; extra == 'dev'
56
+ Requires-Dist: pytest-socket==0.8.1; extra == 'dev'
57
+ Requires-Dist: pytest>=8.3.0; extra == 'dev'
58
+ Requires-Dist: ruff>=0.6.0; extra == 'dev'
59
+ Requires-Dist: tomlkit>=0.13.2; extra == 'dev'
60
+ Provides-Extra: kafka-codecs
61
+ Requires-Dist: lz4>=4.3.3; extra == 'kafka-codecs'
62
+ Requires-Dist: python-snappy>=0.7.3; extra == 'kafka-codecs'
63
+ Requires-Dist: zstandard>=0.23.0; extra == 'kafka-codecs'
64
+ Description-Content-Type: text/markdown
65
+
66
+ <p align="center">
67
+ <a href="https://deepwiki.com/MelForze/Redposture">
68
+ <img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki">
69
+ </a>
70
+ <a href="https://github.com/MelForze/Redposture/blob/main/LICENSE">
71
+ <img src="https://img.shields.io/github/license/MelForze/Redposture?style=flat-square" alt="License">
72
+ </a>
73
+ <a href="https://github.com/MelForze/Redposture/actions/workflows/ci.yml">
74
+ <img src="https://img.shields.io/github/actions/workflow/status/MelForze/Redposture/ci.yml?branch=main&style=flat-square&label=CI" alt="CI">
75
+ </a>
76
+ <a href="https://github.com/MelForze/Redposture/releases">
77
+ <img src="https://img.shields.io/github/v/tag/MelForze/Redposture?style=flat-square&label=version" alt="Latest version">
78
+ </a>
79
+ <img src="https://img.shields.io/badge/modules-25-2b2f36?style=flat-square" alt="Modules">
80
+ <img src="https://img.shields.io/badge/Python-3.12%2B-2b2f36?style=flat-square" alt="Python 3.12+">
81
+ <img src="https://img.shields.io/badge/install-pipx-2b2f36?style=flat-square" alt="Install with pipx">
82
+ </p>
83
+
84
+
85
+ # RedPosture
86
+
87
+ CLI for authorized audits of exposed services: identify the product, verify access,
88
+ enumerate data, find secrets, and match versions against an offline CVE catalog.
89
+ Python 3.12+; 26 audit modules, credential spray, and exporter scan/collect/trigger workflows.
90
+
91
+ ## Install
92
+
93
+ ```bash
94
+ pipx install "git+https://github.com/MelForze/Redposture.git"
95
+ redposture --version
96
+ ```
97
+
98
+ ## Usage
99
+
100
+ - `-t`: host, URL, CIDR, IPv4 range, comma-separated list or target file; `--port`:
101
+ port, list or range. `-ot, --out-target` accepts exclusions in the same formats:
102
+ `--out-target exclusions.txt` removes matching hosts before ports are expanded.
103
+ - `-u/-p`, module-specific token flags or `--defcreds` perform real login checks.
104
+ `-o results.txt` writes TXT, `-f json` writes structured results, and `--debug`
105
+ shows diagnostics. See `redposture <module> -h` for all flags.
106
+
107
+ TXT shows confirmed services only. Generic login/SSO pages, HTTP status codes and
108
+ an isolated `version` field do not confirm a product or start auth, discovery or CVE
109
+ checks. Unconfirmed results and pre-detection errors remain in debug/JSON. JSON
110
+ includes `detection_status` (`confirmed`, `probable`, `not_service`,
111
+ `transport_failure`), `detection_signals` and any older `detection_detail_status`.
112
+ With no confirmed service, one `No MODULE service detected` line includes the
113
+ unreachable count; if nonzero it uses `[!]` and exits nonzero. Post-detection
114
+ errors stay visible.
115
+ SSO appears as `auth required:sso`; verified/rejected credentials use `[+]`/`[-]`.
116
+ Inconclusive pairs appear only in debug/JSON.
117
+
118
+ Main workers: 64 for fewer than 1000 expanded `host:port` tasks, otherwise 128
119
+ (`-w` overrides). Shared nested workers: 32/64, capped by `-w`; per-target discovery
120
+ limits are MinIO/Elastic/Proxmox 8 and ClickHouse 4 (`max_threads=1` per query).
121
+ Audit targets stream continuously through a bounded queue. Multi-target scans show
122
+ address and `host:port` counts by port before starting; this plan stays out of
123
+ saved TXT/JSON. Exporters use separate schedulers.
124
+
125
+ Postgres and ClickHouse `--os-shell` show command exit status and separate
126
+ stdout/stderr. Binary output gets a safe hex preview; use `:hex [stdout|stderr]
127
+ [bytes]`, `:base64 [stdout|stderr] [bytes]`, or `:save [stdout|stderr]
128
+ <local-path>` for captured bytes. `:limit 16M` changes the per-stream capture
129
+ budget (default 8 MiB, maximum 50 MiB); `:help` lists local commands.
130
+ `:save` never overwrites an existing file. A truncated capture is marked
131
+ partial, and an interrupted command is never replayed automatically.
132
+ Docker/KubeAPI exec include Base64 fields in JSON for binary output; Oracle
133
+ Scheduler captures at most 8 KiB per stream when readback is available.
134
+
135
+ `--discover` covers Airflow, MinIO, Elastic/OpenSearch, ClickHouse and Proxmox.
136
+ The default budget is 50 MiB per target. Only Elastic/OpenSearch has a default
137
+ deadline (300 s); other modules have no default time or item cap. Use
138
+ `--discover-max-bytes`/`--discover-time` to override.
139
+ Findings stream live; incomplete scans are marked partial. ClickHouse supports
140
+ `--checkpoint`/`--resume`.
141
+
142
+ HTTP checks may follow redirects across scheme, host and port with supplied
143
+ credentials. The URL scheme selects the first attempt; a canonical HTTP 400
144
+ requiring HTTPS retries safe GET/HEAD discovery. Later checks reuse the resolved
145
+ origin, while changing requests are not replayed
146
+ to select a scheme. Target TLS accepts self-signed certificates by default;
147
+ where supported, a CA file enables certificate and hostname verification. mTLS
148
+ needs a client certificate and key. For a reverse proxy, supply its mounted URL (for example
149
+ `https://host/airflow/api/v1/version`) and the DNS name required for Host/SNI;
150
+ the module retains the URL prefix after removing a known API suffix.
151
+ In HTTP audit modules, a URL without a port uses 80 for `http` or 443 for
152
+ `https`; bare hosts still use the module's port list. An explicit URL port or
153
+ `--port` overrides the scheme default. ClickHouse treats an HTTP(S) URL as an
154
+ HTTP target unless `--protocol` was explicitly selected.
155
+
156
+ `spray` checks supplied pairs or tokens only after a module confirms the product.
157
+ It does not run inventory, discovery, or CVE checks. A bare host uses the selected
158
+ modules' normal ports; a URL or `host:port` keeps its explicit port.
159
+ With multiple modules, TXT prints each target as one block after its attempts
160
+ finish; JSON stays live. Rate limits can therefore delay a target's TXT block.
161
+
162
+ ```bash
163
+ redposture spray -t targets.txt --modules airflow,grafana --pairs pairs.txt -o spray.txt
164
+ redposture spray -t targets.txt --modules keycloak,kubeapi --tokens tokens.txt --checkpoint spray.sqlite3 -o spray-tokens.txt
165
+ redposture spray -t targets.txt --modules all --users users.txt --passwords passwords.txt --origin-rate 2 --account-interval 60 -o spray-all.txt
166
+ redposture spray -t targets.txt --modules airflow -u admin -p @passwords.txt -o spray-admin.txt
167
+ redposture spray -t targets.txt --modules all --users users.txt --passwords passwords.txt --origin-rate 2 --account-interval 60 --checkpoint spray-all.txt.checkpoint.sqlite3 --resume -o spray-all.txt
168
+ ```
169
+
170
+ Pairs use the first colon as separator. `-u/--users` and `-p/--passwords`
171
+ each accept a literal or an existing file; prefix a filename with `@` to
172
+ require that it exists. Sources can be mixed, and each password is tried
173
+ across all users before the next password. Results and the raw
174
+ secrets appear in terminal, TXT, and JSON as requested; output and checkpoint
175
+ files are mode `0600`. A begun attempt interrupted before its result becomes
176
+ `inconclusive` on resume and is not retried. `--module-config` accepts only
177
+ auth/transport settings, such as `{"keeper":{"znode":"/protected"}}` or
178
+ `{"keycloak":{"realm":"master"}}`; action flags are rejected. Docker Engine
179
+ pairs and Keycloak pairs report `unsupported` because those modules cannot
180
+ verify them. `redposture spray -h` lists all options.
181
+
182
+ ## Default credentials checked by `--defcreds`
183
+
184
+ | Module | Credential pairs checked |
185
+ | --- | --- |
186
+ | Grafana | `admin:admin`, `admin:changeme`, `admin:grafana`, `admin:password`, `grafana:grafana`, `grafana:password`, `root:password`, `root:root`, `user:password`, `user:user`, `admin:12345678` |
187
+ | MinIO | `minioadmin:minioadmin`, `minio:minio123`, `minioadmin:minio123`, `minioadmin:password`, `admin:admin`, `admin:minioadmin`, `admin:password`, `root:minioadmin`, `root:password`, `minio:minio`, `access:secret`, `minioadmin:12345678` |
188
+ | Proxmox | `admin@pam:admin`, `admin@pve:admin`, `admin@pve:password`, `root@pam:admin`, `root@pam:changeme`, `root@pam:password`, `root@pam:proxmox`, `root@pam:Proxmox123`, `root@pam:root`, `root@pam:toor`, `root@pam:12345678` |
189
+ | Postgres | `admin:admin`, `admin:password`, `admin:postgres`, `dev:dev`, `pgbouncer:pgbouncer`, `pgbouncer_exporter:pgbouncer_exporter`, `pgsql:pgsql`, `postgres:admin`, `postgres:changeme`, `postgres:password`, `postgres:postgres`, `service:service`, `test:test`, `user:password`, `user:user`, `postgres:12345678` |
190
+ | MongoDB | `admin:admin`, `admin:changeme`, `admin:mongo`, `admin:mongodb`, `admin:password`, `dev:dev`, `mongo:mongo`, `mongo:password`, `mongodb:mongodb`, `mongodb:password`, `root:admin`, `root:mongo`, `root:mongodb`, `root:password`, `root:root`, `test:test`, `user:password`, `user:user`, `admin:12345678` |
191
+ | Oracle | `admin:admin`, `admin:changeme`, `admin:oracle`, `admin:password`, `dbsnmp:dbsnmp`, `dev:dev`, `hr:hr`, `outln:outln`, `pdbadmin:oracle`, `pdbadmin:pdbadmin`, `scott:scott`, `scott:tiger`, `sys:change_on_install`, `sys:oracle`, `sys:sys`, `system:manager`, `system:oracle`, `system:system`, `test:test`, `user:user`, `system:12345678` |
192
+ | ClickHouse | `admin:admin`, `admin:changeme`, `admin:password`, `clickhouse:clickhouse`, `clickhouse:password`, `default:<empty>`, `default:changeme`, `default:clickhouse`, `default:default`, `default:password`, `root:password`, `root:root`, `user:password`, `user:user`, `default:12345678` |
193
+ | Redis | `admin:admin`, `admin:changeme`, `admin:password`, `default:changeme`, `default:default`, `default:password`, `default:redis`, `dev:dev`, `redis:changeme`, `redis:password`, `redis:redis`, `root:password`, `root:root`, `service:service`, `test:test`, `user:password`, `user:user`, `default:12345678` |
194
+ | etcd | `admin:admin`, `admin:changeme`, `admin:etcd`, `admin:password`, `etcd:etcd`, `etcd:password`, `root:admin`, `root:etcd`, `root:password`, `root:root`, `root:rootpass`, `service:service`, `user:password`, `user:user`, `root:12345678` |
195
+ | Elastic/OpenSearch | `admin:admin`, `admin:changeme`, `admin:password`, `elastic:changeme`, `elastic:elastic`, `elastic:password`, `kibana:changeme`, `kibana:kibana`, `logstash:logstash`, `logstash_system:changeme`, `opensearch:opensearch`, `opensearch:password`, `admin:12345678`, `elastic:12345678` |
196
+ | gRPC | Basic: `admin:admin`, `admin:changeme`, `admin:password`, `dev:dev`, `grpc:admin`, `grpc:grpc`, `grpc:password`, `guest:guest`, `root:admin`, `root:password`, `root:root`, `service:password`, `service:service`, `test:test`, `user:password`, `user:user`, `admin:12345678`.<br>Bearer tokens: `admin`, `changeme`, `default-token`, `grpc`, `secret`, `token`. |
197
+ | Kafka | `admin:admin`, `admin:admin-secret`, `admin:changeme`, `admin:kafka`, `admin:password`, `broker:broker`, `broker:brokerpass`, `client:client`, `kafka:admin`, `kafka:changeme`, `kafka:kafka`, `kafka:password`, `kafka:zookeeper`, `service:password`, `service:service`, `user:password`, `user:user`, `admin:12345678` |
198
+ | ZooKeeper | `admin:admin`, `admin:changeme`, `admin:kafka`, `admin:password`, `admin:zookeeper`, `broker:broker`, `broker:brokerpass`, `client:client`, `dev:dev`, `guest:guest`, `hadoop:hadoop`, `kafka:changeme`, `kafka:kafka`, `kafka:password`, `kafka:zookeeper`, `root:admin`, `root:password`, `root:root`, `root:rootpass`, `root:zookeeper`, `service:password`, `service:service`, `solr:solr`, `super:super`, `test:test`, `user:password`, `user:user`, `user1:12345`, `zk:password`, `zk:zk`, `zk:zookeeper`, `zookeeper:admin`, `zookeeper:password`, `zookeeper:zookeeper`, `admin:12345678` |
199
+ | Keeper | `admin:admin`, `admin:changeme`, `admin:clickhouse`, `admin:keeper`, `admin:password`, `clickhouse:changeme`, `clickhouse:clickhouse`, `clickhouse:keeper`, `clickhouse:password`, `default:<empty>`, `default:changeme`, `default:clickhouse`, `default:default`, `default:password`, `keeper:changeme`, `keeper:clickhouse`, `keeper:keeper`, `keeper:password`, `root:clickhouse`, `root:keeper`, `root:password`, `root:root`, `service:password`, `service:service`, `user:password`, `user:user`, `default:12345678` |
200
+ | Airflow | `airflow:airflow`, `admin:admin`, `admin:airflow`, `airflow:admin`, `airflow:password`, `airflow:changeme`, `airflow:airflow123`, `admin:password`, `admin:changeme`, `admin:airflow123`, `root:root`, `root:password`, `user:user`, `user:password`, `test:test`, `dev:dev`, `service:service`, `guest:guest`, `admin:12345678` |
201
+ | Jenkins | `admin:admin`, `admin:changeme`, `admin:jenkins`, `admin:password`, `admin:admin123`, `admin:12345678`, `jenkins:jenkins`, `jenkins:password`, `jenkins:changeme`, `jenkins:admin`, `root:root`, `root:password`, `user:user`, `user:password`, `test:test`, `dev:dev`, `guest:guest`, `service:service` |
202
+ | GitLab | `root:root`, `root:password`, `root:admin`, `root:changeme`, `root:gitlab`, `root:admin123`, `admin:admin`, `admin:password`, `admin:changeme`, `admin:gitlab`, `gitlab:gitlab`, `gitlab:password`, `gitlab:admin`, `user:user`, `user:password`, `test:test`, `guest:guest`, `dev:dev`, `root:12345678` |
203
+ | Harbor | `admin:Harbor12345`, `admin:harbor`, `admin:harbor123`, `admin:Harbor123`, `harbor:harbor`, `harbor:password`, then `admin:admin`, `admin:password`, `admin:changeme`, `admin:admin123`, `admin:123456`, `root:root`, `root:password`, `root:admin`, `root:changeme`, `user:user`, `user:password`, `test:test`, `guest:guest`, `dev:dev`, `service:service`, `admin:12345678` |
204
+ | Nexus | `admin:admin123`, `nexus:nexus`, `admin:nexus`, `admin:nexus123`, `admin:sonatype`, `nexus:password`, `nexus:admin`, then `admin:admin`, `admin:password`, `admin:changeme`, `admin:123456`, `root:root`, `root:password`, `root:admin`, `root:changeme`, `user:user`, `user:password`, `test:test`, `guest:guest`, `dev:dev`, `service:service`, `admin:12345678` |
205
+ | Docker Registry | `registry:registry`, `registry:password`, `registry:admin`, `registry:changeme`, `registry:registry123`, `docker:docker`, `docker:password`, then `admin:admin`, `admin:password`, `admin:changeme`, `admin:admin123`, `admin:123456`, `root:root`, `root:password`, `root:admin`, `root:changeme`, `user:user`, `user:password`, `test:test`, `guest:guest`, `dev:dev`, `service:service`, `admin:12345678` |
206
+ | KubeAPI | `admin:admin`, `admin:password`, `root:root`, `root:password`, `kubeadmin:kubeadmin`, `kubernetes:kubernetes`, `user:user`, `test:test`, `admin:12345678` |
207
+ | RabbitMQ | `admin:admin`, `admin:changeme`, `admin:password`, `admin:rabbitmq`, `guest:guest`, `guest:password`, `rabbitmq:admin`, `rabbitmq:password`, `rabbitmq:rabbitmq`, `root:password`, `root:root`, `service:password`, `service:service`, `test:test`, `user:password`, `user:user`, `admin:12345678` |
208
+
209
+ These are weak-password candidates, not universal factory passwords: [Harbor](https://goharbor.io/docs/edge/install-config/run-installer-script/)
210
+ documents `admin:Harbor12345`, while [GitLab](https://docs.gitlab.com/install/next_steps/)
211
+ and [Nexus](https://help.sonatype.com/en/install-nexus-repository.html) generate installation-specific
212
+ passwords. [Kubernetes](https://kubernetes.io/docs/reference/access-authn-authz/authentication/)
213
+ has no universal Basic pair; KubeAPI tries candidates only when Basic is advertised.
214
+ Neither public `/v2/` nor HTTP 200 proves registry authentication. Inconclusive
215
+ checks stay in debug/JSON; rate limiting or account lock stops the credential sweep.
216
+ The eight-digit numeric candidate is a weak password, not a product default.
217
+
218
+ ## Module Examples
219
+
220
+ Each block has three independent commands. Replace hosts and credentials;
221
+ `targets.txt` has one target per line. Keeper/ZooKeeper credential checks need an
222
+ ACL-protected verifier znode (`--znode /app`). Explicit write/exec/SSRF actions
223
+ are omitted.
224
+
225
+ ### Airflow
226
+
227
+ ```bash
228
+ redposture airflow -t targets.txt --enum-cve
229
+ redposture airflow -t targets.txt --defcreds
230
+ redposture airflow -t https://airflow.example:8080 -u auditor -p 'password' --show-keys --show-connections --discover
231
+ ```
232
+
233
+ Airflow reports anonymous `Dags/Keys/Connections allowed` separately from access
234
+ after login; live output follows service → credentials → CVE → keys → connections → discovery.
235
+
236
+ ### ClickHouse
237
+
238
+ ```bash
239
+ redposture clickhouse -t targets.txt --enum-cve
240
+ redposture clickhouse -t targets.txt --defcreds
241
+ redposture clickhouse -t db.example -u auditor -p 'password' --show-databases --show-tables --discover
242
+ ```
243
+
244
+ ### Consul
245
+
246
+ ```bash
247
+ redposture consul -t targets.txt --enum-cve
248
+ redposture consul -t http://consul.example:8500 --keys --services --agents
249
+ redposture consul -t http://consul.example:8500 --token "$CONSUL_TOKEN" --key app/config --dump
250
+ ```
251
+
252
+ ### Docker
253
+
254
+ ```bash
255
+ redposture docker -t targets.txt --enum-cve
256
+ redposture docker -t http://docker.example:2375 --containers --images --system
257
+ redposture docker -t https://docker.example:2376 --tls-ca ca.pem --tls-cert client.pem --tls-key client.key --containers
258
+ ```
259
+
260
+ ### Elastic / OpenSearch
261
+
262
+ ```bash
263
+ redposture elastic -t targets.txt --enum-cve
264
+ redposture elastic -t targets.txt --defcreds
265
+ redposture elastic -t https://search.example:9200 -u auditor -p 'password' --cluster --user --discover
266
+ ```
267
+
268
+ ### etcd
269
+
270
+ ```bash
271
+ redposture etcd -t targets.txt --enum-cve
272
+ redposture etcd -t targets.txt --defcreds
273
+ redposture etcd -t http://etcd.example:2379 -u root -p 'password' --show-keys 20 --dump 10
274
+ ```
275
+
276
+ ### GitLab
277
+
278
+ ```bash
279
+ redposture gitlab -t https://gitlab.example --enum-cve
280
+ redposture gitlab -t https://gitlab.example --defcreds
281
+ redposture gitlab -t https://gitlab.example --token "$GITLAB_TOKEN" --registry-token "$REGISTRY_TOKEN" --images
282
+ ```
283
+
284
+ GitLab detects web/API and Container Registry separately: `--token` is for web/API,
285
+ `--registry-token` for OCI; JSON nests OCI data in `container_registry`. Web login
286
+ uses a fresh CSRF session per pair and stops at SSO, CAPTCHA or rate limiting.
287
+ GitLab, Harbor, Nexus and Docker Registry show one product line followed by
288
+ credentials and requested inventory. Output files contain four tab-separated
289
+ fields without ANSI. `version:unknown` means no server version was disclosed;
290
+ the OCI `registry/2.0` header is a protocol version, not a server release.
291
+
292
+ ### Grafana
293
+
294
+ ```bash
295
+ redposture grafana -t targets.txt --enum-cve
296
+ redposture grafana -t targets.txt --defcreds
297
+ redposture grafana -t https://grafana.example -u auditor -p 'password' --show-datasources --enum-cve
298
+ ```
299
+
300
+ The public `/api/health` identifies Grafana and its version, but anonymous
301
+ access is determined from a protected API resource.
302
+
303
+ ### Keycloak
304
+
305
+ ```bash
306
+ redposture keycloak -t targets.txt --enum-cve
307
+ redposture keycloak -t https://id.example/auth --enum-realms
308
+ redposture keycloak -t https://id.example --token-file token.txt --show-realms --show-clients
309
+ ```
310
+
311
+ Keycloak requires a product-specific realm response and matching OIDC discovery;
312
+ generic SSO pages are at most `probable` in debug/JSON. The Admin API supplies an exact
313
+ version only when accessible. `--enum-cve` never guesses from a UI theme or URL.
314
+ The public `master` realm is checked by default; `--realm` is repeatable and
315
+ `--enum-realms` checks up to 32 common names and reports only realms confirmed by
316
+ the public Keycloak and OIDC endpoints. With an authorized token, `--show-realms`
317
+ reports brute-force protection, registration, HTTPS requirement and password policy;
318
+ `--show-clients` reports client type, Direct Access Grants, implicit flow, redirect
319
+ URIs and web origins. Denied or absent settings remain `unknown` rather than `False`.
320
+ Admin inventory uses GET requests and never prints client secrets.
321
+
322
+ ### Jenkins
323
+
324
+ ```bash
325
+ redposture jenkins -t targets.txt --enum-cve
326
+ redposture jenkins -t targets.txt --defcreds
327
+ redposture jenkins -t https://ci.example/jenkins -u auditor --api-token-file token.txt --show-jobs --show-builds 3 --show-plugins --show-nodes --show-queue --show-artifacts 20
328
+ ```
329
+
330
+ Detection combines Jenkins-specific API, identity, login-form, or version signals;
331
+ generic login pages are not confirmed. `--defcreds` tries common weak pairs, not
332
+ an installation password: Jenkins generates its initial admin password. A pair
333
+ or API token is accepted only when the identity endpoint confirms authentication.
334
+ Jobs, recent builds, plugins, agents, queue and artifact metadata are read-only;
335
+ visibility depends on the account's permissions. `--show-artifacts` also lists
336
+ recent builds and uses HEAD requests to obtain artifact sizes without downloading
337
+ their contents. Each inventory flag accepts an optional count limit.
338
+
339
+ ### gRPC
340
+
341
+ ```bash
342
+ redposture grpc -t targets.txt --analyze
343
+ redposture grpc -t grpc.example --token "$GRPC_TOKEN" --openapi
344
+ redposture grpc -t grpc.example --invoke /grpc.health.v1.Health/Check --data '{"service":""}'
345
+ ```
346
+
347
+ ### Kafka
348
+
349
+ ```bash
350
+ redposture kafka -t targets.txt --show-topics
351
+ redposture kafka -t targets.txt --defcreds
352
+ redposture kafka -t kafka.example -u auditor -p 'password' --topic events --dump 10
353
+ redposture kafka -t kafka.example -u producer -p 'password' --topic audit.events --write-message 'test event'
354
+ redposture kafka -t http://kafka-ui.example:8080 -u auditor -p 'password' --show-clusters --show-topics --show-brokers --show-consumer-groups
355
+ ```
356
+
357
+ Kafka detects broker listeners and Kafbat/Provectus Kafka UI on explicit `host:port` targets automatically. Bare hosts also scan common UI ports. UI logins are verified through the UI identity API; broker SASL credentials are checked only against brokers. A UI login or generic HTTP response alone does not confirm the product. UI inventory is read-only; topic dumps and writes require a broker listener.
358
+
359
+ `--probe-write` works alone or with `--topic NAME`; it appends one audit marker to each probed topic. An inconclusive result is shown as `write:unknown`.
360
+ `--write-message` sends one UTF-8 record; `--write-file` sends one binary record (up to 1 MiB). Both require `--topic`, and `--write-key` is optional. A lost broker acknowledgment is reported as unconfirmed and never retried, because the record may already be present.
361
+
362
+ ### Keeper
363
+
364
+ ```bash
365
+ redposture keeper -t targets.txt
366
+ redposture keeper -t targets.txt --defcreds --znode /app
367
+ redposture keeper -t keeper.example -u auditor -p 'password' --show-znodes 20 --dump 10
368
+ ```
369
+
370
+ Keeper reports `(ddl access:Write/Read/Denied/Absent/Unknown)` for anonymous access
371
+ to `/clickhouse/task_queue/ddl`. By default it reads the path and creates/deletes
372
+ an empty ephemeral child that is **not** a DDL task. `Write` proves a znode write,
373
+ not SQL execution; `Read` leaves write access unproved; `Absent` can also mean a
374
+ custom DDL path. The probe can trigger Keeper watches. `--probe-write` separately
375
+ tests create/delete under `/`.
376
+
377
+ `--show-cluster` and `--show-hosts` read existing DDL tasks (formats 5–8). For
378
+ `--create-user NAME --create-userpass PASSWORD`, Keeper uses worker IDs and a
379
+ cluster from the newest valid task, queues a SHA-256-hashed `CREATE USER`, and
380
+ reports success only after a worker confirms it. New tasks use minimal format 5
381
+ without inheriting settings or initiator identity. `--grant-admin` then queues a
382
+ separate `GRANT ALL ON *.* WITH GRANT OPTION` after successful creation.
383
+ These operations change ClickHouse accounts:
384
+
385
+ ```bash
386
+ redposture keeper -t keeper.example:9181 --create-user audituser --create-userpass 'strong-password' --grant-admin
387
+ ```
388
+
389
+ Interactive mode requires one target and a terminal: choose clusters/workers by
390
+ number or `a` for all, then confirm creation and each grant with `y`. Blank,
391
+ `n`, EOF or Ctrl-C declines; selecting only some workers warns and affects only
392
+ them.
393
+ The password is not printed. `--yes` skips menus/prompts and can affect multiple
394
+ targets; with multiple clusters, specify `--clickhouse-cluster`. If no usable DDL
395
+ task exists, set `--clickhouse-host` and `--clickhouse-cluster` (optional
396
+ `--clickhouse-port`, default 9000). A queue over 512 tasks also requires explicit
397
+ host/cluster. Keeper never guesses ClickHouse hosts from its own IP, replica names,
398
+ sessions, discovery paths or peers. `{cluster}` expands only when configured in
399
+ ClickHouse; Redposture does not substitute it in DDL tasks.
400
+
401
+ ### KubeAPI
402
+
403
+ ```bash
404
+ redposture kubeapi -t targets.txt --enum-cve
405
+ redposture kubeapi -t https://cluster.example:6443 --defcreds
406
+ redposture kubeapi -t https://cluster.example:6443 --token "$KUBE_TOKEN" --secrets
407
+ ```
408
+
409
+ ### MinIO
410
+
411
+ ```bash
412
+ redposture minio -t targets.txt --enum-cve
413
+ redposture minio -t targets.txt --defcreds
414
+ redposture minio -t https://minio.example:9000 -u minioadmin -p 'password' --show-buckets --show-objects --discover
415
+ ```
416
+
417
+ ### MongoDB
418
+
419
+ ```bash
420
+ redposture mongodb -t targets.txt --enum-cve
421
+ redposture mongodb -t targets.txt --defcreds
422
+ redposture mongodb -t mongo.example -u auditor -p 'password' --show-databases --show-collections
423
+ ```
424
+
425
+ ### Oracle
426
+
427
+ ```bash
428
+ redposture oracle -t targets.txt --listener-dump
429
+ redposture oracle -t oracle.example --service ORCLPDB1 --defcreds
430
+ redposture oracle -t oracle.example --service ORCLPDB1 -u auditor -p 'password' --show-schemas --show-tables --privesc-check
431
+ ```
432
+
433
+ Oracle reuses the confirmed listener/service for credential checks. Its automatic limit is 8 concurrent targets; explicit `--workers` overrides it. `--defcreds` still checks every candidate, except further passwords for an account reported locked.
434
+
435
+ ### PostgreSQL
436
+
437
+ ```bash
438
+ redposture postgres -t targets.txt --enum-cve
439
+ redposture postgres -t targets.txt --defcreds --stop-on-success
440
+ redposture postgres -t db.example -u auditor -p 'password' --show-databases --show-tables --privesc-check
441
+ ```
442
+
443
+ ### Proxmox
444
+
445
+ ```bash
446
+ redposture proxmox -t targets.txt --enum-cve
447
+ redposture proxmox -t targets.txt --defcreds
448
+ redposture proxmox -t https://pve.example:8006 -u auditor@pve -p 'password' --nodes --discover
449
+ ```
450
+
451
+ Without supplied credentials, a protected API does not produce token or password failure lines.
452
+
453
+ ### Qdrant
454
+
455
+ ```bash
456
+ redposture qdrant -t targets.txt --enum-cve
457
+ redposture qdrant -t http://qdrant.example:6333 --collections
458
+ redposture qdrant -t http://qdrant.example:6333 --api-key "$QDRANT_API_KEY" --collection documents --dump 10
459
+ ```
460
+
461
+ ### RabbitMQ
462
+
463
+ ```bash
464
+ redposture rabbitmq -t targets.txt --enum-cve
465
+ redposture rabbitmq -t targets.txt --defcreds
466
+ redposture rabbitmq -t http://rabbitmq.example:15672 -u auditor -p 'password' --enum
467
+ ```
468
+
469
+ ### Redis / Valkey
470
+
471
+ ```bash
472
+ redposture redis -t targets.txt --enum-cve
473
+ redposture redis -t targets.txt --defcreds
474
+ redposture redis -t redis.example -u auditor -p 'password' --show-keys 20 --dump 10
475
+ ```
476
+
477
+ ### Harbor
478
+
479
+ ```bash
480
+ redposture harbor -t https://harbor.example --enum-cve
481
+ redposture harbor -t https://harbor.example --defcreds
482
+ redposture harbor -t https://harbor.example -u auditor -p 'password' --images
483
+ ```
484
+
485
+ ### Nexus
486
+
487
+ ```bash
488
+ redposture nexus -t https://nexus.example --enum-cve
489
+ redposture nexus -t https://nexus.example --defcreds
490
+ redposture nexus -t https://nexus.example -u auditor -p 'password' --assets
491
+ ```
492
+
493
+ ### Docker Registry
494
+
495
+ ```bash
496
+ redposture docker-registry -t https://registry.example --enum-cve
497
+ redposture docker-registry -t https://registry.example --defcreds
498
+ redposture docker-registry -t https://registry.example -u auditor -p 'password' --images
499
+ ```
500
+
501
+ `docker-registry` accepts only a plain OCI Registry fingerprint. Harbor, Nexus and
502
+ GitLab require their product commands. Image, tag, metadata and download options
503
+ are available on each product command; inaccessible inventory sections are omitted.
504
+ On a protected `/v2/`, Basic pairs are checked even if the auth challenge is absent;
505
+ only definitive results are printed.
506
+
507
+ ### ZooKeeper
508
+
509
+ ```bash
510
+ redposture zookeeper -t targets.txt --enum-cve
511
+ redposture zookeeper -t targets.txt --defcreds --znode /app
512
+ redposture zookeeper -t zk.example -u auditor -p 'password' --show-znodes 20 --dump 10
513
+ ```
514
+
515
+ ### Exporters
516
+
517
+ ```bash
518
+ redposture exporters scan -t targets.txt
519
+ redposture exporters collect -t targets.txt --deep
520
+ redposture exporters trigger -t targets.txt --callback-dns callback.example
521
+ ```
522
+
523
+ Trigger supports Redis, Postgres, Blackbox, Proxmox, MySQL, JSON, Elasticsearch,
524
+ SNMP and IPMI exporters. All nine callback listeners start by default; `-e` selects
525
+ exporter types and matching listeners, while `-s` selects listeners explicitly.
526
+ For exporter `scan`, `collect` and `trigger`, `http://host` checks port 80 and
527
+ `https://host` checks port 443. `--ports` overrides these defaults; an explicit
528
+ port in the URL takes priority over `--ports`.
529
+ Exporter HTTPS accepts self-signed certificates unless `--tls-ca file` is supplied.
530
+ `--no-postgres-tls` disables Postgres callback TLS; `--no-with-listen` skips
531
+ listeners. SNMP/IPMI use UDP. A trigger is confirmed only when its listener
532
+ observes a callback. Percona MongoDB exporter is excluded: its `/scrape?target=`
533
+ selects only preconfigured `--mongodb.uri` hosts.
534
+
535
+ Trigger tries a default probe and a paced, bounded list of named profiles
536
+ (`auth_module`, `module`, or SNMP `auth`) serially, continuing after callbacks
537
+ because another profile may carry credentials. Repeated exporter errors stop the
538
+ sweep. Use `--profiles-file` or exporter-specific flags such as
539
+ `--mysql-auth-module`, `--elastic-auth-module` and `--snmp-auth` for custom
540
+ profiles; Redis has no named profile. `CRED!` requires credential material
541
+ actually received, not just SSRF. HTTP callbacks may carry Basic/Bearer/API keys;
542
+ MySQL `mysql_native_password` yields a challenge-bound username, `auth_salt` and
543
+ `auth_response` challenge response, never the plaintext password. SNMPv1/v2c
544
+ yields a community;
545
+ SNMPv3/IPMI confirm SSRF without claiming a password. `-check` can verify captured
546
+ Redis/Postgres credentials.
547
+
548
+ ## Offline CVE enumeration
549
+
550
+ `--enum-cve` compares confirmed products and exact versions with a bundled offline
551
+ catalog; it makes no external requests or exploit attempts. Findings mean
552
+ **potentially affected**, not proof of exploitability: backports and deployment settings matter.
553
+ The catalog mainly covers High/Critical network CVEs with reliable version ranges
554
+ for code execution, auth bypass, takeover, data/file access or SSRF, excluding
555
+ pure DoS. `PR:L` normally needs anonymous access or verified **explicit** credentials;
556
+ invalid credentials and `--defcreds` alone do not qualify. Selected Nexus
557
+ script/licensing entries need elevated permissions, and Grafana Image Renderer
558
+ needs a detected plugin and reachable renderer; other title prerequisites such as
559
+ Enterprise SCIM or a write-enabled MinIO key are not proven by version matching.
560
+ The Keycloak JWT grant entry additionally requires valid client credentials;
561
+ a verified bearer token alone does not prove that prerequisite.
562
+
563
+ Credential checks precede newest-first CVE findings. With an unknown or malformed
564
+ version, a confirmed product shows catalogued CVEs from the last four years as
565
+ yellow speculative findings: `Possibly CVE-… may affect this service`.
566
+ This does not establish that its installed version is vulnerable. When a catalog
567
+ entry has a publication date, the rolling four-year cutoff uses it. Otherwise
568
+ the CVE ID year is used only when the entire year is inside that window; undated
569
+ entries from the boundary year are omitted. `PR:L` still requires confirmed
570
+ anonymous access or verified explicit credentials; entries requiring elevated
571
+ permissions are omitted from unknown-version findings. A known vulnerable version
572
+ continues to use the red `[!]` marker and `potentially affected` wording.
573
+ `CVE's Enumeration` appears only when there are findings; otherwise status and
574
+ reason remain in debug/JSON.
575
+
576
+ ```text
577
+ GRAFANA 10.0.0.1 3000 [*] Grafana Service (auth required:False) (version:8.2.6)
578
+ GRAFANA 10.0.0.1 3000 [*] CVE's Enumeration
579
+ GRAFANA 10.0.0.1 3000 [!] CVE-2021-43798 potentially affected (HIGH 7.5) Unauthenticated path traversal and arbitrary file read
580
+ ```
581
+
582
+ The bundled `2026-10-06` catalog contains 200 reviewed product/CVE records:
583
+
584
+ | Product | CVEs | Product | CVEs |
585
+ |---|---:|---|---:|
586
+ | GitLab | 72 | Redis | 23 |
587
+ | PostgreSQL | 23 | Airflow | 11 |
588
+ | Grafana | 11 | Elasticsearch | 6 |
589
+ | MongoDB | 7 | MinIO | 5 |
590
+ | Nexus Repository | 10 | Qdrant | 5 |
591
+ | RabbitMQ | 4 | ClickHouse | 3 |
592
+ | Valkey | 3 | ZooKeeper | 2 |
593
+ | Harbor | 2 | Oracle Database | 2 |
594
+ | OpenSearch | 1 | Proxmox VE | 1 |
595
+ | Grafana Enterprise SCIM | 1 | Grafana Image Renderer | 1 |
596
+ | Consul | 1 | Docker Engine | 1 |
597
+ | etcd | 1 | Kubernetes | 1 |
598
+ | Keycloak | 3 | | |
599
+ | **Total** | **200** | | |
600
+
601
+ Elasticsearch/OpenSearch, Redis/Valkey, ZooKeeper/Keeper and Registry vendors are
602
+ matched separately. Plain Docker Registry and gRPC are unsupported; Kafka lacks
603
+ an exact broker version, and Keeper has no catalog matches. Version access may
604
+ require auth; Oracle needs the Database version, not the listener version.
605
+ `-f json` includes ranges, fixes, CVSS and references in `cve_enumeration`.
606
+
607
+ ## Development and checks
608
+
609
+ ```bash
610
+ git clone https://github.com/MelForze/Redposture.git
611
+ cd Redposture
612
+ python -m venv .venv
613
+ source .venv/bin/activate
614
+ pip install -e '.[dev]'
615
+ pytest
616
+ ./scripts/check_ci_matrix.sh --worktree
617
+ ```
618
+
619
+ CI locks are in `requirements/` (`scripts/update_ci_locks.sh`). Full QA and
620
+ selected sections use the same local runner:
621
+
622
+ ```bash
623
+ ./scripts/run_full_local_qa.sh --list
624
+ ./scripts/run_full_local_qa.sh /tmp/redposture_qa_fuzz --section cli-fuzz,hypothesis
625
+ ./scripts/run_full_local_qa.sh /tmp/redposture_qa_full
626
+ ```
627
+
628
+ Each section writes its own log and summary; Docker is required only for Docker
629
+ sections. `./scripts/run_qa_handoff.sh versions` runs the separate version
630
+ matrix. `./scripts/run_http_detection_qa.sh` writes a focused report under
631
+ `.redposture/qa/`. `lab/`, `lab_tests/`, `qa_tests/` and `.redposture/` are
632
+ excluded from Git.
633
+
634
+ ## License
635
+
636
+ [MIT](LICENSE).