Detection rules › Splunk

Multiple Archive Files Http Post Traffic

Status
production
Severity
medium
Group by
archive_hdr1, archive_hdr2, bytes_in, bytes_out, dest_ip, http_method, http_user_agent, src_ip, uri_path, url
Author
Teoderick Contreras, Splunk
Source
github.com/splunk/security_content

The following analytic detects the high-frequency exfiltration of archive files via HTTP POST requests. It leverages HTTP stream logs to identify specific archive file headers within the request body. This activity is significant as it often indicates data exfiltration by APTs or trojan spyware after data collection. If confirmed malicious, this behavior could lead to the unauthorized transfer of sensitive data to an attacker’s command and control server, potentially resulting in severe data breaches and loss of confidential information.

Known false positives

  • Normal archive transfer via HTTP protocol may trip this detection.

MITRE ATT&CK coverage

Rule body

name: Multiple Archive Files Http Post Traffic
id: 4477f3ea-a28f-11eb-b762-acde48001122
version: 13
creation_date: '2021-04-22'
modification_date: '2026-05-13'
author: Teoderick Contreras, Splunk
status: production
type: TTP
description: The following analytic detects the high-frequency exfiltration of archive files via HTTP POST requests. It leverages HTTP stream logs to identify specific archive file headers within the request body. This activity is significant as it often indicates data exfiltration by APTs or trojan spyware after data collection. If confirmed malicious, this behavior could lead to the unauthorized transfer of sensitive data to an attacker’s command and control server, potentially resulting in severe data breaches and loss of confidential information.
data_source:
    - Splunk Stream HTTP
search: |-
    `stream_http` http_method=POST
      | eval archive_hdr1=substr(form_data,1,2)
      | eval archive_hdr2 = substr(form_data,1,4)
      | stats values(form_data) as http_request_body min(_time) as firstTime max(_time) as lastTime count
        BY src_ip dest_ip http_method
           http_user_agent uri_path url
           bytes_in bytes_out archive_hdr1
           archive_hdr2
      | where count >20 AND (archive_hdr1 = "7z" OR archive_hdr1 = "PK" OR archive_hdr2="Rar!")
      | `security_content_ctime(firstTime)`
      | `security_content_ctime(lastTime)`
      | `multiple_archive_files_http_post_traffic_filter`
how_to_implement: To successfully implement this search, you need to be ingesting logs with the stream HTTP logs or network logs that catch network traffic. Make sure that the http-request-body, payload, or request field is enabled in stream http configuration.
known_false_positives: Normal archive transfer via HTTP protocol may trip this detection.
references:
    - https://attack.mitre.org/techniques/T1560/001/
    - https://www.mandiant.com/resources/apt39-iranian-cyber-espionage-group-focused-on-personal-information
    - https://www.microsoft.com/security/blog/2021/01/20/deep-dive-into-the-solorigate-second-stage-activation-from-sunburst-to-teardrop-and-raindrop/
finding:
    title: A http post $http_method$ sending packet with possible archive bytes header in uri path $uri_path$
    entity:
        field: src_ip
        type: system
        score: 50
threat_objects:
    - field: url
      type: url
analytic_story:
    - Data Exfiltration
    - Command And Control
    - APT37 Rustonotto and FadeStealer
    - Hellcat Ransomware
asset_type: Endpoint
mitre_attack_id:
    - T1048.003
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: web
security_domain: network

Stages and Predicates

Stage 1: search

`stream_http` http_method=POST

Stage 2: eval

| eval archive_hdr1=substr(form_data,1,2)

Stage 3: eval

| eval archive_hdr2 = substr(form_data,1,4)

Stage 4: stats

| stats values(form_data) as http_request_body min(_time) as firstTime max(_time) as lastTime count
    BY src_ip dest_ip http_method
       http_user_agent uri_path url
       bytes_in bytes_out archive_hdr1
       archive_hdr2

Stage 5: where

| where count >20 AND (archive_hdr1 = "7z" OR archive_hdr1 = "PK" OR archive_hdr2="Rar!")

Stage 6: search

| `security_content_ctime(firstTime)`

Stage 7: search

| `security_content_ctime(lastTime)`

Stage 8: search

| `multiple_archive_files_http_post_traffic_filter`

Indicators

These rows show field, operator, and value matches.