Detection rules › Splunk

JetBrains TeamCity Limited Auth Bypass Suricata CVE-2024-27199

Status
production
Severity
medium
Group by
"http.status", "http.url", dest, http_method, http_user_agent, src
Author
Michael Haag, Splunk
Source
github.com/splunk/security_content

The following analytic identifies attempts to exploit CVE-2024-27199, a critical vulnerability in JetBrains TeamCity web server, allowing unauthenticated access to specific endpoints. It detects unusual access patterns to vulnerable paths such as /res/, /update/, and /.well-known/acme-challenge/ by monitoring HTTP traffic logs via Suricata. This activity is significant as it could indicate an attacker bypassing authentication to access or modify system settings. If confirmed malicious, this could lead to unauthorized changes, disclosure of sensitive information, or uploading of malicious certificates, severely compromising the server's security.

Known false positives

  • False positives are not expected, however, monitor, filter, and tune as needed based on organization log sources. The analytic is restricted to 200 and GET requests to specific URI paths, which should limit false positives.

MITRE ATT&CK coverage

TacticTechniques
Initial Access

Rule body

name: JetBrains TeamCity Limited Auth Bypass Suricata CVE-2024-27199
id: a1e68dcd-2e24-4434-bd0e-b3d4de139d58
version: 9
creation_date: '2024-03-06'
modification_date: '2026-05-13'
author: Michael Haag, Splunk
status: production
type: TTP
description: The following analytic identifies attempts to exploit CVE-2024-27199, a critical vulnerability in JetBrains TeamCity web server, allowing unauthenticated access to specific endpoints. It detects unusual access patterns to vulnerable paths such as /res/, /update/, and /.well-known/acme-challenge/ by monitoring HTTP traffic logs via Suricata. This activity is significant as it could indicate an attacker bypassing authentication to access or modify system settings. If confirmed malicious, this could lead to unauthorized changes, disclosure of sensitive information, or uploading of malicious certificates, severely compromising the server's security.
data_source:
    - Suricata
search: |-
    `suricata` http.url IN ("*../admin/diagnostic.jsp*", "*../app/https/settings/*", "*../app/pipeline*", "*../app/oauth/space/createBuild.html*", "*../res/*", "*../update/*", "*../.well-known/acme-challenge/*", "*../app/availableRunners*", "*../app/https/settings/setPort*", "*../app/https/settings/certificateInfo*", "*../app/https/settings/defaultHttpsPort*", "*../app/https/settings/fetchFromAcme*", "*../app/https/settings/removeCertificate*", "*../app/https/settings/uploadCertificate*", "*../app/https/settings/termsOfService*", "*../app/https/settings/triggerAcmeChallenge*", "*../app/https/settings/cancelAcmeChallenge*", "*../app/https/settings/getAcmeOrder*", "*../app/https/settings/setRedirectStrategy*") http.status=200 http_method=GET
      | stats count min(_time) as firstTime max(_time) as lastTime
        BY src, dest, http_user_agent,
           http.url, http.status, http_method
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `jetbrains_teamcity_limited_auth_bypass_suricata_cve_2024_27199_filter`
how_to_implement: The following detection relies on the Suricata TA and ensuring it is properly configured to monitor HTTP traffic. Modify the query for your environment and log sources as needed.
known_false_positives: False positives are not expected, however, monitor, filter, and tune as needed based on organization log sources. The analytic is restricted to 200 and GET requests to specific URI paths, which should limit false positives.
references:
    - https://github.com/projectdiscovery/nuclei-templates/blob/f644ec82dfe018890c6aa308967424d26c0f1522/http/cves/2024/CVE-2024-27199.yaml
    - https://www.rapid7.com/blog/post/2024/03/04/etr-cve-2024-27198-and-cve-2024-27199-jetbrains-teamcity-multiple-authentication-bypass-vulnerabilities-fixed/
    - https://blog.jetbrains.com/teamcity/2024/03/teamcity-2023-11-4-is-out/
    - https://blog.jetbrains.com/teamcity/2024/03/additional-critical-security-issues-affecting-teamcity-on-premises-cve-2024-27198-and-cve-2024-27199-update-to-2023-11-4-now/
finding:
    title: Possible JetBrains TeamCity Limited Authentication Bypass Attempt against $dest$ from $src$.
    entity:
        field: dest
        type: system
        score: 50
threat_objects:
    - field: src
      type: ip_address
analytic_story:
    - JetBrains TeamCity Vulnerabilities
asset_type: Web Server
cve:
    - CVE-2024-27199
mitre_attack_id:
    - T1190
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: web
security_domain: network

Stages and Predicates

Stage 1: search

`suricata` http.url IN ("*../admin/diagnostic.jsp*", "*../app/https/settings/*", "*../app/pipeline*", "*../app/oauth/space/createBuild.html*", "*../res/*", "*../update/*", "*../.well-known/acme-challenge/*", "*../app/availableRunners*", "*../app/https/settings/setPort*", "*../app/https/settings/certificateInfo*", "*../app/https/settings/defaultHttpsPort*", "*../app/https/settings/fetchFromAcme*", "*../app/https/settings/removeCertificate*", "*../app/https/settings/uploadCertificate*", "*../app/https/settings/termsOfService*", "*../app/https/settings/triggerAcmeChallenge*", "*../app/https/settings/cancelAcmeChallenge*", "*../app/https/settings/getAcmeOrder*", "*../app/https/settings/setRedirectStrategy*") http.status=200 http_method=GET

Stage 2: stats

| stats count min(_time) as firstTime max(_time) as lastTime
    BY src, dest, http_user_agent,
       http.url, http.status, http_method

Stage 3: search

| `security_content_ctime(firstTime)`

Stage 4: search

| `security_content_ctime(lastTime)`

Stage 5: search

| `jetbrains_teamcity_limited_auth_bypass_suricata_cve_2024_27199_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
http.statuseq
  • 200
field:"http.status" kind:eq value:"200"
http.urlin
  • "*../.well-known/acme-challenge/*"
  • "*../admin/diagnostic.jsp*"
  • "*../app/availableRunners*"
  • "*../app/https/settings/*"
  • "*../app/https/settings/cancelAcmeChallenge*"
  • "*../app/https/settings/certificateInfo*"
  • "*../app/https/settings/defaultHttpsPort*"
  • "*../app/https/settings/fetchFromAcme*"
  • "*../app/https/settings/getAcmeOrder*"
  • "*../app/https/settings/removeCertificate*"
  • "*../app/https/settings/setPort*"
  • "*../app/https/settings/setRedirectStrategy*"
  • "*../app/https/settings/termsOfService*"
  • "*../app/https/settings/triggerAcmeChallenge*"
  • "*../app/https/settings/uploadCertificate*"
  • "*../app/oauth/space/createBuild.html*"
  • "*../app/pipeline*"
  • "*../res/*"
  • "*../update/*"
field:"http.url" kind:in
http_methodeq
  • GET
field:"http_method" kind:eq value:"GET"
sourcetypeeq
  • suricata
field:"sourcetype" kind:eq value:"suricata"