← All hunts high TLP:CLEAR Part 2 of 2

Storm-3358: ARTEX AI Abuse and Cloud API Exploitation

An adversary is using an agentic AI framework to perform rapid-fire credential spraying and API enumeration, leading to lateral movement via RDP and data exfiltration from compromised cloud identities.

Based on research by Microsoft 2026-11-07 12 steps · 5 queries T1021.001 T1041 T1059 T1071 T1078 T1110 T1110.003

Brief

Background

Microsoft recently detailed how Storm-3358 expands its operations into the financial sector in the article ARTEX abuse expands as cybercriminals target financial sector (https://www.microsoft.com/en-us/security/blog/2026/11/06/artex-abuse-expands-as-cybercriminals-target-financial-sector/). This adversary uses agentic AI frameworks like ARTEX to automate exploitation and discovery. This automation significantly increases the speed of the attack lifecycle. This hunt provides a behavioral framework to detect these machine-speed operations.

Hunt Flow

The hunt begins by narrowing the attack surface. It uses the hb_software_inventory surface to identify hosts running web server software like Apache, Nginx, or IIS. Since the adversary often targets these web-facing assets for initial entry, these hosts become the focal point for subsequent lateral movement analysis. The hunt next looks for automated access patterns. It runs parallel queries against hb_auth_signin and hb_cloud_api_activity to find credential spraying and high-velocity API discovery. It identifies accounts attempting to log in across many users or principals executing more than ten unique API operations in a short window. These patterns distinguish ARTEX agents from human administrators. Once an analyst triages these high-risk accounts, the hunt pivots to internal movement. It examines hb_auth_signin for successful Remote Interactive (RDP) logons involving those specific accounts. This step verifies if the automated discovery led to actual lateral traversal within the network. Finally, the hunt checks hb_network_connection for outbound traffic. It matches destination IPs against known Storm-3358 C2 infrastructure and flags high-volume data transfers. The final phase requires an analyst to correlate the discovery, movement, and network signals to confirm the intrusion lifecycle.

Blind Spots

This hunt relies heavily on verbose logging. If an organization does not log cloud data events, the hunt might miss the specific resources exfiltrated from S3 buckets or RDS instances. Additionally, if the adversary uses internal jump boxes or proxies, the source IP in RDP sign-in telemetry might represent the proxy rather than the true origin of the attack.

Steps

  1. Identify candidate web servers

    Query · scoping

    Focus the hunt on hosts running common web server software that ARTEX targets for initial exploitation.

    reads hb_software_inventorysql
    SELECT device_hostname, package_name, package_version FROM hb_software_inventory WHERE (LOWER(package_name) LIKE '%apache%' OR LOWER(package_name) LIKE '%nginx%' OR LOWER(package_name) LIKE '%httpd%' OR LOWER(package_name) LIKE '%iis%') AND (asset_scope = 'endpoint' OR asset_scope IS NULL)

    What a hit looks like. A list of hostnames running web server software. This defines the primary attack surface.

  2. High-volume credential spray

    Query · baseline

    Detect sources attempting to authenticate against multiple accounts in a short window.

    reads hb_auth_signinsql
    SELECT src_endpoint_ip, COUNT(DISTINCT actor_user_name) AS user_count, COUNT(*) AS attempts, MIN(time) AS first_attempt, MAX(time) AS last_attempt FROM hb_auth_signin WHERE status_id = 2 AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY src_endpoint_ip HAVING user_count > 5 ORDER BY user_count DESC

    What a hit looks like. IP addresses attempting to log in as many different users. Genuine sprays often exceed 10 users per IP.

  3. Agentic API enumeration

    Query · detection candidate

    Detect machine-speed API discovery typical of frameworks like ARTEX.

    reads hb_cloud_api_activitysql
    SELECT actor_user_name, src_endpoint_ip, api_service_name, COUNT(DISTINCT api_operation) AS unique_ops, COUNT(*) AS call_count FROM hb_cloud_api_activity WHERE time >= datetime('now', '-{{lookback_days}} days') GROUP BY actor_user_name, src_endpoint_ip, api_service_name HAVING unique_ops > 10 AND call_count > 50 ORDER BY unique_ops DESC

    What a hit looks like. Single principals executing a wide variety of API operations in a single service, indicating discovery of environment resources.

  4. Triage initial access attempts

    Agent triage

    Identify specific users or source IPs that are highly likely to be ARTEX agents.

  5. Lateral movement via RDP

    Query · enrichment

    Find successful RDP sessions targeting the scoped hosts or using compromised credentials.

    reads hb_auth_signinsql
    SELECT dst_endpoint_hostname, actor_user_name, src_endpoint_ip, logon_type, time FROM hb_auth_signin WHERE logon_type = 'Remote Interactive' AND status_id = 1 AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || dst_endpoint_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days') ORDER BY time DESC

    What a hit looks like. RDP logons involving users identified in the previous triage or originating from suspicious internal/external IPs.

  6. C2 and exfiltration traffic

    Query · triage

    Identify traffic to known Storm-3358 infrastructure or large outbound data transfers.

    reads hb_network_connectionsql
    SELECT device_hostname, dst_endpoint_ip, dst_endpoint_port, SUM(traffic_bytes) AS total_outbound, COUNT(*) AS connection_count FROM hb_network_connection WHERE direction = 'outbound' AND (instr(',' || '{{ioc_ips}}' || ',', ',' || dst_endpoint_ip || ',') > 0 OR traffic_bytes > 50000000) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY device_hostname, dst_endpoint_ip, dst_endpoint_port ORDER BY total_outbound DESC

    What a hit looks like. Connections to specific ARTEX or WISP C2 nodes, or high-volume transfers to any destination.

  7. Correlate intrusion lifecycle

    Agent triage

    Establish the link between initial discovery and follow-on lateral movement or exfiltration.

  8. Route on verdict

    Decision

    Decide whether to proceed with containment based on the agent's correlation.

  9. Revoke and isolate

    Response action

    Immediately stop the actor's ability to move laterally or exfiltrate data.

  10. Full incident review

    Analyst task

    Verify the findings and prepare for follow-on remediation.

  11. Close out hunt

    Analyst task

    Document findings and tune future detections.

Coverage

Scenario coverage

StageCoveredHow, or why not
Credential Spraying and Brute Force
T1110.003 · T1110
Yes password-spray-detection
API Enumeration and Cloud Abuse
T1059
Yes api-enumeration-discovery
Lateral Movement via RDP
T1021.001 · T1078
Yes rdp-lateral-movement
C2 and Exfiltration
T1071 · T1041
Yes c2-exfiltration-traffic
Autonomous Vulnerability Scanning
T1190
Out of scope Belongs to another part of the 'ARTEX abuse expands as cybercriminals target financial sector' series.
Automated Payload Delivery
T1059
Out of scope Belongs to another part of the 'ARTEX abuse expands as cybercriminals target financial sector' series.
Persistence via Webshells and RATs
T1505.003
Out of scope Belongs to another part of the 'ARTEX abuse expands as cybercriminals target financial sector' series.

Blind spots

  • Needs Verbose CloudTrail or Entra ID Audit logging. If only management events are logged and not data events, the full extent of database dumping may be missed. It would answer Which specific resources were enumerated via API?. Remediation: Enable Data Events for sensitive S3 buckets and RDS instances.
  • Needs hb_auth_signin with full src_endpoint_ip context. If the source IP is masked by a proxy or jump box, the true origin of the lateral movement is obscured. It would answer Did the actor connect via an internal jump box?. Remediation: Ensure RDP gateway logs are integrated with sign-in telemetry.

Parameters & data

Parameters

ParameterTypeDefaultWhat it is
ioc_ipslist[ip]199.19.95.66, 199.19.95.67, 199.19.95.68, 91.92.240.238, 85.11.168.45, 178.15.54.129, 31.77.229.35, 85.11.167.52, 178.16.54.129Observed ARTEX and WISP C2 nodes from the report.
lookback_daysnumber14Days of historical data to examine.
scope_hostslist[host]—Optional list of hostnames to focus the lateral movement and exfiltration steps.

Telemetry

SourceCategoryTelemetry
Endpoint telemetry (hb_ surfaces)endpointendpoint
Identity / sign-in telemetryidentityidentity
Network telemetrynetworknetwork

Source

Download hunt.md Definition (JSON) An open hunt.md file; it runs anywhere that reads the format.
---
analysis: A single rule for API enumeration is prone to noise from developers; this
  hunt pivots from credential spray signals to API discovery, and finally to confirmed
  RDP movement and C2 traffic, providing the context an analyst needs to differentiate
  AI-driven attacks from normal operations.
blind_spots:
- id: limited-cloud-api-logging
  owner: Cloud Engineering
  question: Which specific resources were enumerated via API?
  remediation: Enable Data Events for sensitive S3 buckets and RDS instances.
  requires: Verbose CloudTrail or Entra ID Audit logging
  risk: If only management events are logged and not data events, the full extent
    of database dumping may be missed.
  stage: api-enumeration-and-cloud-abuse
- id: rdp-client-isolation
  owner: Identity Team
  question: Did the actor connect via an internal jump box?
  remediation: Ensure RDP gateway logs are integrated with sign-in telemetry.
  requires: hb_auth_signin with full src_endpoint_ip context
  risk: If the source IP is masked by a proxy or jump box, the true origin of the
    lateral movement is obscured.
  stage: lateral-movement-via-rdp
coverage:
- stage: credential-spraying-and-brute-force
  status: covered
  steps:
  - password-spray-detection
- stage: api-enumeration-and-cloud-abuse
  status: covered
  steps:
  - api-enumeration-discovery
- stage: lateral-movement-via-rdp
  status: covered
  steps:
  - rdp-lateral-movement
- stage: c2-and-exfiltration
  status: covered
  steps:
  - c2-exfiltration-traffic
- reason: Belongs to another part of the 'ARTEX abuse expands as cybercriminals target
    financial sector' series.
  stage: autonomous-vulnerability-scanning
  status: out_of_scope
- reason: Belongs to another part of the 'ARTEX abuse expands as cybercriminals target
    financial sector' series.
  stage: automated-payload-delivery
  status: out_of_scope
- reason: Belongs to another part of the 'ARTEX abuse expands as cybercriminals target
    financial sector' series.
  stage: persistence-via-webshells-and-rats
  status: out_of_scope
guardrails:
  claims: no_unsupported
  evidence: citation_required
  missing_data: not_benign
  telemetry: untrusted
hunt:
  applicability: campaign-specific
  handoff: promote-to-detection
  justification: Agentic AI frameworks like ARTEX operate at machine speed, making
    traditional detection rules brittle. This hunt identifies the behavioral markers
    of automated abuse across the identity and cloud planes, providing a high-confidence
    negative result over the estate.
  methodology: model-assisted
  trigger: intel-report
hypothesis: An adversary is using an agentic AI framework to perform rapid-fire credential
  spraying and API enumeration, leading to lateral movement via RDP and data exfiltration
  from compromised cloud identities.
labels:
- hunt
- attack.t1110.003
- attack.t1110
- attack.t1059
- attack.t1021.001
- attack.t1078
- attack.t1071
- attack.t1041
- command and control
- credential access
- discovery
- execution
- initial access
- lateral movement
- persistence
name: 'Storm-3358: ARTEX AI Abuse and Cloud API Exploitation'
parameters:
  ioc_ips:
    default:
    - 199.19.95.66
    - 199.19.95.67
    - 199.19.95.68
    - 91.92.240.238
    - 85.11.168.45
    - 178.15.54.129
    - 31.77.229.35
    - 85.11.167.52
    - 178.16.54.129
    description: Observed ARTEX and WISP C2 nodes from the report.
    from:
      kind: article
      observed: '2026-11-06'
      ref: https://www.microsoft.com/en-us/security/blog/2026/11/06/artex-abuse-expands-as-cybercriminals-target-financial-sector/
    type: list[ip]
  lookback_days:
    default: '14'
    description: Days of historical data to examine.
    type: number
  scope_hosts:
    default: []
    description: Optional list of hostnames to focus the lateral movement and exfiltration
      steps.
    type: list[host]
provenance:
  authors:
  - name: Huntbase hunt generation
    org: huntbase.io
  generated:
    by: huntbase-hunt-generation
    from: https://www.microsoft.com/en-us/security/blog/2026/11/06/artex-abuse-expands-as-cybercriminals-target-financial-sector/
    gates:
    - dry-run
    - lint
    - critic
    model: hb_google/gemini-3-flash-preview
rationale: The hunt focuses on web servers as the initial entry point and then expands
  to all identity and network logs. If internal RDP traffic is high, filter by source
  IPs identified in the password-spraying step.
references:
- name: "MSRC Blog \u2014 ARTEX abuse expands as cybercriminals target financial sector"
  url: https://www.microsoft.com/en-us/security/blog/2026/11/06/artex-abuse-expands-as-cybercriminals-target-financial-sector/
related:
- hunt: storm-3358-initial-access-and-persistence
  reason: This hunt focuses on post-compromise identity abuse; the sibling hunt covers
    the initial web exploitation and RAT delivery.
  relation: follows
scenario:
  stages:
  - name: Autonomous Vulnerability Scanning
    observables:
    - Nmap
    - headless Chromium
    - Playwright
    - Norma SDK WebFetch
    - SSRF
    - anonymous file upload
    - high-frequency requests
    slug: autonomous-vulnerability-scanning
    tactic: initial-access
    techniques:
    - T1190
  - name: Automated Payload Delivery
    observables:
    - curl
    - wget
    - netcat
    - Python HTTP clients
    - 199.19.95.66
    - 91.92.240.238
    slug: automated-payload-delivery
    tactic: execution
    techniques:
    - T1059
  - name: Persistence via Webshells and RATs
    observables:
    - WISP
    - vshell
    - AdaptixC2
    - web shells
    slug: persistence-via-webshells-and-rats
    tactic: persistence
    techniques:
    - T1505.003
  - name: Credential Spraying and Brute Force
    observables:
    - password spraying
    - brute-force login attempts
    - machine-speed sign-ins
    slug: credential-spraying-and-brute-force
    tactic: credential-access
    techniques:
    - T1110.003
    - T1110
  - name: API Enumeration and Cloud Abuse
    observables:
    - API enumeration
    - cloud identity abuse
    - database dumping
    slug: api-enumeration-and-cloud-abuse
    tactic: discovery
    techniques:
    - T1059
  - name: Lateral Movement via RDP
    observables:
    - RDP sessions
    - compromised cloud identities
    slug: lateral-movement-via-rdp
    tactic: lateral-movement
    techniques:
    - T1021.001
    - T1078
  - name: C2 and Exfiltration
    observables:
    - 199.19.95.66
    - 199.19.95.67
    - 199.19.95.68
    - 85.11.167.52
    - exfiltration over C2
    slug: c2-and-exfiltration
    tactic: command-and-control
    techniques:
    - T1071
    - T1041
  summary: Storm-3358, a Cambodia-based actor, uses the ARTEX agentic AI framework
    to automate web vulnerability scanning and exploitation (SSRF, file upload) at
    machine speed. The actor leverages common tools like curl and netcat to deploy
    open-source RATs (WISP, vshell) before pivoting to cloud identity abuse and RDP
    for lateral movement and exfiltration.
series:
  index: 2
  slug: artex-abuse-expands-as-cybercriminals-target-financial-sector
  title: ARTEX abuse expands as cybercriminals target financial sector
  total: 2
severity: high
targets:
  analyst:
    name: Tier-2 analyst
    role: analyst
  endpoint:
    category: endpoint
    name: Endpoint telemetry (hb_ surfaces)
    telemetry:
    - endpoint
  hunter:
    agent: true
    name: Hunt agent
  identity:
    category: identity
    name: Identity / sign-in telemetry
    telemetry:
    - identity
  network:
    category: network
    name: Network telemetry
    telemetry:
    - network
tlp: clear
type: investigation
---


# Storm-3358: ARTEX AI Abuse and Cloud API Exploitation

This hunt targets the identity and cloud-abuse phases of Storm-3358 activity. It identifies automated brute-force and password-spraying attempts against Entra ID and local resources, followed by high-velocity API discovery patterns characteristic of agentic AI frameworks like ARTEX. The hunt then pivots to find evidence of lateral movement via RDP using compromised accounts and matches outbound network traffic against known C2 infrastructure or unusual exfiltration volumes.

## scope-web-assets
<!-- Identify candidate web servers -->
Focus the hunt on hosts running common web server software that ARTEX targets for initial exploitation.

```sqlite target=endpoint role=scoping
~~~yaml
expected: A list of hostnames running web server software. This defines the primary
  attack surface.
reads:
- asset_scope
- device_hostname
- package_name
- package_version
silence: not_evidence_of_absence
source: hb_software_inventory
verified: dry-run
verified_at: '2026-11-07'
~~~
SELECT device_hostname, package_name, package_version FROM hb_software_inventory WHERE (LOWER(package_name) LIKE '%apache%' OR LOWER(package_name) LIKE '%nginx%' OR LOWER(package_name) LIKE '%httpd%' OR LOWER(package_name) LIKE '%iis%') AND (asset_scope = 'endpoint' OR asset_scope IS NULL)
```

## early-stage-activity
<!-- Hunt for automated access and discovery -->
parallel:
- → password-spray-detection
- → api-enumeration-discovery
join: → triage-initial-access

## password-spray-detection
<!-- High-volume credential spray -->
Detect sources attempting to authenticate against multiple accounts in a short window.

```sqlite target=identity role=baseline params=(lookback_days=lookback_days)
~~~yaml
baseline:
  compare: new_this_window
  window: '{{lookback_days}}d'
expected: IP addresses attempting to log in as many different users. Genuine sprays
  often exceed 10 users per IP.
prevalence:
  by: actor_user_name
  key:
  - src_endpoint_ip
  rare_below: 2
reads:
- actor_user_name
- src_endpoint_ip
- status_id
- time
silence: not_evidence_of_absence
source: hb_auth_signin
verified: dry-run
verified_at: '2026-11-07'
~~~
SELECT src_endpoint_ip, COUNT(DISTINCT actor_user_name) AS user_count, COUNT(*) AS attempts, MIN(time) AS first_attempt, MAX(time) AS last_attempt FROM hb_auth_signin WHERE status_id = 2 AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY src_endpoint_ip HAVING user_count > 5 ORDER BY user_count DESC
```

## api-enumeration-discovery
<!-- Agentic API enumeration -->
Detect machine-speed API discovery typical of frameworks like ARTEX.

```sqlite target=endpoint role=detection-candidate params=(lookback_days=lookback_days)
~~~yaml
expected: Single principals executing a wide variety of API operations in a single
  service, indicating discovery of environment resources.
reads:
- actor_user_name
- api_operation
- api_service_name
- src_endpoint_ip
- time
silence: not_evidence_of_absence
source: hb_cloud_api_activity
verified: dry-run
verified_at: '2026-11-07'
~~~
SELECT actor_user_name, src_endpoint_ip, api_service_name, COUNT(DISTINCT api_operation) AS unique_ops, COUNT(*) AS call_count FROM hb_cloud_api_activity WHERE time >= datetime('now', '-{{lookback_days}} days') GROUP BY actor_user_name, src_endpoint_ip, api_service_name HAVING unique_ops > 10 AND call_count > 50 ORDER BY unique_ops DESC
```

## triage-initial-access
<!-- Triage initial access attempts -->
```agent target=hunter
cite: required
context:
- password-spray-detection
- api-enumeration-discovery
max_iterations: 3
objective: Determine which source IPs or users are performing automated discovery
  or credential abuse indicative of ARTEX usage.
success_criteria: A list of high-risk principals and source IPs with cited automated
  behavior.
tools:
- endpoint
- identity
- network
```

## follow-on-activity
<!-- Hunt for movement and exfiltration -->
parallel:
- → rdp-lateral-movement
- → c2-exfiltration-traffic
join: → triage-intrusion

## rdp-lateral-movement
<!-- Lateral movement via RDP -->
Find successful RDP sessions targeting the scoped hosts or using compromised credentials.

```sqlite target=identity role=enrichment params=(lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
expected: RDP logons involving users identified in the previous triage or originating
  from suspicious internal/external IPs.
reads:
- actor_user_name
- dst_endpoint_hostname
- logon_type
- src_endpoint_ip
- status_id
- time
silence: not_evidence_of_absence
source: hb_auth_signin
verified: dry-run
verified_at: '2026-11-07'
~~~
SELECT dst_endpoint_hostname, actor_user_name, src_endpoint_ip, logon_type, time FROM hb_auth_signin WHERE logon_type = 'Remote Interactive' AND status_id = 1 AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || dst_endpoint_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days') ORDER BY time DESC
```

## c2-exfiltration-traffic
<!-- C2 and exfiltration traffic -->
Identify traffic to known Storm-3358 infrastructure or large outbound data transfers.

```sqlite target=network role=triage params=(lookback_days=lookback_days, ioc_ips=ioc_ips)
~~~yaml
expected: Connections to specific ARTEX or WISP C2 nodes, or high-volume transfers
  to any destination.
reads:
- device_hostname
- direction
- dst_endpoint_ip
- dst_endpoint_port
- time
- traffic_bytes
silence: not_evidence_of_absence
source: hb_network_connection
verified: dry-run
verified_at: '2026-11-07'
~~~
SELECT device_hostname, dst_endpoint_ip, dst_endpoint_port, SUM(traffic_bytes) AS total_outbound, COUNT(*) AS connection_count FROM hb_network_connection WHERE direction = 'outbound' AND (instr(',' || '{{ioc_ips}}' || ',', ',' || dst_endpoint_ip || ',') > 0 OR traffic_bytes > 50000000) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY device_hostname, dst_endpoint_ip, dst_endpoint_port ORDER BY total_outbound DESC
```

## triage-intrusion
<!-- Correlate intrusion lifecycle -->
```agent target=hunter
cite: required
context:
- triage-initial-access
- rdp-lateral-movement
- c2-exfiltration-traffic
max_iterations: 5
objective: Verify if the initial access indicators from the first agent led to successful
  lateral movement or data exfiltration on the identified hosts.
success_criteria: A per-host verdict linking the automated discovery to specific malicious
  actions.
tools:
- endpoint
- identity
- network
```

## route-verdict
<!-- Route on verdict -->
if~: "The triage-intrusion verdict is malicious for any host or user principal." (confidence: high, judge=hunter)
then: → contain-threat
indeterminate: → analyst-review
unavailable: → analyst-review (blind_spot: limited-cloud-api-logging)
else: → close-out

## contain-threat
<!-- Revoke and isolate -->
```action target=endpoint
~~~yaml
approval: required
~~~
Isolate the identified endpoints and revoke credentials for the compromised user accounts in Entra ID.
```
→ analyst-review

## analyst-review
<!-- Full incident review -->
```manual target=analyst
Review the cited logs for the confirmed malicious activity. Identify any additional API operations or database dumps not captured in the summary queries.
```
→ close-out

## close-out
<!-- Close out hunt -->
```manual target=analyst
Log the IPs and users for future monitoring and refine the API enumeration threshold based on normal administrative activity in the environment.
```
→ end

Run it

Take this hunt into your environment.

Open it in Huntbase to run every step against your own connections, with Scout weighing the evidence and your analysts in command. Or take the open hunt.md file anywhere that reads the format.

Machine-drafted by huntbase-hunt-generation using hb_google/gemini-3-flash-preview, gated by dry-run, lint, critic, then reviewed by a person.

Locked pack

Sign up to unlock

Pack contents are available to Huntbase users.