3. Query Threat Response

3.1. Get Verdicts for an Observable

3.1.1. Extract Observables

Note

This step can be skipped if the observable type is known and can be mapped to the supported observables so you can build your own payload.

Extract observables using:

POST /iroh/iroh-inspect/inspect

3.1.2. Extract Observables API Example

API Endpoint Definition:

http

POST https://visibility.amp.cisco.com/iroh/iroh-inspect/inspect HTTP/1.1
Authorization: Bearer ${jwt}
Content-Type: application/json

{
    "content": "cisco.com"
}

JSON Response:

[
  {
    "value": "cisco.com",
    "type": "domain"
  }
]

3.1.3. Deliberate Observables

Pass the returned array to:

POST /iroh/iroh-enrich/deliberate/observables

3.1.4. Deliberate Observables API Example

API Endpoint Definition:

http

POST https://visibility.amp.cisco.com/iroh/iroh-enrich/deliberate/observables HTTP/1.1
Authorization: Bearer ${jwt}
Content-Type: application/json

[
    {
        "value": "cisco.com",
        "type": "domain"
    }
]

JSON Response:

{
  "data": [
    {
      "module": "Talos Intelligence",
      "module-type": "SenderBaseInvestigateModule",
      "data": {
        "verdicts": {
          "count": 1,
          "docs": [
            {
              "type": "verdict",
              "disposition": 1,
              "observable": {
                "value": "cisco.com",
                "type": "domain"
              },
              "disposition_name": "Clean",
              "valid_time": {
                "start_time": "2020-04-28T21:55:32.572Z",
                "end_time": "2020-05-28T21:55:32.572Z"
              }
            }
          ]
        }
      }
    },
    {
      "module": "AMP File Reputation",
      "module-type": "POKEDeliberateModule",
      "data": {
        "verdicts": {
          "count": 0,
          "docs": []
        }
      }
    }
  ]
}

JQ Filters for commonly used values:

  • .data[].module
  • .data[].data.verdicts.docs[].observable.value
  • .data[].data.verdicts.docs[].disposition or .data[].data.verdicts.docs[].disposition_name

Note

Disposition mapping: {1 “Clean”, 2 “Malicious”, 3 “Suspicious”, 4 “Common”, 5 “Unknown”}

JQ Filters for occasionally used values:

  • .data[].data.verdicts.docs[].valid_time.start_time
  • .data[].data.verdicts.docs[].valid_time.end_time

Entities that may be returned:

3.1.5. Use Cases

  • There are a high number of observables
  • Only verdicts are desired
  • To reduce the number of observables
  • The goal is to indicate which items merit looking into further

3.2. Contextualize an Observable

3.2.1. Extract Observables

Note

This step can be skipped if the observable type is known and can be mapped to the supported observables so you can build your own payload.

Extract observables using:

POST /iroh/iroh-inspect/inspect

3.2.2. Extract Observables API Example

API Endpoint Definition:

http

POST https://visibility.amp.cisco.com/iroh/iroh-inspect/inspect HTTP/1.1
Authorization: Bearer ${jwt}
Content-Type: application/json

{
    "content": "cisco.com"
}

JSON Response:

[
  {
    "value": "cisco.com",
    "type": "domain"
  }
]

3.2.3. Observe Observables

Pass the returned array to:

POST /iroh/iroh-enrich/observe/observables

3.2.4. Observe Observables API Example

API Endpoint Definition:

http

POST https://visibility.amp.cisco.com/iroh/iroh-enrich/observe/observables HTTP/1.1
Authorization: Bearer ${jwt}
Content-Type: application/json

[
  {
    "value": "cisco.com",
    "type": "domain"
  }
]

JSON Response:

{
  "data": [
    {
      "module": "Talos Intelligence",
      "module-type": "SenderBaseInvestigateModule",
      "data": {
        "verdicts": {
          "count": 1,
          "docs": [
            {
              "type": "verdict",
              "disposition": 1,
              "observable": {
                "value": "cisco.com",
                "type": "domain"
              },
              "judgement_id": "transient:f7e85f0e-2886-479c-baa4-6deb84f9bbf7",
              "disposition_name": "Clean",
              "valid_time": {
                "start_time": "2020-04-28T21:58:56.926Z",
                "end_time": "2020-05-28T21:58:56.926Z"
              }
            }
          ]
        },
        "judgements": {
          "count": 1,
          "docs": [
            {
              "valid_time": {
                "start_time": "2020-04-28T21:58:56.926Z",
                "end_time": "2020-05-28T21:58:56.926Z"
              },
              "schema_version": "1.0.16",
              "observable": {
                "value": "cisco.com",
                "type": "domain"
              },
              "type": "judgement",
              "source": "Talos Intelligence",
              "disposition": 1,
              "reason": "Good Talos Intelligence reputation score",
              "source_uri": "https://www.talosintelligence.com/reputation_center/lookup?search=cisco.com",
              "disposition_name": "Clean",
              "priority": 90,
              "id": "transient:f7e85f0e-2886-479c-baa4-6deb84f9bbf7",
              "severity": "None",
              "tlp": "white",
              "confidence": "High"
            }
          ]
        }
      }
    }
  ]
}

This returns the .data[].module and other pieces of data depending on the use case.

Mapping observables to some objects (attack_patterns) requires looking at the relationships and matching the IDs.

May return any of the CTIM entities:

Most commonly used entities:

  • Verdicts
  • Sightings
  • Indicators
  • Judgements

Note

Targets are found within the Sightings entity

3.2.5. Are there targets in “my” environment?

Return the .data[].data.sightings.docs[]?.targets and compare returned objects and deduplicate to get a true unique value. The same target can be observed for multiple observables .data[].data.sightings.docs[]?.observables.

3.2.6. Use Cases

  • Check for targets from within the returned sightings
  • Contextualize an observable as it relates to the Global and Private Threat Intel
  • Historical Incidents an Observable has been related to with
  • Identify what Campaign(s) an Observable has been used in
  • Find Indicators associated with an Observable
  • Discover Observed Relations for an Observable
    • URLs hosted on a Domain
    • IP Addresses a Domain has resolved to
    • File Names associated with a File Hash
    • File Paths associated with a File Hash
    • Mutexes associated with a File Hash
    • URLs a File Hash was downloaded from