id: CVE-2026-16232

info:
  name: Check Point Security Management Server - SmartConsole Authentication Bypass
  author: sfewer-r7,DhiyaneshDk
  severity: critical
  description: |
    An authentication bypass vulnerability in the Check Point SmartConsole login process allows an unauthenticated remote attacker to obtain an application login token and use it to authenticate with full administrative privileges. Successful exploitation allows the attacker to modify security policies and security configurations. Remote exploitation requires internet access to the Management Server IP address and a configuration that does not restrict Trusted Clients. Check Point is aware that this vulnerability is being exploited and has affected a very small number of customers.
  impact: |
    Unauthenticated remote attackers can gain full administrative access and modify security policies and configurations.
  remediation: |
    Update to the latest version with the vulnerability fixed.
  reference:
    - https://support.checkpoint.com/results/sk/sk185169
    - https://www.rapid7.com/blog/post/ra-check-point-smartconsole-authentication-bypass-technical-analysis-cve-2026-16232/
    - https://github.com/sfewer-r7/CVE-2026-16232
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 9.8
    cve-id: CVE-2026-16232
    epss-score: 0.71391
    epss-percentile: 0.99353
    cwe-id: CWE-287
  metadata:
    max-request: 1
    vendor: checkpoint
    product: security_management_server
    shodan-query: port:18190
    fofa-query: port="18190"
    verified: true
  tags: cve,cve2026,checkpoint,auth-bypass,smartconsole,network,js,kev,vkev

javascript:
  - pre-condition: |
      isPortOpen(Host, CpmiPort);
    code: |
      let net = require("nuclei/net");

      let addr = Host + ":" + CpmiPort;
      let conn = net.Open("tcp", addr);
      conn.SetTimeout(15);

      conn.SendHex("5900000000000041");

      let ackBytes = conn.RecvFull(4);
      if (!ackBytes || ackBytes.length < 4) {
        conn.Close();
        Export("error:no_ack");
      }

      if (ackBytes[0] !== 0x59) {
        conn.Close();
        Export("error:bad_ack_" + ackBytes[0]);
      }

      conn.SendHex("0000000e434e3d4775695f436c69656e74000000000100");

      let dnLenBytes = conn.RecvFull(4);
      if (!dnLenBytes || dnLenBytes.length < 4) {
        conn.Close();
        Export("error:no_dn_length");
      }

      let dnLen = (dnLenBytes[0] << 24) | (dnLenBytes[1] << 16) | (dnLenBytes[2] << 8) | dnLenBytes[3];

      if (dnLen <= 0 || dnLen > 1024) {
        conn.Close();
        Export("error:invalid_dn_len_" + dnLen);
      }

      let dnData = conn.RecvFull(dnLen);
      if (!dnData || dnData.length < dnLen) {
        conn.Close();
        Export("error:short_dn_data");
      }

      let dnStr = "";
      for (let i = 0; i < dnData.length; i++) {
        if (dnData[i] !== 0) {
          dnStr += String.fromCharCode(dnData[i]);
        }
      }

      let capsInfo = "";
      try {
        let countBytes = conn.RecvFull(4);
        if (countBytes && countBytes.length >= 4) {
          let capCount = (countBytes[0] << 24) | (countBytes[1] << 16) | (countBytes[2] << 8) | countBytes[3];
          if (capCount > 0 && capCount <= 20) {
            let caps = [];
            for (let i = 0; i < capCount; i++) {
              try {
                let capLenBytes = conn.RecvFull(4);
                if (!capLenBytes || capLenBytes.length < 4) break;
                let capLen = (capLenBytes[0] << 24) | (capLenBytes[1] << 16) | (capLenBytes[2] << 8) | capLenBytes[3];
                if (capLen <= 0 || capLen > 256) break;
                let capData = conn.RecvFull(capLen);
                if (!capData) break;
                let capStr = "";
                for (let j = 0; j < capData.length; j++) {
                  if (capData[j] > 31 && capData[j] < 127) {
                    capStr += String.fromCharCode(capData[j]);
                  }
                }
                if (capStr.length > 0) caps.push(capStr);
              } catch(e) { break; }
            }
            if (caps.length > 0) {
              capsInfo = " caps=" + caps.join(",");
            }
          }
        }
      } catch(e) {
      }
      conn.Close();
      Export("sic_dn=" + dnStr + capsInfo);

    args:
      Host: "{{Host}}"
      CpmiPort: "18190"

    matchers-condition: and
    matchers:
      - type: dsl
        dsl:
          - "success == true"
          - 'contains(response, "cn=cp_mgmt")'
        condition: and

    extractors:
      - type: regex
        name: sic-dn
        regex:
          - 'sic_dn=([^\s]+)'
        group: 1
# digest: 490a0046304402205a8a22e0d63ea239d2c511ff103ceceda52a994f0b2f085cb72a7ce567a4eff102200c5e9e1dc62e9e1fa57e709ba9e3b7cb1b0fbd3e73be8607cd5f2a74270d5e37:922c64590222798bb761d5b6d8e72950