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.
- redposture-5.25.dist-info/METADATA +636 -0
- redposture-5.25.dist-info/RECORD +307 -0
- redposture-5.25.dist-info/WHEEL +4 -0
- redposture-5.25.dist-info/entry_points.txt +2 -0
- redposture-5.25.dist-info/licenses/LICENSE +21 -0
- redposture_core/__init__.py +12 -0
- redposture_core/audit_config.py +86 -0
- redposture_core/audit_models.py +315 -0
- redposture_core/auth_detection.py +172 -0
- redposture_core/cli.py +218 -0
- redposture_core/cli_args.py +677 -0
- redposture_core/cli_modules/__init__.py +1 -0
- redposture_core/cli_modules/airflow.py +95 -0
- redposture_core/cli_modules/clickhouse.py +218 -0
- redposture_core/cli_modules/consul.py +235 -0
- redposture_core/cli_modules/datastores.py +377 -0
- redposture_core/cli_modules/docker_engine.py +77 -0
- redposture_core/cli_modules/elastic.py +122 -0
- redposture_core/cli_modules/exporters.py +332 -0
- redposture_core/cli_modules/gitlab.py +91 -0
- redposture_core/cli_modules/grafana.py +120 -0
- redposture_core/cli_modules/grpc.py +189 -0
- redposture_core/cli_modules/jenkins.py +74 -0
- redposture_core/cli_modules/keeper.py +74 -0
- redposture_core/cli_modules/keycloak.py +69 -0
- redposture_core/cli_modules/kubeapi.py +128 -0
- redposture_core/cli_modules/minio.py +129 -0
- redposture_core/cli_modules/mongodb.py +187 -0
- redposture_core/cli_modules/oci_registry.py +68 -0
- redposture_core/cli_modules/oracle.py +224 -0
- redposture_core/cli_modules/postgres.py +218 -0
- redposture_core/cli_modules/proxmox.py +119 -0
- redposture_core/cli_modules/qdrant.py +109 -0
- redposture_core/cli_modules/rabbitmq.py +58 -0
- redposture_core/cli_modules/spray.py +59 -0
- redposture_core/cli_modules/zookeeper.py +181 -0
- redposture_core/clients/__init__.py +1 -0
- redposture_core/clients/airflow_api.py +147 -0
- redposture_core/clients/docker_engine.py +390 -0
- redposture_core/clients/grpc.py +2185 -0
- redposture_core/clients/http_api.py +1027 -0
- redposture_core/clients/http_redirects.py +117 -0
- redposture_core/clients/http_session.py +402 -0
- redposture_core/clients/kafka.py +2796 -0
- redposture_core/clients/minio_api.py +265 -0
- redposture_core/clients/mongodb.py +348 -0
- redposture_core/clients/oracle.py +1345 -0
- redposture_core/clients/rabbitmq_api.py +150 -0
- redposture_core/clients/s3_sigv4.py +114 -0
- redposture_core/clients/scoped_http.py +56 -0
- redposture_core/clients/tls_cache.py +119 -0
- redposture_core/clients/transport.py +114 -0
- redposture_core/clients/zookeeper.py +1615 -0
- redposture_core/console.py +195 -0
- redposture_core/constants.py +619 -0
- redposture_core/cve.py +780 -0
- redposture_core/data/cve_catalog.json +5648 -0
- redposture_core/discovery_options.py +47 -0
- redposture_core/discovery_rendering.py +107 -0
- redposture_core/exporters/__init__.py +27 -0
- redposture_core/exporters/artifacts.py +118 -0
- redposture_core/exporters/collect.py +563 -0
- redposture_core/exporters/detection.py +48 -0
- redposture_core/exporters/discover.py +460 -0
- redposture_core/exporters/discovery_logic.py +264 -0
- redposture_core/exporters/http_client.py +301 -0
- redposture_core/exporters/http_pool.py +270 -0
- redposture_core/exporters/output.py +173 -0
- redposture_core/exporters/postprocess.py +83 -0
- redposture_core/exporters/trigger.py +649 -0
- redposture_core/exporters/workflows.py +190 -0
- redposture_core/listener_runtime.py +291 -0
- redposture_core/logger.py +474 -0
- redposture_core/module_registry.py +573 -0
- redposture_core/modules/__init__.py +0 -0
- redposture_core/modules/airflow/__init__.py +1 -0
- redposture_core/modules/airflow/actions.py +834 -0
- redposture_core/modules/airflow/discover.py +623 -0
- redposture_core/modules/airflow/policy.py +29 -0
- redposture_core/modules/airflow/render.py +297 -0
- redposture_core/modules/airflow/stage.py +108 -0
- redposture_core/modules/airflow/types.py +54 -0
- redposture_core/modules/clickhouse/__init__.py +5 -0
- redposture_core/modules/clickhouse/actions.py +3826 -0
- redposture_core/modules/clickhouse/discover/__init__.py +5 -0
- redposture_core/modules/clickhouse/discover/checkpoint.py +122 -0
- redposture_core/modules/clickhouse/discover/engine.py +510 -0
- redposture_core/modules/clickhouse/discover/inventory.py +193 -0
- redposture_core/modules/clickhouse/discover/models.py +72 -0
- redposture_core/modules/clickhouse/discover/reader.py +92 -0
- redposture_core/modules/clickhouse/policy.py +122 -0
- redposture_core/modules/clickhouse/render.py +40 -0
- redposture_core/modules/clickhouse/stage.py +550 -0
- redposture_core/modules/clickhouse/types.py +5 -0
- redposture_core/modules/consul/__init__.py +5 -0
- redposture_core/modules/consul/actions.py +4167 -0
- redposture_core/modules/consul/policy.py +97 -0
- redposture_core/modules/consul/render.py +34 -0
- redposture_core/modules/consul/stage.py +281 -0
- redposture_core/modules/consul/types.py +5 -0
- redposture_core/modules/docker/__init__.py +5 -0
- redposture_core/modules/docker/actions.py +886 -0
- redposture_core/modules/docker/policy.py +25 -0
- redposture_core/modules/docker/render.py +31 -0
- redposture_core/modules/docker/stage.py +58 -0
- redposture_core/modules/docker/types.py +5 -0
- redposture_core/modules/docker_registry/__init__.py +1 -0
- redposture_core/modules/docker_registry/actions.py +3 -0
- redposture_core/modules/docker_registry/policy.py +3 -0
- redposture_core/modules/docker_registry/render.py +3 -0
- redposture_core/modules/docker_registry/stage.py +18 -0
- redposture_core/modules/docker_registry/types.py +3 -0
- redposture_core/modules/elastic/__init__.py +5 -0
- redposture_core/modules/elastic/actions.py +5366 -0
- redposture_core/modules/elastic/discover.py +2770 -0
- redposture_core/modules/elastic/http_session.py +337 -0
- redposture_core/modules/elastic/policy.py +17 -0
- redposture_core/modules/elastic/render.py +21 -0
- redposture_core/modules/elastic/stage.py +326 -0
- redposture_core/modules/elastic/types.py +5 -0
- redposture_core/modules/etcd/__init__.py +5 -0
- redposture_core/modules/etcd/actions.py +1573 -0
- redposture_core/modules/etcd/policy.py +14 -0
- redposture_core/modules/etcd/render.py +23 -0
- redposture_core/modules/etcd/stage.py +75 -0
- redposture_core/modules/etcd/types.py +5 -0
- redposture_core/modules/gitlab/__init__.py +5 -0
- redposture_core/modules/gitlab/actions.py +1870 -0
- redposture_core/modules/gitlab/policy.py +14 -0
- redposture_core/modules/gitlab/render.py +137 -0
- redposture_core/modules/gitlab/stage.py +327 -0
- redposture_core/modules/gitlab/types.py +5 -0
- redposture_core/modules/grafana/__init__.py +5 -0
- redposture_core/modules/grafana/actions.py +1808 -0
- redposture_core/modules/grafana/policy.py +14 -0
- redposture_core/modules/grafana/render.py +23 -0
- redposture_core/modules/grafana/stage.py +163 -0
- redposture_core/modules/grafana/types.py +5 -0
- redposture_core/modules/grpc/__init__.py +5 -0
- redposture_core/modules/grpc/actions.py +2359 -0
- redposture_core/modules/grpc/policy.py +47 -0
- redposture_core/modules/grpc/render.py +23 -0
- redposture_core/modules/grpc/stage.py +349 -0
- redposture_core/modules/grpc/types.py +5 -0
- redposture_core/modules/harbor/__init__.py +1 -0
- redposture_core/modules/harbor/actions.py +3 -0
- redposture_core/modules/harbor/policy.py +3 -0
- redposture_core/modules/harbor/render.py +3 -0
- redposture_core/modules/harbor/stage.py +18 -0
- redposture_core/modules/harbor/types.py +3 -0
- redposture_core/modules/jenkins/__init__.py +1 -0
- redposture_core/modules/jenkins/actions.py +439 -0
- redposture_core/modules/jenkins/policy.py +37 -0
- redposture_core/modules/jenkins/render.py +204 -0
- redposture_core/modules/jenkins/stage.py +129 -0
- redposture_core/modules/jenkins/types.py +9 -0
- redposture_core/modules/kafka/__init__.py +5 -0
- redposture_core/modules/kafka/actions.py +2370 -0
- redposture_core/modules/kafka/policy.py +72 -0
- redposture_core/modules/kafka/render.py +131 -0
- redposture_core/modules/kafka/stage.py +271 -0
- redposture_core/modules/kafka/types.py +5 -0
- redposture_core/modules/kafka/ui.py +354 -0
- redposture_core/modules/keeper/__init__.py +5 -0
- redposture_core/modules/keeper/actions.py +157 -0
- redposture_core/modules/keeper/ddl.py +355 -0
- redposture_core/modules/keeper/interactive.py +202 -0
- redposture_core/modules/keeper/policy.py +28 -0
- redposture_core/modules/keeper/render.py +125 -0
- redposture_core/modules/keeper/stage.py +342 -0
- redposture_core/modules/keeper/types.py +12 -0
- redposture_core/modules/keycloak/__init__.py +1 -0
- redposture_core/modules/keycloak/actions.py +539 -0
- redposture_core/modules/keycloak/policy.py +40 -0
- redposture_core/modules/keycloak/render.py +178 -0
- redposture_core/modules/keycloak/stage.py +87 -0
- redposture_core/modules/keycloak/types.py +9 -0
- redposture_core/modules/kubeapi/__init__.py +5 -0
- redposture_core/modules/kubeapi/actions.py +3224 -0
- redposture_core/modules/kubeapi/http_session.py +231 -0
- redposture_core/modules/kubeapi/policy.py +22 -0
- redposture_core/modules/kubeapi/render.py +27 -0
- redposture_core/modules/kubeapi/stage.py +192 -0
- redposture_core/modules/kubeapi/types.py +5 -0
- redposture_core/modules/minio/__init__.py +1 -0
- redposture_core/modules/minio/actions.py +1027 -0
- redposture_core/modules/minio/discover.py +324 -0
- redposture_core/modules/minio/enumerate.py +162 -0
- redposture_core/modules/minio/policy.py +40 -0
- redposture_core/modules/minio/render.py +422 -0
- redposture_core/modules/minio/stage.py +106 -0
- redposture_core/modules/minio/types.py +44 -0
- redposture_core/modules/mongodb/__init__.py +5 -0
- redposture_core/modules/mongodb/actions.py +1497 -0
- redposture_core/modules/mongodb/policy.py +61 -0
- redposture_core/modules/mongodb/render.py +33 -0
- redposture_core/modules/mongodb/stage.py +196 -0
- redposture_core/modules/mongodb/types.py +5 -0
- redposture_core/modules/nexus/__init__.py +1 -0
- redposture_core/modules/nexus/actions.py +3 -0
- redposture_core/modules/nexus/policy.py +3 -0
- redposture_core/modules/nexus/render.py +3 -0
- redposture_core/modules/nexus/stage.py +18 -0
- redposture_core/modules/nexus/types.py +3 -0
- redposture_core/modules/oracle/__init__.py +5 -0
- redposture_core/modules/oracle/actions.py +2176 -0
- redposture_core/modules/oracle/policy.py +29 -0
- redposture_core/modules/oracle/render.py +21 -0
- redposture_core/modules/oracle/stage.py +118 -0
- redposture_core/modules/oracle/types.py +5 -0
- redposture_core/modules/postgres/__init__.py +5 -0
- redposture_core/modules/postgres/actions.py +3273 -0
- redposture_core/modules/postgres/policy.py +75 -0
- redposture_core/modules/postgres/render.py +37 -0
- redposture_core/modules/postgres/stage.py +880 -0
- redposture_core/modules/postgres/types.py +5 -0
- redposture_core/modules/proxmox/__init__.py +5 -0
- redposture_core/modules/proxmox/actions.py +2298 -0
- redposture_core/modules/proxmox/policy.py +26 -0
- redposture_core/modules/proxmox/render.py +62 -0
- redposture_core/modules/proxmox/stage.py +714 -0
- redposture_core/modules/proxmox/types.py +5 -0
- redposture_core/modules/qdrant/__init__.py +5 -0
- redposture_core/modules/qdrant/actions.py +1828 -0
- redposture_core/modules/qdrant/policy.py +39 -0
- redposture_core/modules/qdrant/render.py +19 -0
- redposture_core/modules/qdrant/stage.py +181 -0
- redposture_core/modules/qdrant/types.py +5 -0
- redposture_core/modules/rabbitmq/__init__.py +1 -0
- redposture_core/modules/rabbitmq/actions.py +378 -0
- redposture_core/modules/rabbitmq/policy.py +22 -0
- redposture_core/modules/rabbitmq/render.py +294 -0
- redposture_core/modules/rabbitmq/stage.py +110 -0
- redposture_core/modules/rabbitmq/types.py +5 -0
- redposture_core/modules/redis/__init__.py +5 -0
- redposture_core/modules/redis/actions.py +1712 -0
- redposture_core/modules/redis/policy.py +20 -0
- redposture_core/modules/redis/render.py +23 -0
- redposture_core/modules/redis/stage.py +115 -0
- redposture_core/modules/redis/types.py +5 -0
- redposture_core/modules/registry/__init__.py +5 -0
- redposture_core/modules/registry/actions.py +4138 -0
- redposture_core/modules/registry/policy.py +41 -0
- redposture_core/modules/registry/product_render.py +210 -0
- redposture_core/modules/registry/render.py +19 -0
- redposture_core/modules/registry/stage.py +219 -0
- redposture_core/modules/registry/types.py +5 -0
- redposture_core/modules/zookeeper/__init__.py +5 -0
- redposture_core/modules/zookeeper/actions.py +3533 -0
- redposture_core/modules/zookeeper/engine.py +357 -0
- redposture_core/modules/zookeeper/policy.py +28 -0
- redposture_core/modules/zookeeper/render.py +29 -0
- redposture_core/modules/zookeeper/stage.py +206 -0
- redposture_core/modules/zookeeper/types.py +82 -0
- redposture_core/network_proxy.py +410 -0
- redposture_core/profiles.py +202 -0
- redposture_core/progress.py +373 -0
- redposture_core/proto/__init__.py +7 -0
- redposture_core/proto/grpc_health.proto +23 -0
- redposture_core/proto/grpc_health_pb2.py +42 -0
- redposture_core/proto/grpc_reflection.proto +58 -0
- redposture_core/proto/grpc_reflection_pb2.py +52 -0
- redposture_core/rendering.py +493 -0
- redposture_core/scanner.py +314 -0
- redposture_core/scheduler.py +566 -0
- redposture_core/secret_detection.py +263 -0
- redposture_core/servers.py +1126 -0
- redposture_core/shell_capture.py +289 -0
- redposture_core/show_limits.py +88 -0
- redposture_core/spray_render.py +19 -0
- redposture_core/stage_clickhouse.py +63 -0
- redposture_core/stage_collect.py +1004 -0
- redposture_core/stage_consul.py +63 -0
- redposture_core/stage_docker.py +63 -0
- redposture_core/stage_elastic.py +63 -0
- redposture_core/stage_etcd.py +63 -0
- redposture_core/stage_gitlab.py +63 -0
- redposture_core/stage_grafana.py +63 -0
- redposture_core/stage_grpc.py +63 -0
- redposture_core/stage_kafka.py +63 -0
- redposture_core/stage_keeper.py +61 -0
- redposture_core/stage_kubeapi.py +63 -0
- redposture_core/stage_mongodb.py +63 -0
- redposture_core/stage_oracle.py +63 -0
- redposture_core/stage_postgres.py +63 -0
- redposture_core/stage_proxmox.py +63 -0
- redposture_core/stage_qdrant.py +63 -0
- redposture_core/stage_redis.py +63 -0
- redposture_core/stage_registry.py +63 -0
- redposture_core/stage_runtime.py +3720 -0
- redposture_core/stage_scan.py +515 -0
- redposture_core/stage_selfcert.py +75 -0
- redposture_core/stage_spray.py +1001 -0
- redposture_core/stage_trigger.py +1344 -0
- redposture_core/stage_validate.py +21 -0
- redposture_core/stage_zookeeper.py +63 -0
- redposture_core/targeting.py +1264 -0
- redposture_core/transport_contract.py +36 -0
- redposture_core/utils.py +394 -0
- redposture_core/validate/__init__.py +5 -0
- redposture_core/validate/artifacts.py +138 -0
- redposture_core/validate/context.py +420 -0
- redposture_core/validate/engine.py +829 -0
- redposture_core/validate/parsers.py +1465 -0
- redposture_core/validate/render.py +441 -0
- redposture_core/validate/scoring.py +247 -0
- 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).
|